{"id":9675,"date":"2023-12-26T13:41:37","date_gmt":"2023-12-26T10:11:37","guid":{"rendered":"https:\/\/rasanegar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/"},"modified":"2023-12-26T13:41:37","modified_gmt":"2023-12-26T10:11:37","slug":"%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2","status":"publish","type":"post","link":"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/","title":{"rendered":"\u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062e\u0648\u062f\u0628\u0627\u0632\u06cc \u0631\u0627 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0628\u0627 \u0622\u0645\u0648\u0632\u0634 \u062a\u0642\u0644\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0633\u0631\u0641\u0635\u0644\u0647\u0627\u06cc \u0645\u0637\u0644\u0628<\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%be%db%8c%d8%b4_%d9%86%db%8c%d8%a7%d8%b2%d9%87%d8%a7\" >\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%81%d9%87%d8%b1%d8%b3%d8%aa_%d9%85%d8%b7%d8%a7%d9%84%d8%a8\" >\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d8%a8%d8%ae%d8%b4_1_%da%86%da%af%d9%88%d9%86%d9%87_%db%8c%da%a9_%d9%85%d8%ac%d9%85%d9%88%d8%b9%d9%87_%d8%af%d8%a7%d8%af%d9%87_%d8%aa%d9%88%d9%84%db%8c%d8%af_%da%a9%d9%86%db%8c%d9%85\" >\u0628\u062e\u0634 1: \u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u0645<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%da%86%da%af%d9%88%d9%86%d9%87_stockfish_%d8%b1%d8%a7_%d8%af%d8%a7%d9%86%d9%84%d9%88%d8%af_%da%a9%d9%86%db%8c%d9%85\" >\u0686\u06af\u0648\u0646\u0647 Stockfish \u0631\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0646\u06cc\u0645<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d8%aa%d8%b1%da%a9%db%8c%d8%a8_stockfish_%d8%a8%d8%a7_%d9%be%d8%a7%db%8c%d8%aa%d9%88%d9%86\" >\u0646\u062d\u0648\u0647 \u062a\u0631\u06a9\u06cc\u0628 Stockfish \u0628\u0627 \u067e\u0627\u06cc\u062a\u0648\u0646<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d8%aa%d9%88%d9%84%db%8c%d8%af_%d9%85%d8%ac%d9%85%d9%88%d8%b9%d9%87_%d8%af%d8%a7%d8%af%d9%87\" >\u0646\u062d\u0648\u0647 \u062a\u0648\u0644\u06cc\u062f \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%da%86%da%af%d9%88%d9%86%d9%87_%db%8c%da%a9_%d8%a8%d8%a7%d8%b2%db%8c_%d9%85%d8%a7%db%8c%d9%86_%d8%b4%d8%af%d9%87_%d8%b1%d8%a7_%d8%a8%d8%b1%d8%b1%d8%b3%db%8c_%da%a9%d9%86%db%8c%d9%85\" >\u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u0628\u0627\u0632\u06cc \u0645\u0627\u06cc\u0646 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d8%a8%d8%ae%d8%b4_2_%d9%86%d8%ad%d9%88%d9%87_%d8%b1%d9%85%d8%b2%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d8%af%d8%a7%d8%af%d9%87_%d9%87%d8%a7\" >\u0628\u062e\u0634 2: \u0646\u062d\u0648\u0647 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d9%86%d8%b5%d8%a8_%d9%88_%d9%88%d8%a7%d8%b1%d8%af_%da%a9%d8%b1%d8%af%d9%86_%d8%a8%d8%b3%d8%aa%d9%87_%d9%87%d8%a7\" >\u0646\u062d\u0648\u0647 \u0646\u0635\u0628 \u0648 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0628\u0633\u062a\u0647 \u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%da%a9%d8%af%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d9%85%d9%88%d9%82%d8%b9%db%8c%d8%aa_%d9%87%d8%a7_%d9%88_%d8%ad%d8%b1%da%a9%d8%a7%d8%aa_%d8%aa%d8%ae%d8%aa%d9%87\" >\u0646\u062d\u0648\u0647 \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627 \u0648 \u062d\u0631\u06a9\u0627\u062a \u062a\u062e\u062a\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d8%a7%db%8c%d8%ac%d8%a7%d8%af_%d8%aa%d9%88%d8%a7%d8%a8%d8%b9_%d8%a8%d8%b1%d8%a7%db%8c_%d8%b1%d9%85%d8%b2%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d8%ad%d8%b1%da%a9%d8%a7%d8%aa\" >\u0646\u062d\u0648\u0647 \u0627\u06cc\u062c\u0627\u062f \u062a\u0648\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u062d\u0631\u06a9\u0627\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%da%86%da%af%d9%88%d9%86%d9%87_%db%8c%da%a9_%d8%aa%d8%a7%d8%a8%d8%b9_%d8%a8%d8%b1%d8%a7%db%8c_%d8%b1%d9%85%d8%b2%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d9%85%d9%88%d9%82%d8%b9%db%8c%d8%aa_%d9%87%d8%a7_%d8%a7%db%8c%d8%ac%d8%a7%d8%af_%da%a9%d9%86%db%8c%d9%85\" >\u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d8%ae%d9%88%d8%af%da%a9%d8%a7%d8%b1_%da%a9%d8%b1%d8%af%d9%86_%d8%b1%d9%85%d8%b2%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d8%a8%d8%b1%d8%a7%db%8c_%d8%aa%d9%85%d8%a7%d9%85_%d9%81%d8%a7%db%8c%d9%84_%d9%87%d8%a7%db%8c_%d8%af%d8%a7%d8%af%d9%87_%d8%ae%d8%a7%d9%85\" >\u0646\u062d\u0648\u0647 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0631\u062f\u0646 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u0631\u0627\u06cc \u062a\u0645\u0627\u0645 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u062e\u0627\u0645<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%82%d8%b3%d9%85%d8%aa_3_%da%86%da%af%d9%88%d9%86%d9%87_%d9%85%d8%af%d9%84_%d9%87%d9%88%d8%b4_%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c_%d8%b1%d8%a7_%d8%a2%d9%85%d9%88%d8%b2%d8%b4_%d8%af%d9%87%db%8c%d9%85\" >\u0642\u0633\u0645\u062a 3: \u0686\u06af\u0648\u0646\u0647 \u0645\u062f\u0644 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0631\u0627 \u0622\u0645\u0648\u0632\u0634 \u062f\u0647\u06cc\u0645<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d9%88%d8%a7%d8%b1%d8%af_%da%a9%d8%b1%d8%af%d9%86_%d8%a8%d8%b3%d8%aa%d9%87_%d9%87%d8%a7\" >\u0646\u062d\u0648\u0647 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0628\u0633\u062a\u0647 \u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d9%86%d8%b5%d8%a8_cuda\" >\u0646\u062d\u0648\u0647 \u0646\u0635\u0628 CUDA<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d8%a7%db%8c%d8%ac%d8%a7%d8%af_%d8%b1%d9%88%d8%b4_%d9%87%d8%a7%db%8c_%d8%b1%d9%85%d8%b2%da%af%d8%b0%d8%a7%d8%b1%db%8c\" >\u0646\u062d\u0648\u0647 \u0627\u06cc\u062c\u0627\u062f \u0631\u0648\u0634 \u0647\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d8%a8%d8%a7%d8%b1%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d8%af%d8%a7%d8%af%d9%87_%d9%87%d8%a7\" >\u0646\u062d\u0648\u0647 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d8%aa%d8%b9%d8%b1%db%8c%d9%81_%d9%85%d8%af%d9%84_%db%8c%d8%a7%d8%af%da%af%db%8c%d8%b1%db%8c_%d8%b9%d9%85%db%8c%d9%82\" >\u0646\u062d\u0648\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0645\u062f\u0644 \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u0639\u0645\u06cc\u0642<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%ad%d9%88%d9%87_%d8%a2%d9%85%d9%88%d8%b2%d8%b4_%d9%85%d8%af%d9%84\" >\u0646\u062d\u0648\u0647 \u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%da%86%da%af%d9%88%d9%86%d9%87_%d9%85%d8%af%d9%84_%d8%ae%d9%88%d8%af_%d8%b1%d8%a7_%d8%aa%d8%b3%d8%aa_%da%a9%d9%86%db%8c%d9%85\" >\u0686\u06af\u0648\u0646\u0647 \u0645\u062f\u0644 \u062e\u0648\u062f \u0631\u0627 \u062a\u0633\u062a \u06a9\u0646\u06cc\u0645<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d8%aa%d8%a3%d9%85%d9%84_%d8%af%d8%b1_%d8%b9%d9%85%d9%84%da%a9%d8%b1%d8%af_%d9%85%d9%88%d8%aa%d9%88%d8%b1_%d8%b4%d8%b7%d8%b1%d9%86%d8%ac\" >\u062a\u0623\u0645\u0644 \u062f\u0631 \u0639\u0645\u0644\u06a9\u0631\u062f \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/rasanegaar.com\/blog\/%db%8c%da%a9-%d9%85%d9%88%d8%aa%d9%88%d8%b1-%d8%b4%d8%b7%d8%b1%d9%86%d8%ac-%d9%87%d9%88%d8%b4-%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c-%d8%ae%d9%88%d8%af%d8%a8%d8%a7%d8%b2%db%8c-%d8%b1%d8%a7-%d8%a7%d8%b2\/#%d9%86%d8%aa%db%8c%d8%ac%d9%87\" >\u0646\u062a\u06cc\u062c\u0647<\/a><\/li><\/ul><\/nav><\/div>\n<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">\u0632\u0645\u0627\u0646 \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0645\u0637\u0627\u0644\u0639\u0647: <\/span> <span class=\"rt-time\"> 24<\/span> <span class=\"rt-label rt-postfix\">\u062f\u0642\u06cc\u0642\u0647<\/span><\/span><p> <br \/>\n<\/p>\n<section class=\"post-content \" data-test-label=\"post-content\">\n<p>\u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0627\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0686\u06af\u0648\u0646\u06af\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0627\u0633\u062a \u06a9\u0647 \u06a9\u0627\u0645\u0644\u0627\u064b \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062f\u0645 \u062a\u0627 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062e\u0648\u062f\u0645 \u0631\u0627 \u0633\u0627\u062e\u062a\u0645. <\/p>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u06a9\u0627\u0631 \u0646\u0633\u0628\u062a\u0627\u064b \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0627\u0633\u062a\u060c \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0637\u0648\u0644\u0627\u0646\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f\u060c \u0627\u0645\u0627 \u0628\u0627 \u0645\u0627 \u0647\u0645\u0631\u0627\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c \u0632\u06cc\u0631\u0627 \u0645\u062d\u0635\u0648\u0644\u06cc \u06a9\u0647 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0628\u0627 \u0622\u0646 \u0645\u0648\u0627\u062c\u0647 \u062e\u0648\u0627\u0647\u06cc\u062f \u0634\u062f\u060c \u067e\u0631\u0648\u0698\u0647 \u062c\u0627\u0644\u0628\u06cc \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f!<\/p>\n<h2 id=\"prerequisites\"><span class=\"ez-toc-section\" id=\"%d9%be%db%8c%d8%b4_%d9%86%db%8c%d8%a7%d8%b2%d9%87%d8%a7\"><\/span>\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0628\u06cc\u0634\u062a\u0631 \u0645\u0641\u0627\u0647\u06cc\u0645 \u0631\u0627 \u0628\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u062a\u0648\u0636\u06cc\u062d \u062e\u0648\u0627\u0647\u062f \u062f\u0627\u062f.  \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0628\u0631\u062e\u06cc \u0627\u0632 \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u062a\u0648\u0635\u06cc\u0647 \u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.  \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0628\u0627 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0622\u0634\u0646\u0627 \u0628\u0627\u0634\u06cc\u062f:<\/p>\n<ul>\n<li>\u067e\u0627\u06cc\u062a\u0648\u0646<\/li>\n<li>\u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644<\/li>\n<li>\u0646\u0648\u062a \u0628\u0648\u06a9 \u0698\u0648\u067e\u06cc\u062a\u0631<\/li>\n<li>\u0645\u0641\u0627\u0647\u06cc\u0645 \u0627\u0633\u0627\u0633\u06cc \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc<\/li>\n<li>\u0642\u0648\u0627\u0646\u06cc\u0646 \u0634\u0637\u0631\u0646\u062c<\/li>\n<\/ul>\n<p>\u0627\u0632 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0632\u06cc\u0631 \u0646\u06cc\u0632 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f:<\/p>\n<ul>\n<li>\u067e\u0627\u06cc\u062a\u0648\u0646<\/li>\n<li>\u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u067e\u0627\u06cc\u062a\u0648\u0646<\/li>\n<li>\u0627\u0633\u062a\u0627\u06a9 \u0645\u0627\u0647\u06cc<\/li>\n<\/ul>\n<h2 id=\"table-of-contents\"><span class=\"ez-toc-section\" id=\"%d9%81%d9%87%d8%b1%d8%b3%d8%aa_%d9%85%d8%b7%d8%a7%d9%84%d8%a8\"><\/span>\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\u0628\u062e\u0634 1: \u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u0645<\/li>\n<li>\u0628\u062e\u0634 2: \u0646\u062d\u0648\u0647 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627<\/li>\n<li>\u0642\u0633\u0645\u062a 3: \u0686\u06af\u0648\u0646\u0647 \u0645\u062f\u0644 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0631\u0627 \u0622\u0645\u0648\u0632\u0634 \u062f\u0647\u06cc\u0645<\/li>\n<li>\u0646\u062a\u06cc\u062c\u0647<\/li>\n<\/ul>\n<h2 id=\"part-1-how-to-generate-a-dataset\"><span class=\"ez-toc-section\" id=\"%d8%a8%d8%ae%d8%b4_1_%da%86%da%af%d9%88%d9%86%d9%87_%db%8c%da%a9_%d9%85%d8%ac%d9%85%d9%88%d8%b9%d9%87_%d8%af%d8%a7%d8%af%d9%87_%d8%aa%d9%88%d9%84%db%8c%d8%af_%da%a9%d9%86%db%8c%d9%85\"><\/span>\u0628\u062e\u0634 1: \u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u0645<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0628\u062e\u0634\u060c \u0645\u0646 \u0627\u0632 Stockfish \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u0628\u0632\u0631\u06af\u06cc \u0627\u0632 \u062d\u0631\u06a9\u0627\u062a \u0627\u0632 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f.  \u0627\u06cc\u0646 \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0639\u062f\u0627\u064b \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0634\u0637\u0631\u0646\u062c \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u0648\u0646\u062f.<\/p>\n<h3 id=\"how-to-download-stockfish\"><span class=\"ez-toc-section\" id=\"%da%86%da%af%d9%88%d9%86%d9%87_stockfish_%d8%b1%d8%a7_%d8%af%d8%a7%d9%86%d9%84%d9%88%d8%af_%da%a9%d9%86%db%8c%d9%85\"><\/span>\u0686\u06af\u0648\u0646\u0647 Stockfish \u0631\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0646\u06cc\u0645<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0647\u0645\u062a\u0631\u06cc\u0646 \u062c\u0632\u0621 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0645\u0646 Stockfish \u0627\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0647 \u0634\u0645\u0627 \u0646\u062d\u0648\u0647 \u0646\u0635\u0628 \u0622\u0646 \u0631\u0627 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u0645 \u062f\u0627\u062f. <\/p>\n<p>\u0628\u0647 \u0635\u0641\u062d\u0647 \u062f\u0627\u0646\u0644\u0648\u062f \u0648\u0628 \u0633\u0627\u06cc\u062a Stockfish \u0628\u0631\u0648\u06cc\u062f \u0648 \u0646\u0633\u062e\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f.  \u0645\u0646 \u062e\u0648\u062f\u0645 \u0627\u0632 \u0648\u06cc\u0646\u062f\u0648\u0632 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0646\u0633\u062e\u0647 \u0648\u06cc\u0646\u062f\u0648\u0632 (\u0633\u0631\u06cc\u0639\u062a\u0631) \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0645:<\/p>\n<figure class=\"kg-card kg-image-card kg-width-wide kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2023\/12\/0_GxqQ42GNX21JB1GN.png\" class=\"kg-image\" alt=\"0_GxqQ42GNX21JB1GN\" width=\"700\" height=\"547\" loading=\"lazy\" title=\"\"><figcaption>\u0627\u06af\u0631 \u0631\u0627\u06cc\u0627\u0646\u0647 \u0634\u062e\u0635\u06cc \u0648\u06cc\u0646\u062f\u0648\u0632 \u062f\u0627\u0631\u06cc\u062f\u060c \u062f\u06a9\u0645\u0647 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0647 \u0628\u0627 \u0631\u0646\u06af \u0642\u0631\u0645\u0632 \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u0627\u0633\u062a \u0631\u0627 \u0641\u0634\u0627\u0631 \u062f\u0647\u06cc\u062f<\/figcaption><\/figure>\n<p>\u067e\u0633 \u0627\u0632 \u062f\u0627\u0646\u0644\u0648\u062f\u060c \u0641\u0627\u06cc\u0644 \u0641\u0634\u0631\u062f\u0647 \u0631\u0627 \u062f\u0631 \u0647\u0631 \u0645\u06a9\u0627\u0646\u06cc \u0627\u0632 \u0631\u0627\u06cc\u0627\u0646\u0647 \u0634\u062e\u0635\u06cc \u062e\u0648\u062f \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0634\u0645\u0627 \u0628\u0627\u0634\u062f\u060c \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u06cc\u062f.  \u0628\u0647 \u062e\u0627\u0637\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u06a9\u062c\u0627 \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u06cc\u062f \u0632\u06cc\u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u06cc \u0628\u0647 \u0645\u0633\u06cc\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f.<\/p>\n<h3 id=\"how-to-incorporate-stockfish-with-python\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d8%aa%d8%b1%da%a9%db%8c%d8%a8_stockfish_%d8%a8%d8%a7_%d9%be%d8%a7%db%8c%d8%aa%d9%88%d9%86\"><\/span>\u0646\u062d\u0648\u0647 \u062a\u0631\u06a9\u06cc\u0628 Stockfish \u0628\u0627 \u067e\u0627\u06cc\u062a\u0648\u0646<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u0627\u06cc\u062f \u0645\u0648\u062a\u0648\u0631 \u0631\u0627 \u0646\u06cc\u0632 \u062f\u0631 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f.  \u0634\u0645\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u062f\u0633\u062a\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f\u060c \u0627\u0645\u0627 \u0645\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0633\u062a\u0647 Python Stockfish \u0631\u0627 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u062f\u06cc\u062f\u0645 \u0632\u06cc\u0631\u0627 \u062a\u0645\u0627\u0645 \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0631\u0627 \u062f\u0627\u0631\u062f. <\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u0633\u062a\u0647 \u0631\u0627 \u0627\u0632 <code>pip<\/code> (\u062a\u0631\u062c\u06cc\u062d\u0627 \u062f\u0631 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc \u0634\u0645\u0627):<\/p>\n<pre><code class=\"language-bash\">pip install stockfish\n<\/code><\/pre>\n<p>\u0633\u067e\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">from stockfish import Stockfish\nstockfish = Stockfish(path=r\"C:\\Users\\eivin\\Documents\\ownProgrammingProjects18061402\\ChessEngine\\stockfish\\stockfish\\stockfish-windows-2022-x86-64-avx2\")<\/code><\/pre>\n<p>\u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0645\u0633\u06cc\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0641\u0627\u06cc\u0644 \u0627\u062c\u0631\u0627\u06cc\u06cc Stockfish \u0628\u062f\u0647\u06cc\u062f:<\/p>\n<figure class=\"kg-card kg-image-card kg-width-wide kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2023\/12\/0_MSlKl_UJHCvdpje6.png\" class=\"kg-image\" alt=\"0_MSlKl_UJHCvdpje6\" width=\"643\" height=\"145\" loading=\"lazy\" title=\"\"><figcaption>\u0641\u0627\u06cc\u0644 \u0627\u062c\u0631\u0627\u06cc\u06cc stockfish \u062f\u0648\u0645\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0627\u0632 \u067e\u0627\u06cc\u06cc\u0646 \u0627\u0633\u062a<\/figcaption><\/figure>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0627\u0632 \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0648\u0634\u0647 \u06a9\u067e\u06cc \u06a9\u0646\u06cc\u062f\u060c \u06cc\u0627 \u0627\u06af\u0631 \u062f\u0631 \u0648\u06cc\u0646\u062f\u0648\u0632 11 \u0647\u0633\u062a\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f ctrl + shift + c \u0631\u0627 \u0641\u0634\u0627\u0631 \u062f\u0647\u06cc\u062f \u062a\u0627 \u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u067e\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0639\u0627\u0644\u06cc!  \u0627\u06a9\u0646\u0648\u0646 Stockfish \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u062a\u0648\u0646 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u062f\u0627\u0631\u06cc\u062f!<\/p>\n<h3 id=\"how-to-generate-a-dataset\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d8%aa%d9%88%d9%84%db%8c%d8%af_%d9%85%d8%ac%d9%85%d9%88%d8%b9%d9%87_%d8%af%d8%a7%d8%af%d9%87\"><\/span>\u0646\u062d\u0648\u0647 \u062a\u0648\u0644\u06cc\u062f \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u0647 \u06cc\u06a9 \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0631\u0627 \u0622\u0645\u0648\u0632\u0634 \u062f\u0647\u06cc\u062f!  \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0648\u0627\u062f\u0627\u0631 \u06a9\u0631\u062f\u0646 Stockfish \u0628\u0647 \u0628\u0627\u0632\u06cc \u0648 \u06cc\u0627\u062f\u0622\u0648\u0631\u06cc \u0647\u0631 \u0645\u0648\u0642\u0639\u06cc\u062a \u0648 \u062d\u0631\u06a9\u0627\u062a\u06cc \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0622\u0646\u062c\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f. <\/p>\n<p>\u0628\u0627 \u062a\u0648\u062c\u0647 \u0628\u0647 \u0627\u06cc\u0646\u06a9\u0647 Stockfish \u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0642\u0648\u06cc \u0634\u0637\u0631\u0646\u062c \u0627\u0633\u062a\u060c \u0627\u06cc\u0646 \u062d\u0631\u06a9\u0627\u062a \u062f\u0631 \u0627\u0645\u062a\u062f\u0627\u062f \u0628\u0647\u062a\u0631\u06cc\u0646 \u062d\u0631\u06a9\u0627\u062a \u0645\u0645\u06a9\u0646 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u0634\u0637\u0631\u0646\u062c \u0648 NumPy \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f (\u0645\u0642\u062f\u0627\u0631\u0647\u0627\u06cc \u0632\u06cc\u0627\u062f\u06cc \u0628\u0631\u0627\u06cc \u0627\u0646\u062a\u062e\u0627\u0628 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u060c \u0627\u0645\u0627 \u0645\u0646 \u0627\u0632 \u0645\u0648\u0631\u062f \u0632\u06cc\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f). <\/p>\n<p>\u0647\u0631 \u062e\u0637 \u0631\u0627 (\u0628\u0647 \u0635\u0648\u0631\u062a \u062c\u062f\u0627\u06af\u0627\u0646\u0647) \u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-bash\">pip install chess\npip install numpy\n<\/code><\/pre>\n<p>\u0633\u067e\u0633 \u0628\u0633\u062a\u0647\u200c\u0647\u0627 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f (\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0642\u0628\u0644\u0627\u064b \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u060c Stockfish \u0631\u0627 \u0646\u06cc\u0632 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f):<\/p>\n<pre><code class=\"language-py\">import chess\nimport random\nfrom pprint import pprint\nimport numpy as np\nimport os\nimport glob\nimport time\n<\/code><\/pre>\n<p>\u0634\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0647 \u0628\u0631\u062e\u06cc \u0627\u0632 \u062a\u0648\u0627\u0628\u0639 \u06a9\u0645\u06a9\u06cc \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">#helper functions:\ndef checkEndCondition(board):\n if (board.is_checkmate() or board.is_stalemate() or board.is_insufficient_material() or board.can_claim_threefold_repetition() or board.can_claim_fifty_moves() or board.can_claim_draw()):\n  return True\n return False\n\n#save\ndef findNextIdx():\n files = (glob.glob(r\"C:\\Users\\eivin\\Documents\\ownProgrammingProjects18061402\\ChessEngine\\data\\*.npy\"))\n if (len(files) == 0):\n  return 1 #if no files, return 1\n highestIdx = 0\n for f in files:\n  file = f\n  currIdx = file.split(\"movesAndPositions\")[-1].split(\".npy\")[0]\n  highestIdx = max(highestIdx, int(currIdx))\n\n return int(highestIdx)+1\n\ndef saveData(moves, positions):\n moves = np.array(moves).reshape(-1, 1)\n positions = np.array(positions).reshape(-1,1)\n movesAndPositions = np.concatenate((moves, positions), axis = 1)\n nextIdx = findNextIdx()\n np.save(f\"data\/movesAndPositions{nextIdx}.npy\", movesAndPositions)\n print(\"Saved successfully\")\n\ndef runGame(numMoves, filename = \"movesAndPositions1.npy\"):\n \"\"\"run a game you stored\"\"\"\n testing = np.load(f\"data\/{filename}\")\n moves = testing[:, 0]\n if (numMoves &gt; len(moves)):\n  print(\"Must enter a lower number of moves than maximum game length. Game length here is: \", len(moves))\n  return\n\n testBoard = chess.Board()\n\n for i in range(numMoves):\n  move = moves[i]\n  testBoard.push_san(move)\n return testBoard<\/code><\/pre>\n<p>\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u0642\u0633\u0645\u062a \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f <code>findNextIdx<\/code><em> <\/em>\u0639\u0645\u0644\u06a9\u0631\u062f\u060c \u0632\u06cc\u0631\u0627 \u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0631\u0627\u06cc\u0627\u0646\u0647 \u0634\u0645\u0627 \u0634\u062e\u0635\u06cc \u0627\u0633\u062a. <\/p>\n<p>\u06cc\u06a9 \u067e\u0648\u0634\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631 \u067e\u0648\u0634\u0647 \u0627\u06cc \u06a9\u0647 \u06a9\u062f\u0646\u0648\u06cc\u0633\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u0648 \u0645\u0633\u06cc\u0631 \u0631\u0627 \u06a9\u067e\u06cc \u06a9\u0646\u06cc\u062f (\u0627\u0645\u0627 \u0647\u0645\u0686\u0646\u0627\u0646 \u0622\u0646 \u0631\u0627 \u062d\u0641\u0638 \u06a9\u0646\u06cc\u062f <code>*.npy<\/code> \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646)<\/p>\n<p>\u0631\u0627 <code>checkEndCondition<\/code><em> <\/em>\u062a\u0627\u0628\u0639 \u0627\u0632 \u062a\u0648\u0627\u0628\u0639 \u0628\u0633\u062a\u0647 Chess pip \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u0628\u0627\u0632\u06cc \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u0628\u0647 \u067e\u0627\u06cc\u0627\u0646 \u0628\u0631\u0633\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. <\/p>\n<p>\u0631\u0627 <code>saveData<\/code><em> <\/em>\u062a\u0627\u0628\u0639 \u06cc\u06a9 \u0628\u0627\u0632\u06cc \u0631\u0627 \u062f\u0631 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc npy \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u0631\u0627\u0647\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0628\u0647\u06cc\u0646\u0647 \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0622\u0631\u0627\u06cc\u0647\u200c\u0647\u0627 \u0627\u0633\u062a. <\/p>\n<p>\u062a\u0627\u0628\u0639 \u0627\u0632 <code>findNextIdx<\/code><em> <\/em>\u0639\u0645\u0644\u06a9\u0631\u062f \u0630\u062e\u06cc\u0631\u0647 \u062f\u0631 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f (\u0628\u0647 \u062e\u0627\u0637\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06cc\u06a9 \u067e\u0648\u0634\u0647 \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 data \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u062a\u0645\u0627\u0645 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f). <\/p>\n<p>\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c <code>runGame<\/code><em> <\/em>\u062a\u0627\u0628\u0639 \u0628\u0627\u0639\u062b \u0645\u06cc \u0634\u0648\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627\u0632\u06cc \u0627\u06cc \u0631\u0627 \u06a9\u0647 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627\u06cc \u0628\u0639\u062f \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f <code>numMoves<\/code><em> <\/em>\u062a\u0639\u062f\u0627\u062f \u062d\u0631\u06a9\u0627\u062a<\/p>\n<p>\u0633\u067e\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0628\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f\u06cc \u06a9\u0647 \u0628\u0627\u0632\u06cc \u0647\u0627\u06cc \u0634\u0637\u0631\u0646\u062c \u0631\u0627 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0645\u06cc \u06a9\u0646\u062f \u0628\u0631\u0633\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">def mineGames(numGames : int):\n \"\"\"mines numGames games of moves\"\"\"\n MAX_MOVES = 500 #don't continue games after this number\n\n for i in range(numGames):\n  currentGameMoves = []\n  currentGamePositions = []\n  board = chess.Board()\n  stockfish.set_position([])\n\n  for i in range(MAX_MOVES):\n   #randomly choose from those 3 moves\n   moves = stockfish.get_top_moves(3)\n   #if less than 3 moves available, choose first one, if none available, exit\n   if (len(moves) == 0):\n    print(\"game is over\")\n    break\n   elif (len(moves) == 1):\n    move = moves[0][\"Move\"]\n   elif (len(moves) == 2):\n    move = random.choices(moves, weights=(80, 20), k=1)[0][\"Move\"]\n   else:\n    move = random.choices(moves, weights=(80, 15, 5), k=1)[0][\"Move\"]\n\n   currentGamePositions.append(stockfish.get_fen_position())\n   board.push_san(move)\n   currentGameMoves.append(move)\n   stockfish.set_position(currentGameMoves)\n   if (checkEndCondition(board)):\n    print(\"game is over\")\n    break\n  saveData(currentGameMoves, currentGamePositions)<\/code><\/pre>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0634\u0645\u0627 \u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u062d\u062f\u0627\u06a9\u062b\u0631 \u062d\u062f \u062a\u0639\u06cc\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u062a\u0627 \u06cc\u06a9 \u0628\u0627\u0632\u06cc \u0628\u06cc \u0646\u0647\u0627\u06cc\u062a \u0637\u0648\u0644 \u0646\u06a9\u0634\u062f. <\/p>\n<p>\u0633\u067e\u0633\u060c \u062a\u0639\u062f\u0627\u062f \u0628\u0627\u0632\u06cc\u200c\u0647\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u0627\u062c\u0631\u0627 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f \u0648 \u0645\u0637\u0645\u0626\u0646 \u0645\u06cc\u200c\u0634\u0648\u06cc\u062f \u06a9\u0647 \u0647\u0645 Stockfish \u0648 \u0647\u0645 \u0628\u0633\u062a\u0647 Chess pip \u0628\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u0646\u0634\u0627\u0646\u06cc \u0634\u062f\u0647\u200c\u0627\u0646\u062f. <\/p>\n<p>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u060c 3 \u062d\u0631\u06a9\u062a \u0628\u0631\u062a\u0631 \u067e\u06cc\u0634\u0646\u0647\u0627\u062f \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 Stockfish \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u06cc\u06a9\u06cc \u0627\u0632 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u06cc \u06a9\u0646\u06cc\u062f (80\u066a \u062a\u063a\u06cc\u06cc\u0631 \u0628\u0631\u0627\u06cc \u0628\u0647\u062a\u0631\u06cc\u0646 \u062d\u0631\u06a9\u062a\u060c 15\u066a \u062a\u063a\u06cc\u06cc\u0631 \u0628\u0631\u0627\u06cc \u062f\u0648\u0645\u06cc\u0646 \u062d\u0631\u06a9\u062a \u0628\u0631\u062a\u0631\u060c 5\u066a \u062a\u063a\u06cc\u06cc\u0631 \u0628\u0631\u0627\u06cc \u0633\u0648\u0645\u06cc\u0646 \u062d\u0631\u06a9\u062a \u0628\u0631\u062a\u0631).  \u062f\u0644\u06cc\u0644 \u0627\u06cc\u0646\u06a9\u0647 \u0634\u0645\u0627 \u0647\u0645\u06cc\u0634\u0647 \u0628\u0647\u062a\u0631\u06cc\u0646 \u062d\u0631\u06a9\u062a \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0646\u0645\u06cc \u06a9\u0646\u06cc\u062f \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u062d\u0631\u06a9\u062a \u062a\u0635\u0627\u062f\u0641\u06cc \u062a\u0631 \u0628\u0627\u0634\u062f. <\/p>\n<p>\u0633\u067e\u0633\u060c \u06cc\u06a9 \u062d\u0631\u06a9\u062a \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f (\u062d\u062a\u06cc \u0627\u06af\u0631 \u06a9\u0645\u062a\u0631 \u0627\u0632 \u0633\u0647 \u062d\u0631\u06a9\u062a \u0627\u062d\u062a\u0645\u0627\u0644\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f \u0647\u06cc\u0686 \u062e\u0637\u0627\u06cc\u06cc \u0631\u062e \u0646\u0645\u06cc\u200c\u062f\u0647\u062f)\u060c \u0645\u0648\u0642\u0639\u06cc\u062a \u062a\u062e\u062a\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 FEN (\u0631\u0648\u0634\u06cc \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a \u0634\u0637\u0631\u0646\u062c) \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u062d\u0631\u06a9\u062a \u0627\u0646\u062c\u0627\u0645 \u0634\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0645\u0648\u0642\u0639\u06cc\u062a \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f. <\/p>\n<p>\u0627\u06af\u0631 \u0628\u0627\u0632\u06cc \u062a\u0645\u0627\u0645 \u0634\u062f\u060c \u062d\u0644\u0642\u0647 \u0631\u0627 \u0634\u06a9\u0633\u062a\u0647 \u0648 \u062a\u0645\u0627\u0645 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627 \u0648 \u062d\u0631\u06a9\u0627\u062a \u0627\u0646\u062c\u0627\u0645 \u0634\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627 \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f.  \u0627\u06af\u0631 \u0628\u0627\u0632\u06cc \u062a\u0645\u0627\u0645 \u0646\u0634\u062f\u060c \u062a\u0627 \u067e\u0627\u06cc\u0627\u0646 \u0628\u0627\u0632\u06cc \u0628\u0647 \u0627\u0646\u062c\u0627\u0645 \u062d\u0631\u06a9\u0627\u062a \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u06cc\u062f.<\/p>\n<p>\u0633\u067e\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u0628\u0627\u0632\u06cc \u0631\u0627 \u0628\u0627 \u0627\u06cc\u0646 \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">mineGames(1)\n<\/code><\/pre>\n<p>\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06cc\u06a9 \u067e\u0648\u0634\u0647 \u062f\u0627\u062f\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f\u060c \u0632\u06cc\u0631\u0627 \u0627\u06cc\u0646 \u062c\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0646 \u0628\u0627\u0632\u06cc \u0647\u0627 \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u0645!<\/p>\n<h3 id=\"how-to-review-a-mined-game\"><span class=\"ez-toc-section\" id=\"%da%86%da%af%d9%88%d9%86%d9%87_%db%8c%da%a9_%d8%a8%d8%a7%d8%b2%db%8c_%d9%85%d8%a7%db%8c%d9%86_%d8%b4%d8%af%d9%87_%d8%b1%d8%a7_%d8%a8%d8%b1%d8%b1%d8%b3%db%8c_%da%a9%d9%86%db%8c%d9%85\"><\/span>\u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u0628\u0627\u0632\u06cc \u0645\u0627\u06cc\u0646 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f <code>mineGames<\/code><em> <\/em>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631\u060c \u06cc\u06a9 \u0628\u0627\u0632\u06cc \u0631\u0627 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">mineGames(1)\n<\/code><\/pre>\n<p>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u06a9\u0645\u06a9\u06cc \u06a9\u0647 \u0642\u0628\u0644\u0627 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0628\u0648\u062f \u0628\u0647 \u0627\u06cc\u0646 \u0628\u0627\u0632\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">testBoard = runGame(12, \"movesAndPositions1.npy\")\ntestBoard\n<\/code><\/pre>\n<p>\u0628\u0627 \u0641\u0631\u0636 \u0648\u062c\u0648\u062f 12 \u062d\u0631\u06a9\u062a \u062f\u0631 \u0628\u0627\u0632\u06cc\u060c \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u062e\u0648\u0627\u0647\u06cc\u062f \u062f\u06cc\u062f:<\/p>\n<figure class=\"kg-card kg-image-card kg-width-wide kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2023\/12\/0_pjARgYsCMqZjj8lK.png\" class=\"kg-image\" alt=\"0_pjARgYsCMqZjj8lK\" width=\"339\" height=\"335\" loading=\"lazy\" title=\"\"><figcaption>\u062e\u0631\u0648\u062c\u06cc \u0627\u0632 \u0645\u0648\u0642\u0639\u06cc\u062a \u0628\u0631\u062f \u0686\u0627\u067e \u067e\u0633 \u0627\u0632 12 \u062d\u0631\u06a9\u062a.  (\u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0622\u062e\u0631\u06cc\u0646 \u062e\u0637 \u0641\u0642\u0637 \u0628\u0627 testBoard \u0686\u0627\u067e \u0645\u06cc \u0634\u0648\u062f\u060c \u0632\u06cc\u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0646\u0648\u062a \u0628\u0648\u06a9 Jupyter\u060c \u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0627\u06af\u0631 \u0628\u0647 \u062a\u0646\u0647\u0627\u06cc\u06cc \u062f\u0631 \u0627\u0646\u062a\u0647\u0627\u06cc \u0633\u0644\u0648\u0644 \u0646\u0648\u0634\u062a\u0647 \u0634\u0648\u062f \u0686\u0627\u067e \u0645\u06cc \u0634\u0648\u062f).<\/figcaption><\/figure>\n<p>\u0648 \u0628\u0633\u060c \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0647\u0631 \u062a\u0639\u062f\u0627\u062f \u0628\u0627\u0632\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0646\u06cc\u062f. <\/p>\n<p>\u0645\u062f\u062a\u06cc \u0637\u0648\u0644 \u0645\u06cc \u06a9\u0634\u062f \u0648 \u067e\u062a\u0627\u0646\u0633\u06cc\u0644 \u0647\u0627\u06cc\u06cc \u0628\u0631\u0627\u06cc \u0628\u0647\u06cc\u0646\u0647 \u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u060c \u0645\u0627\u0646\u0646\u062f \u0645\u0648\u0627\u0632\u06cc \u0633\u0627\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u0647\u0627\u06cc \u0628\u0627\u0632\u06cc (\u0632\u06cc\u0631\u0627 \u0647\u0631 \u0628\u0627\u0632\u06cc \u06a9\u0627\u0645\u0644\u0627\u064b \u0627\u0632 \u062f\u06cc\u06af\u0631\u06cc \u062c\u062f\u0627 \u0627\u0633\u062a). <\/p>\n<p>\u0628\u0631\u0627\u06cc \u06a9\u062f \u06a9\u0627\u0645\u0644 \u0642\u0633\u0645\u062a 1\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u06a9\u0627\u0645\u0644 \u0631\u0627 \u062f\u0631 GitHub \u0645\u0646 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<h2 id=\"part-2-how-to-encode-data\"><span class=\"ez-toc-section\" id=\"%d8%a8%d8%ae%d8%b4_2_%d9%86%d8%ad%d9%88%d9%87_%d8%b1%d9%85%d8%b2%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d8%af%d8%a7%d8%af%d9%87_%d9%87%d8%a7\"><\/span>\u0628\u062e\u0634 2: \u0646\u062d\u0648\u0647 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0642\u0633\u0645\u062a \u0634\u0645\u0627 \u062d\u0631\u06a9\u0627\u062a \u0648 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627\u06cc \u0634\u0637\u0631\u0646\u062c \u0631\u0627 \u0628\u0647 \u0647\u0645\u0627\u0646 \u0631\u0648\u0634\u06cc \u06a9\u0647 DeepMind \u0628\u0627 AlphaZero \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u062f!<\/p>\n<p>\u0645\u0646 \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0642\u0633\u0645\u062a 1 \u0627\u06cc\u0646 \u0645\u062c\u0645\u0648\u0639\u0647 \u062c\u0645\u0639 \u0622\u0648\u0631\u06cc \u06a9\u0631\u062f\u06cc\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f. <\/p>\n<p>\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u0627\u062f\u0622\u0648\u0631\u06cc\u060c \u0634\u0645\u0627 Stockfish \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0631\u062f\u06cc\u062f \u0648 \u0645\u0637\u0645\u0626\u0646 \u0634\u062f\u06cc\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0622\u0646 \u062f\u0631 \u0631\u0627\u06cc\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f.  \u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0648\u0627\u062f\u0627\u0631 \u06a9\u0631\u062f\u06cc\u062f \u0639\u0644\u06cc\u0647 \u062e\u0648\u062f\u0634 \u0628\u0627\u0632\u06cc \u06a9\u0646\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u062a\u0645\u0627\u0645 \u062d\u0631\u06a9\u0627\u062a \u0648 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627 \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0631\u062f\u06cc\u062f. <\/p>\n<p>\u0634\u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u06cc\u06a9 \u0645\u0634\u06a9\u0644 \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u0646\u0638\u0627\u0631\u062a \u0634\u062f\u0647 \u062f\u0627\u0631\u06cc\u062f\u060c \u0632\u06cc\u0631\u0627 \u0648\u0631\u0648\u062f\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a \u0641\u0639\u0644\u06cc \u0627\u0633\u062a \u0648 \u0628\u0631\u0686\u0633\u0628 (\u062d\u0631\u06a9\u062a \u0635\u062d\u06cc\u062d \u0627\u0632 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627) \u062d\u0631\u06a9\u062a\u06cc \u0627\u0633\u062a \u06a9\u0647 Stockfish \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a \u0628\u0647\u062a\u0631\u06cc\u0646 \u062d\u0631\u06a9\u062a \u0627\u0633\u062a.<\/p>\n<h3 id=\"how-to-install-and-import-packages\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d9%86%d8%b5%d8%a8_%d9%88_%d9%88%d8%a7%d8%b1%d8%af_%da%a9%d8%b1%d8%af%d9%86_%d8%a8%d8%b3%d8%aa%d9%87_%d9%87%d8%a7\"><\/span>\u0646\u062d\u0648\u0647 \u0646\u0635\u0628 \u0648 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0628\u0633\u062a\u0647 \u0647\u0627<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f \u062a\u0645\u0627\u0645 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0631\u0627 \u0646\u0635\u0628 \u0648 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f\u060c \u06a9\u0647 \u0627\u06af\u0631 \u0642\u0633\u0645\u062a 1 \u0627\u06cc\u0646 \u0645\u062c\u0645\u0648\u0639\u0647 \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0631\u062e\u06cc \u0627\u0632 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0642\u0628\u0644\u0627 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f. <\/p>\n<p>\u0647\u0645\u0647 \u0648\u0627\u0631\u062f\u0627\u062a \u062f\u0631 \u0632\u06cc\u0631 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a &#8211; \u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u0647\u0646\u06af\u0627\u0645 \u0646\u0635\u0628 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0641\u0642\u0637 \u06cc\u06a9 \u062e\u0637 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f <code>pip<\/code>:<\/p>\n<pre><code class=\"language-bash\">pip install numpy\npip install gym-chess\npip install chess\n<\/code><\/pre>\n<p>\u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0627\u0632 \u0622\u0646 \u0632\u0645\u0627\u0646 \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u062f\u0631 \u06cc\u06a9\u06cc \u0627\u0632 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0628\u0633\u062a\u0647 gym-chess \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>np.int<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u062f \u06a9\u0647 \u0627\u06a9\u0646\u0648\u0646 \u0645\u0646\u0633\u0648\u062e \u0634\u062f\u0647 \u0627\u0633\u062a. <\/p>\n<p>\u062f\u0631 \u0641\u0627\u06cc\u0644 \u0628\u0627 \u0645\u0633\u06cc\u0631 \u0646\u0633\u0628\u06cc (\u0627\u0632 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc) <code>venv\\Lib\\site-packages\\gym_chess\\alphazero\\board_encoding.py<\/code> \u062c\u0627\u06cc\u06cc \u06a9\u0647 <code>venv<\/code><em> <\/em>\u0646\u0627\u0645 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc \u0645\u0646 \u0627\u0633\u062a\u060c \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f &#8220;np.int&#8221; \u0631\u0627 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0646\u06cc\u062f \u0648 &#8220;int&#8221; \u0631\u0627 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0622\u0646\u0647\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0627\u06af\u0631 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0646\u06a9\u0646\u06cc\u062f\u060c \u06cc\u06a9 \u067e\u06cc\u0627\u0645 \u062e\u0637\u0627\u06cc\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u062f\u06cc\u062f \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f np.int \u0645\u0646\u0633\u0648\u062e \u0634\u062f\u0647 \u0627\u0633\u062a. <\/p>\n<p>\u0645\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u062c\u0628\u0648\u0631 \u0634\u062f\u0645 VS Code \u0631\u0627 \u067e\u0633 \u0627\u0632 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u06cc &#8220;np.int&#8221; \u0628\u0627 &#8220;int&#8221; \u062f\u0648\u0628\u0627\u0631\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u0645 \u062a\u0627 \u06a9\u0627\u0631 \u06a9\u0646\u062f.<\/p>\n<p>\u062a\u0645\u0627\u0645 \u0648\u0627\u0631\u062f\u0627\u062a\u06cc \u06a9\u0647 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f \u062f\u0631 \u0632\u06cc\u0631 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<pre><code class=\"language-py\">import numpy as np\nimport gym\nimport chess\nimport os\nimport gym.spaces\nfrom gym_chess.alphazero.move_encoding import utils, queenmoves, knightmoves, underpromotions\nfrom typing import List\n<\/code><\/pre>\n<p>\u0648 \u0633\u067e\u0633 \u0634\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0627\u06cc\u062f \u0645\u062d\u06cc\u0637 \u0648\u0631\u0632\u0634\u06af\u0627\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0648 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u062d\u0631\u06a9\u0627\u062a \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">env = gym.make('ChessAlphaZero-v0')\n<\/code><\/pre>\n<h3 id=\"how-to-encode-board-positions-and-moves\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%da%a9%d8%af%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d9%85%d9%88%d9%82%d8%b9%db%8c%d8%aa_%d9%87%d8%a7_%d9%88_%d8%ad%d8%b1%da%a9%d8%a7%d8%aa_%d8%aa%d8%ae%d8%aa%d9%87\"><\/span>\u0646\u062d\u0648\u0647 \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627 \u0648 \u062d\u0631\u06a9\u0627\u062a \u062a\u062e\u062a\u0647<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06cc\u06a9 \u0639\u0646\u0635\u0631 \u0645\u0647\u0645 \u062f\u0631 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0627\u0633\u062a\u060c \u0632\u06cc\u0631\u0627 \u0628\u0647 \u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0645\u0634\u06a9\u0644\u0627\u062a \u0631\u0627 \u0628\u0647 \u0631\u0648\u0634\u06cc \u0642\u0627\u0628\u0644 \u062e\u0648\u0627\u0646\u062f\u0646 \u0628\u0631\u0627\u06cc \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0646\u0634\u0627\u0646 \u062f\u0647\u06cc\u0645. <\/p>\n<p>\u0628\u0647 \u062c\u0627\u06cc \u062a\u0635\u0648\u06cc\u0631\u06cc \u0627\u0632 \u06cc\u06a9 \u0635\u0641\u062d\u0647 \u0634\u0637\u0631\u0646\u062c\u060c \u06cc\u0627 \u0631\u0634\u062a\u0647 \u0627\u06cc \u06a9\u0647 \u06cc\u06a9 \u062d\u0631\u06a9\u062a \u0634\u0637\u0631\u0646\u062c \u0645\u0627\u0646\u0646\u062f &#8220;d2d4&#8221; \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f\u060c \u062f\u0631 \u0639\u0648\u0636 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0631\u0627\u06cc\u0647 \u0647\u0627 (\u0641\u0647\u0631\u0633\u062a \u0627\u0639\u062f\u0627\u062f) \u0622\u0646 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u06cc\u062f. <\/p>\n<p>\u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0646 \u0646\u062d\u0648\u0647 \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0647 \u0635\u0648\u0631\u062a \u062f\u0633\u062a\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0686\u0627\u0644\u0634 \u0628\u0631\u0627\u0646\u06af\u06cc\u0632 \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u062e\u0648\u0634\u0628\u062e\u062a\u0627\u0646\u0647 \u0628\u0631\u0627\u06cc \u0645\u0627\u060c \u0628\u0633\u062a\u0647 Gym-chess Python \u0642\u0628\u0644\u0627\u064b \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u0627 \u062d\u0644 \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0645\u0646 \u0642\u0635\u062f \u0646\u062f\u0627\u0631\u0645 \u0648\u0627\u0631\u062f \u062c\u0632\u0626\u06cc\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0622\u0646\u200c\u0647\u0627 \u0634\u0648\u0645\u060c \u0627\u0645\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062f \u0632\u06cc\u0631 \u0628\u0628\u06cc\u0646\u06cc\u062f \u06a9\u0647 \u06cc\u06a9 \u0645\u0648\u0642\u0639\u06cc\u062a \u0628\u0627 \u06cc\u06a9 \u0622\u0631\u0627\u06cc\u0647 \u0634\u06a9\u0644 (8\u060c8\u060c119) \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f\u060c \u0648 \u062a\u0645\u0627\u0645 \u062d\u0631\u06a9\u0627\u062a \u0645\u0645\u06a9\u0646 \u0628\u0627 \u06cc\u06a9 \u0622\u0631\u0627\u06cc\u0647 (4672) \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. (1 \u0633\u062a\u0648\u0646 \u0628\u0627 4672 \u0645\u0642\u062f\u0627\u0631).<\/p>\n<p>  \u0627\u06af\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u0628\u06cc\u0634\u062a\u0631 \u0628\u062e\u0648\u0627\u0646\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0642\u0627\u0644\u0647 AlphaZero \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0627\u06af\u0631\u0686\u0647 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u06a9\u0627\u0645\u0644\u0627\u064b \u067e\u06cc\u0686\u06cc\u062f\u0647\u200c\u0627\u06cc \u0628\u0631\u0627\u06cc \u062f\u0631\u06a9 \u06a9\u0627\u0645\u0644 \u0627\u0633\u062a.<\/p>\n<pre><code class=\"language-py\">#code to print action and state space\nenv = gym.make('ChessAlphaZero-v0')\nenv.reset()\nprint(env.observation_space)\nprint(env.action_space)\n<\/code><\/pre>\n<p>\u06a9\u062f\u0627\u0645 \u062e\u0631\u0648\u062c\u06cc \u0647\u0627:<\/p>\n<figure class=\"kg-card kg-image-card kg-width-wide kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2023\/12\/0_yDTpZm519oQl-fJm.png\" class=\"kg-image\" alt=\"0_yDTpZm519oQl-fJm\" width=\"439\" height=\"73\" loading=\"lazy\" title=\"\"><figcaption>\u062e\u0631\u0648\u062c\u06cc \u0627\u0632 \u062d\u0627\u0644\u062a \u0686\u0627\u067e (\u062e\u0637 \u0627\u0648\u0644) \u0648 \u0641\u0636\u0627\u06cc \u0639\u0645\u0644 (\u062e\u0637 \u062f\u0648\u0645)<\/figcaption><\/figure>\n<p>\u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06cc\u06a9 \u062d\u0631\u06a9\u062a \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.  \u0627\u0632 \u0646\u0645\u0627\u062f \u0631\u0634\u062a\u0647 \u062a\u0627 \u0646\u0645\u0627\u062f \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647.  \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u062d\u06cc\u0637 \u0631\u0627 \u0628\u0627\u0632\u0646\u0634\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f \u0632\u06cc\u0631\u0627 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062e\u0637\u0627 \u0628\u062f\u0647\u062f \u0627\u06af\u0631 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0646\u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">#first set the environment and make sure to reset the positions\nenv = gym.make('ChessAlphaZero-v0')\nenv.reset()\n\n#encoding the move e2 to e4\nmove = chess.Move.from_uci('e2e4')\nprint(env.encode(move))\n# -&gt; outputs: 877\n\n#decoding the encoded move 877\nprint(env.decode(877))\n# -&gt; outputs: Move.from_uci('e2e4')\n<\/code><\/pre>\n<p>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646\u060c \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0648\u0627\u0628\u0639\u06cc \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u062d\u0631\u06a9\u0627\u062a \u0648 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u0632 \u0642\u0633\u0645\u062a 1 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f\u060c \u062f\u0631 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u06cc\u06a9 \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f\u060c \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<h3 id=\"how-to-create-functions-for-encoding-moves\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d8%a7%db%8c%d8%ac%d8%a7%d8%af_%d8%aa%d9%88%d8%a7%d8%a8%d8%b9_%d8%a8%d8%b1%d8%a7%db%8c_%d8%b1%d9%85%d8%b2%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d8%ad%d8%b1%da%a9%d8%a7%d8%aa\"><\/span>\u0646\u062d\u0648\u0647 \u0627\u06cc\u062c\u0627\u062f \u062a\u0648\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u062d\u0631\u06a9\u0627\u062a<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u0646 \u062a\u0648\u0627\u0628\u0639 \u0627\u0632 \u0628\u0633\u062a\u0647 Gym-Chess \u06a9\u067e\u06cc \u0634\u062f\u0647 \u0627\u0646\u062f\u060c \u0627\u0645\u0627 \u0628\u0627 \u062a\u0631\u0641\u0646\u062f\u0647\u0627\u06cc \u06a9\u0648\u0686\u06a9\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0647 \u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0648\u0627\u0628\u0633\u062a\u0647 \u0646\u06cc\u0633\u062a. <\/p>\n<p>\u0645\u0646 \u0628\u0647 \u0635\u0648\u0631\u062a \u062f\u0633\u062a\u06cc \u0627\u06cc\u0646 \u062a\u0648\u0627\u0628\u0639 \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0645 \u062a\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0622\u0633\u0627\u0646 \u062a\u0631 \u0628\u0627\u0634\u062f.  \u0645\u0646 \u062f\u0631 \u0645\u0648\u0631\u062f \u062f\u0631\u06a9 \u06a9\u0627\u0645\u0644 \u0627\u06cc\u0646 \u062a\u0648\u0627\u0628\u0639 \u0646\u06af\u0631\u0627\u0646 \u0646\u0628\u0627\u0634\u0645\u060c \u0632\u06cc\u0631\u0627 \u0622\u0646\u0647\u0627 \u0628\u0633\u06cc\u0627\u0631 \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0647\u0633\u062a\u0646\u062f. <\/p>\n<p>\u0641\u0642\u0637 \u0628\u062f\u0627\u0646\u06cc\u062f \u06a9\u0647 \u0622\u0646\u0647\u0627 \u0631\u0627\u0647\u06cc \u0647\u0633\u062a\u0646\u062f \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u062d\u0631\u06a9\u062a \u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u0646\u0633\u0627\u0646 \u0647\u0627 \u0645\u06cc \u0641\u0647\u0645\u0646\u062f\u060c \u0628\u0647 \u0631\u0648\u0634\u06cc \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc \u0634\u0648\u0646\u062f \u06a9\u0647 \u0631\u0627\u06cc\u0627\u0646\u0647 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u062f\u0631\u06a9 \u06a9\u0646\u0646\u062f.<\/p>\n<pre><code class=\"language-py\">#fixing encoding funcs from openai\n\ndef encodeKnight(move: chess.Move):\n    _NUM_TYPES: int = 8\n\n    #: Starting point of knight moves in last dimension of 8 x 8 x 73 action array.\n    _TYPE_OFFSET: int = 56\n\n    #: Set of possible directions for a knight move, encoded as \n    #: (delta rank, delta square).\n    _DIRECTIONS = utils.IndexedTuple(\n        (+2, +1),\n        (+1, +2),\n        (-1, +2),\n        (-2, +1),\n        (-2, -1),\n        (-1, -2),\n        (+1, -2),\n        (+2, -1),\n    )\n\n    from_rank, from_file, to_rank, to_file = utils.unpack(move)\n\n    delta = (to_rank - from_rank, to_file - from_file)\n    is_knight_move = delta in _DIRECTIONS\n    \n    if not is_knight_move:\n        return None\n\n    knight_move_type = _DIRECTIONS.index(delta)\n    move_type = _TYPE_OFFSET + knight_move_type\n\n    action = np.ravel_multi_index(\n        multi_index=((from_rank, from_file, move_type)),\n        dims=(8, 8, 73)\n    )\n\n    return action\n\ndef encodeQueen(move: chess.Move):\n    _NUM_TYPES: int = 56 # = 8 directions * 7 squares max. distance\n    _DIRECTIONS = utils.IndexedTuple(\n        (+1,  0),\n        (+1, +1),\n        ( 0, +1),\n        (-1, +1),\n        (-1,  0),\n        (-1, -1),\n        ( 0, -1),\n        (+1, -1),\n    )\n\n    from_rank, from_file, to_rank, to_file = utils.unpack(move)\n\n    delta = (to_rank - from_rank, to_file - from_file)\n\n    is_horizontal = delta[0] == 0\n    is_vertical = delta[1] == 0\n    is_diagonal = abs(delta[0]) == abs(delta[1])\n    is_queen_move_promotion = move.promotion in (chess.QUEEN, None)\n\n    is_queen_move = (\n        (is_horizontal or is_vertical or is_diagonal) \n            and is_queen_move_promotion\n    )\n\n    if not is_queen_move:\n        return None\n\n    direction = tuple(np.sign(delta))\n    distance = np.max(np.abs(delta))\n\n    direction_idx = _DIRECTIONS.index(direction)\n    distance_idx = distance - 1\n\n    move_type = np.ravel_multi_index(\n        multi_index=([direction_idx, distance_idx]),\n        dims=(8,7)\n    )\n\n    action = np.ravel_multi_index(\n        multi_index=((from_rank, from_file, move_type)),\n        dims=(8, 8, 73)\n    )\n\n    return action\n\ndef encodeUnder(move):\n    _NUM_TYPES: int = 9 # = 3 directions * 3 piece types (see below)\n    _TYPE_OFFSET: int = 64\n    _DIRECTIONS = utils.IndexedTuple(\n        -1,\n        0,\n        +1,\n    )\n    _PROMOTIONS = utils.IndexedTuple(\n        chess.KNIGHT,\n        chess.BISHOP,\n        chess.ROOK,\n    )\n\n    from_rank, from_file, to_rank, to_file = utils.unpack(move)\n\n    is_underpromotion = (\n        move.promotion in _PROMOTIONS \n        and from_rank == 6 \n        and to_rank == 7\n    )\n\n    if not is_underpromotion:\n        return None\n\n    delta_file = to_file - from_file\n\n    direction_idx = _DIRECTIONS.index(delta_file)\n    promotion_idx = _PROMOTIONS.index(move.promotion)\n\n    underpromotion_type = np.ravel_multi_index(\n        multi_index=([direction_idx, promotion_idx]),\n        dims=(3,3)\n    )\n\n    move_type = _TYPE_OFFSET + underpromotion_type\n\n    action = np.ravel_multi_index(\n        multi_index=((from_rank, from_file, move_type)),\n        dims=(8, 8, 73)\n    )\n\n    return action\n\ndef encodeMove(move: str, board) -&gt; int:\n    move = chess.Move.from_uci(move)\n    if board.turn == chess.BLACK:\n        move = utils.rotate(move)\n\n    action = encodeQueen(move)\n\n    if action is None:\n        action = encodeKnight(move)\n\n    if action is None:\n        action = encodeUnder(move)\n\n    if action is None:\n        raise ValueError(f\"{move} is not a valid move\")\n\n    return action\n<\/code><\/pre>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u062d\u0631\u06a9\u062a \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0631\u0634\u062a\u0647 (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644: &#8220;e2e4&#8221; \u0628\u0631\u0627\u06cc \u062d\u0631\u06a9\u062a \u0627\u0632 e2 \u0628\u0647 e4) \u0628\u062f\u0647\u06cc\u062f \u0648 \u06cc\u06a9 \u0639\u062f\u062f (\u0646\u0633\u062e\u0647 \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u062d\u0631\u06a9\u062a) \u0631\u0627 \u062e\u0631\u0648\u062c\u06cc \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<h3 id=\"how-to-create-a-function-for-encoding-positions\"><span class=\"ez-toc-section\" id=\"%da%86%da%af%d9%88%d9%86%d9%87_%db%8c%da%a9_%d8%aa%d8%a7%d8%a8%d8%b9_%d8%a8%d8%b1%d8%a7%db%8c_%d8%b1%d9%85%d8%b2%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d9%85%d9%88%d9%82%d8%b9%db%8c%d8%aa_%d9%87%d8%a7_%d8%a7%db%8c%d8%ac%d8%a7%d8%af_%da%a9%d9%86%db%8c%d9%85\"><\/span>\u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627 \u06a9\u0645\u06cc \u062f\u0634\u0648\u0627\u0631\u062a\u0631 \u0627\u0633\u062a.  \u0645\u0646 \u062a\u0627\u0628\u0639\u06cc \u0631\u0627 \u0627\u0632 \u0628\u0633\u062a\u0647 gym-chess (&#8220;encodeBoard&#8221;) \u06af\u0631\u0641\u062a\u0645 \u0632\u06cc\u0631\u0627 \u062f\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u0633\u062a\u0642\u06cc\u0645 \u0627\u0632 \u0628\u0633\u062a\u0647 \u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u062f\u0627\u0634\u062a\u0645.  \u062a\u0627\u0628\u0639\u06cc \u06a9\u0647 \u06a9\u067e\u06cc \u06a9\u0631\u062f\u0645 \u062f\u0631 \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<pre><code class=\"language-py\">def encodeBoard(board: chess.Board) -&gt; np.array:\n \"\"\"Converts a board to numpy array representation.\"\"\"\n\n array = np.zeros((8, 8, 14), dtype=int)\n\n for square, piece in board.piece_map().items():\n  rank, file = chess.square_rank(square), chess.square_file(square)\n  piece_type, color = piece.piece_type, piece.color\n \n  # The first six planes encode the pieces of the active player, \n  # the following six those of the active player's opponent. Since\n  # this class always stores boards oriented towards the white player,\n  # White is considered to be the active player here.\n  offset = 0 if color == chess.WHITE else 6\n  \n  # Chess enumerates piece types beginning with one, which you have\n  # to account for\n  idx = piece_type - 1\n \n  array[rank, file, idx + offset] = 1\n\n # Repetition counters\n array[:, :, 12] = board.is_repetition(2)\n array[:, :, 13] = board.is_repetition(3)\n\n return array\n\ndef encodeBoardFromFen(fen: str) -&gt; np.array:\n board = chess.Board(fen)\n return encodeBoard(board)<\/code><\/pre>\n<p>\u0645\u0646 \u0647\u0645 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0645 <code>encodeBoardFromFen<\/code><em> <\/em>\u062a\u0627\u0628\u0639\u060c \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u062a\u0627\u0628\u0639 \u06a9\u067e\u06cc \u0634\u062f\u0647 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u06cc\u06a9 \u0635\u0641\u062d\u0647 \u0634\u0637\u0631\u0646\u062c \u062f\u0627\u0631\u062f \u06a9\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0633\u062a\u0647 Python Chess \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0646 \u0627\u0628\u062a\u062f\u0627 \u0627\u0632 FEN-notation (\u0631\u0648\u0634\u06cc \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a\u200c\u0647\u0627\u06cc \u0634\u0637\u0631\u0646\u062c \u0628\u0647 \u06cc\u06a9 \u0631\u0634\u062a\u0647 &#8211; \u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u0632\u06cc\u0631\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u0647 \u0635\u0648\u0631\u062a \u0627\u0639\u062f\u0627\u062f \u0628\u0627\u0634\u062f) \u0628\u0647 \u06cc\u06a9 \u0635\u0641\u062d\u0647 \u0634\u0637\u0631\u0646\u062c \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0628\u0633\u062a\u0647 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0633\u067e\u0633 \u062a\u0645\u0627\u0645 \u0622\u0646\u0686\u0647 \u0631\u0627 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u062a\u0645\u0627\u0645 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u062e\u0648\u062f \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u062f\u0627\u0631\u06cc\u062f.<\/p>\n<h3 id=\"how-to-automate-encoding-for-all-raw-data-files\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d8%ae%d9%88%d8%af%da%a9%d8%a7%d8%b1_%da%a9%d8%b1%d8%af%d9%86_%d8%b1%d9%85%d8%b2%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d8%a8%d8%b1%d8%a7%db%8c_%d8%aa%d9%85%d8%a7%d9%85_%d9%81%d8%a7%db%8c%d9%84_%d9%87%d8%a7%db%8c_%d8%af%d8%a7%d8%af%d9%87_%d8%ae%d8%a7%d9%85\"><\/span>\u0646\u062d\u0648\u0647 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0631\u062f\u0646 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u0631\u0627\u06cc \u062a\u0645\u0627\u0645 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u062e\u0627\u0645<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062d\u0631\u06a9\u062a\u200c\u0647\u0627 \u0648 \u0645\u0648\u0642\u0639\u06cc\u062a\u200c\u0647\u0627 \u0631\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0627\u06cc\u0646 \u0641\u0631\u0622\u06cc\u0646\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u067e\u0648\u0634\u0647 \u062e\u0648\u062f \u06a9\u0647 \u0627\u0632 \u0642\u0633\u0645\u062a 1 \u0627\u06cc\u0646 \u0633\u0631\u06cc \u062a\u0648\u0644\u06cc\u062f \u06a9\u0631\u062f\u0647\u200c\u0627\u06cc\u062f\u060c \u062e\u0648\u062f\u06a9\u0627\u0631 \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f.  \u0627\u06cc\u0646 \u0634\u0627\u0645\u0644 \u06cc\u0627\u0641\u062a\u0646 \u062a\u0645\u0627\u0645 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627\u06cc\u062f \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u062f\u0631 \u0622\u0646\u0647\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u0622\u0646\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0627\u0632 \u0642\u0633\u0645\u062a 1 \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0648\u0634\u0647 \u0631\u0627 \u06a9\u0645\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0645. <\/p>\n<p>\u0645\u0646 \u0627\u0644\u0627\u0646 \u06cc\u06a9 \u067e\u062f\u0631 \u0648 \u0645\u0627\u062f\u0631 \u062f\u0627\u0631\u0645 <code>Data<\/code><em> <\/em>\u067e\u0648\u0634\u0647\u060c \u0648 \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0648\u0634\u0647\u060c \u0645\u0646 \u0631\u0627 \u062f\u0627\u0631\u0645 <code>rawData<\/code>\u060c \u06a9\u0647 \u062d\u0631\u06a9\u0627\u062a \u062f\u0631 \u0642\u0627\u0644\u0628 \u0631\u0634\u062a\u0647 \u0648 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627 \u062f\u0631 \u0642\u0627\u0644\u0628 FEN (\u0627\u0632 \u0642\u0633\u0645\u062a 1) \u0627\u0633\u062a.<\/p>\n<p>\u0645\u0646 \u0647\u0645 \u062f\u0627\u0631\u0645 <code>preparedData<\/code><em> <\/em>\u067e\u0648\u0634\u0647 \u0632\u06cc\u0631 \u067e\u0648\u0634\u0647 \u062f\u0627\u062f\u0647\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u062d\u0631\u06a9\u062a \u0647\u0627 \u0648 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627\u06cc \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f. <\/p>\n<p>\u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062d\u0631\u06a9\u062a \u0647\u0627 \u0648 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627\u06cc \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u062f\u0631 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f \u0632\u06cc\u0631\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0647\u0627 \u062f\u0627\u0631\u0627\u06cc \u0627\u0628\u0639\u0627\u062f \u0645\u062a\u0641\u0627\u0648\u062a\u06cc \u0647\u0633\u062a\u0646\u062f.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2023\/12\/0_oiZbBdWwveJNMCPe.png\" class=\"kg-image\" alt=\"0_oiZbBdWwveJNMCPe\" width=\"109\" height=\"63\" loading=\"lazy\" title=\"\"><figcaption>\u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0648\u0634\u0647 \u0628\u0631\u0627\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627  \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u062f\u0648 \u067e\u0648\u0634\u0647 \u0628\u0647 \u0646\u0627\u0645\u200c\u0647\u0627\u06cc readyData \u0648 rawData \u062f\u0631 \u067e\u0648\u0634\u0647 Data \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.  \u067e\u0648\u0634\u0647 Data \u062f\u0631 \u0647\u0645\u0627\u0646 \u0633\u0637\u062d \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0646\u0648\u062a \u0628\u0648\u06a9 \u0634\u0645\u0627 \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u062f.<\/figcaption><\/figure>\n<pre><code class=\"language-py\">#function to encode all moves and positions from rawData folder\ndef encodeAllMovesAndPositions():\n    board = chess.Board() #this is used to change whose turn it is so that the encoding works\n    board.turn = False #set turn to black first, changed on first run\n\n    #find all files in folder:\n    files = os.listdir('data\/rawData')\n    for idx, f in enumerate(files):\n        movesAndPositions = np.load(f'data\/rawData\/{f}', allow_pickle=True)\n        moves = movesAndPositions[:,0]\n        positions = movesAndPositions[:,1]\n        encodedMoves = []\n        encodedPositions = []\n\n        for i in range(len(moves)):\n            board.turn = (not board.turn) #swap turns\n            try:\n                encodedMoves.append(encodeMove(moves[i], board)) \n                encodedPositions.append(encodeBoardFromFen(positions[i]))\n            except:\n                try:\n                    board.turn = (not board.turn) #change turn, since you  skip moves sometimes, you  might need to change turn\n                    encodedMoves.append(encodeMove(moves[i], board)) \n                    encodedPositions.append(encodeBoardFromFen(positions[i]))\n                except:\n                    print(f'error in file: {f}')\n                    print(\"Turn: \", board.turn)\n                    print(moves[i])\n                    print(positions[i])\n                    print(i)\n                    break\n            \n        np.save(f'data\/preparedData\/moves{idx}', np.array(encodedMoves))\n        np.save(f'data\/preparedData\/positions{idx}', np.array(encodedPositions))\n    \nencodeAllMovesAndPositions()\n\n#NOTE: shape of files:\n#moves: (number of moves in gamew)\n#positions: (number of moves in game, 8, 8, 14) (number of moves in game is including both black and white moves)\n<\/code><\/pre>\n<p>\u0645\u0646 \u0627\u0628\u062a\u062f\u0627 \u0645\u062d\u06cc\u0637 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645 \u0648 \u0622\u0646 \u0631\u0627 \u0631\u06cc\u0633\u062a \u0645\u06cc \u06a9\u0646\u0645. <\/p>\n<p>\u0633\u067e\u0633\u060c \u0645\u0646 \u062a\u0645\u0627\u0645 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u062e\u0627\u0645 \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0632 \u0642\u0633\u0645\u062a 1 \u0631\u0627 \u0628\u0627\u0632 \u0645\u06cc \u06a9\u0646\u0645 \u0648 \u0622\u0646 \u0631\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc \u06a9\u0646\u0645.  \u0645\u0646 \u0647\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u0645 <code>try\/catch<\/code> \u0628\u06cc\u0627\u0646\u06cc\u0647\u060c \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0645\u0646 \u06af\u0627\u0647\u06cc \u0627\u0648\u0642\u0627\u062a \u062e\u0637\u0627\u0647\u0627\u06cc\u06cc \u0631\u0627 \u062f\u0631 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u062d\u0631\u06a9\u062a \u0645\u06cc \u0628\u06cc\u0646\u0645. <\/p>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0639\u0628\u0627\u0631\u062a \u0627\u0633\u062a\u062b\u0646\u0627 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0627\u06af\u0631 \u062d\u0631\u06a9\u062a\u06cc \u0646\u0627\u062f\u06cc\u062f\u0647 \u06af\u0631\u0641\u062a\u0647 \u0634\u0648\u062f (\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0646\u062f \u0646\u0648\u0628\u062a \u0627\u0634\u062a\u0628\u0627\u0647 \u0627\u0633\u062a).  \u0627\u06af\u0631 \u0627\u06cc\u0646 \u0627\u062a\u0641\u0627\u0642 \u0628\u06cc\u0641\u062a\u062f\u060c \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06a9\u0627\u0631 \u0646\u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0639\u0628\u0627\u0631\u062a \u0627\u0633\u062a\u062b\u0646\u0627\u060c \u0686\u0631\u062e\u0634 \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u062f\u0647\u062f \u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u062a\u0644\u0627\u0634 \u0645\u06cc\u200c\u06a9\u0646\u062f.  \u0627\u06cc\u0646 \u0628\u0647\u06cc\u0646\u0647 \u062a\u0631\u06cc\u0646 \u06a9\u062f \u0646\u06cc\u0633\u062a\u060c \u0627\u0645\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u062e\u0634 \u06a9\u0648\u0686\u06a9\u06cc \u0627\u0632 \u06a9\u0644 \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0627\u0633\u062a \u0648 \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0642\u0627\u0628\u0644 \u0642\u0628\u0648\u0644 \u0627\u0633\u062a.<\/p>\n<p>\u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0648\u0634\u0647 \u062f\u0631\u0633\u062a\u06cc \u062f\u0627\u0631\u06cc\u062f \u0648 \u062a\u0645\u0627\u0645 \u067e\u0648\u0634\u0647 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f.  \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u06cc\u06a9 \u062e\u0637\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0635\u0641\u062d\u0647 \u0634\u0637\u0631\u0646\u062c \u0648 \u062d\u0631\u06a9\u0627\u062a \u062e\u0648\u062f \u0631\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f.  \u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u06a9\u0627\u0645\u0644 \u0627\u06cc\u0646 \u0642\u0633\u0645\u062a \u0631\u0627 \u062f\u0631 GitHub \u0645\u0646 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<h2 id=\"part-3-how-to-train-the-ai-model\"><span class=\"ez-toc-section\" id=\"%d9%82%d8%b3%d9%85%d8%aa_3_%da%86%da%af%d9%88%d9%86%d9%87_%d9%85%d8%af%d9%84_%d9%87%d9%88%d8%b4_%d9%85%d8%b5%d9%86%d9%88%d8%b9%db%8c_%d8%b1%d8%a7_%d8%a2%d9%85%d9%88%d8%b2%d8%b4_%d8%af%d9%87%db%8c%d9%85\"><\/span>\u0642\u0633\u0645\u062a 3: \u0686\u06af\u0648\u0646\u0647 \u0645\u062f\u0644 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0631\u0627 \u0622\u0645\u0648\u0632\u0634 \u062f\u0647\u06cc\u0645<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u0633\u0648\u0645\u06cc\u0646 \u0648 \u0622\u062e\u0631\u06cc\u0646 \u0628\u062e\u0634 \u062f\u0631 \u0633\u0627\u062e\u062a \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0634\u0645\u0627\u0633\u062a! <\/p>\n<p>\u062f\u0631 \u0642\u0633\u0645\u062a 1 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u06cc\u06a9 \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u0648 \u062f\u0631 \u0642\u0633\u0645\u062a 2 \u0628\u0647 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u0646\u06af\u0627\u0647 \u06a9\u0631\u062f\u06cc\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f. <\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0627\u0632 \u0627\u06cc\u0646 \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062e\u0648\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 PyTorch \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f!<\/p>\n<h3 id=\"how-to-import-packages\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d9%88%d8%a7%d8%b1%d8%af_%da%a9%d8%b1%d8%af%d9%86_%d8%a8%d8%b3%d8%aa%d9%87_%d9%87%d8%a7\"><\/span>\u0646\u062d\u0648\u0647 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0628\u0633\u062a\u0647 \u0647\u0627<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u062b\u0644 \u0647\u0645\u06cc\u0634\u0647\u060c \u062a\u0645\u0627\u0645 \u0648\u0627\u0631\u062f\u0627\u062a\u06cc \u06a9\u0647 \u062f\u0631 \u0622\u0645\u0648\u0632\u0634 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f \u0631\u0627 \u062f\u0627\u0631\u06cc\u062f.  \u0627\u06a9\u062b\u0631 \u0622\u0646\u0647\u0627 \u0633\u0627\u062f\u0647 \u0647\u0633\u062a\u0646\u062f\u060c \u0627\u0645\u0627 \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f PyTorch \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f\u060c \u06a9\u0647 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc \u06a9\u0646\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0648\u0628 \u0633\u0627\u06cc\u062a \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f. <\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u0645\u06cc \u0628\u0647 \u067e\u0627\u06cc\u06cc\u0646 \u0627\u0633\u06a9\u0631\u0648\u0644 \u06a9\u0646\u06cc\u062f\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0631\u062e\u06cc \u0627\u0632 \u06af\u0632\u06cc\u0646\u0647\u200c\u0647\u0627 \u0631\u0627 \u0645\u06cc\u200c\u0628\u06cc\u0646\u06cc\u062f \u06a9\u0647 \u0627\u0632 \u0686\u0647 \u0633\u0627\u062e\u062a \u0648 \u0633\u06cc\u0633\u062a\u0645 \u0639\u0627\u0645\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f. <\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u0646\u062a\u062e\u0627\u0628 \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc \u0634\u0648\u062f\u060c \u06a9\u062f\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0631\u0627\u06cc \u0646\u0635\u0628 PyTorch \u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f. <\/p>\n<p>\u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0645 \u062f\u0631 \u062a\u0635\u0648\u06cc\u0631 \u0632\u06cc\u0631 \u0645\u0634\u0627\u0647\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0627\u0645\u0627 \u0628\u0647 \u0637\u0648\u0631 \u06a9\u0644\u06cc \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc \u06a9\u0646\u0645 \u0627\u0632 \u0633\u0627\u062e\u062a \u067e\u0627\u06cc\u062f\u0627\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0633\u06cc\u0633\u062a\u0645 \u0639\u0627\u0645\u0644 \u062e\u0648\u062f \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f. <\/p>\n<p>\u0633\u067e\u0633\u060c \u0628\u0633\u062a\u0647 \u0627\u06cc \u0631\u0627 \u06a9\u0647 \u0628\u06cc\u0634\u062a\u0631 \u0628\u0647 \u0622\u0646 \u0639\u0627\u062f\u062a \u062f\u0627\u0631\u06cc\u062f \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f (Conda \u06cc\u0627 <code>pip<\/code> \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0633\u0627\u062f\u0647 \u062a\u0631\u06cc\u0646 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u0628\u0686\u0633\u0628\u0627\u0646\u06cc\u062f). <\/p>\n<p>CUDA 11.7\/11.8 \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f (\u0645\u0647\u0645 \u0646\u06cc\u0633\u062a \u06a9\u062f\u0627\u0645 \u06cc\u06a9) \u0648 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0648\u0631 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u062f\u0631 \u067e\u0627\u06cc\u06cc\u0646 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f.<\/p>\n<figure class=\"kg-card kg-image-card kg-width-wide kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2023\/12\/0_UJVBkAt40X6-FXuV.png\" class=\"kg-image\" alt=\"0_UJVBkAt40X6-FXuV\" width=\"700\" height=\"272\" loading=\"lazy\" title=\"\"><figcaption>\u0627\u0646\u062a\u062e\u0627\u0628 \u0647\u0627\u06cc \u0645\u0646 \u0647\u0646\u06af\u0627\u0645 \u0646\u0635\u0628 PyTorch.<\/figcaption><\/figure>\n<p>\u0633\u067e\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0645\u0627\u0645 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u06a9\u062f \u0632\u06cc\u0631 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">import numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.functional as F\nimport torchvision\nimport torchvision.transforms as transforms\nfrom torch.utils.tensorboard import SummaryWriter\nfrom datetime import datetime\nimport gym\nimport gym_chess\nimport os\nimport chess\nfrom tqdm import tqdm\nfrom gym_chess.alphazero.move_encoding import utils\nfrom pathlib import Path\nfrom typing import Optional\n<\/code><\/pre>\n<h3 id=\"how-to-install-cuda\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d9%86%d8%b5%d8%a8_cuda\"><\/span>\u0646\u062d\u0648\u0647 \u0646\u0635\u0628 CUDA<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0645\u0631\u062d\u0644\u0647 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0627\u0632 \u067e\u0631\u062f\u0627\u0632\u0646\u062f\u0647 \u06af\u0631\u0627\u0641\u06cc\u06a9\u06cc \u062e\u0648\u062f \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u0633\u0631\u06cc\u0639\u062a\u0631 \u0645\u062f\u0644 \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.  \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0646\u06cc\u0633\u062a\u060c \u0627\u0645\u0627 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0622\u0645\u0648\u0632\u0634 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062f\u0631 \u0632\u0645\u0627\u0646 \u0634\u0645\u0627 \u0635\u0631\u0641\u0647 \u062c\u0648\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f. <\/p>\n<p>\u0646\u062d\u0648\u0647 \u0646\u0635\u0628 CUDA \u0628\u0633\u062a\u0647 \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0639\u0627\u0645\u0644 \u0634\u0645\u0627 \u0645\u062a\u0641\u0627\u0648\u062a \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0645\u0646 \u0627\u0632 \u0648\u06cc\u0646\u062f\u0648\u0632 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645 \u0648 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0645.<\/p>\n<p>\u0627\u06af\u0631 \u0627\u0632 MacOS \u06cc\u0627 <a href=\"https:\/\/rasanegaar.com\/blog\/linux-kernel-4x-vulnerability-cve-2019-8912\/\">\u0644\u06cc\u0646\u0648\u06a9\u0633<\/a> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0631\u062f\u0646 \u062f\u0631 \u06af\u0648\u06af\u0644\u060c \u0622\u0645\u0648\u0632\u0634 \u00ab\u0646\u0635\u0628 CUDA Mac\/Linux\u00bb \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 CUDA \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u062f\u0627\u0631\u06cc\u062f (GPU \u0634\u0645\u0627 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0627\u0633\u062a)\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u06a9\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">#check if cuda available\ntorch.cuda.is_available()\n<\/code><\/pre>\n<p>\u06a9\u062f\u0627\u0645 \u062e\u0631\u0648\u062c\u06cc \u0647\u0627 <code>True<\/code> \u0627\u06af\u0631 GPU \u0634\u0645\u0627 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0627\u0633\u062a.  \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0627\u06af\u0631 \u067e\u0631\u062f\u0627\u0632\u0646\u062f\u0647 \u06af\u0631\u0627\u0641\u06cc\u06a9\u06cc \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0646\u062f\u0627\u0631\u06cc\u062f\u060c \u0646\u06af\u0631\u0627\u0646 \u0646\u0628\u0627\u0634\u06cc\u062f\u060c \u062a\u0646\u0647\u0627 \u0646\u0642\u0637\u0647 \u0636\u0639\u0641 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644 \u0628\u06cc\u0634\u062a\u0631 \u0637\u0648\u0644 \u0645\u06cc \u06a9\u0634\u062f\u060c \u06a9\u0647 \u062f\u0631 \u0627\u0646\u062c\u0627\u0645 \u067e\u0631\u0648\u0698\u0647 \u0647\u0627\u06cc \u0633\u0631\u06af\u0631\u0645\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u0686\u0646\u062f\u0627\u0646 \u0645\u0647\u0645 \u0646\u06cc\u0633\u062a.<\/p>\n<h3 id=\"how-to-create-encoding-methods\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d8%a7%db%8c%d8%ac%d8%a7%d8%af_%d8%b1%d9%88%d8%b4_%d9%87%d8%a7%db%8c_%d8%b1%d9%85%d8%b2%da%af%d8%b0%d8%a7%d8%b1%db%8c\"><\/span>\u0646\u062d\u0648\u0647 \u0627\u06cc\u062c\u0627\u062f \u0631\u0648\u0634 \u0647\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0633\u067e\u0633 \u0686\u0646\u062f \u0631\u0648\u0634 \u06a9\u0645\u06a9\u06cc \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0648 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0627\u0632 \u0628\u0633\u062a\u0647 Python Gym-Chess \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u0645. <\/p>\n<p>\u0645\u062c\u0628\u0648\u0631 \u0634\u062f\u0645 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a\u06cc \u062f\u0631 \u0628\u0633\u062a\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0645 \u062a\u0627 \u06a9\u0627\u0631 \u06a9\u0646\u062f.  \u0628\u06cc\u0634\u062a\u0631 \u06a9\u062f\u0647\u0627 \u0627\u0632 \u0628\u0633\u062a\u0647 \u06a9\u067e\u06cc \u0645\u06cc \u0634\u0648\u0646\u062f\u060c \u0641\u0642\u0637 \u0628\u0627 \u0686\u0646\u062f \u062a\u0631\u0641\u0646\u062f \u06a9\u0648\u0686\u06a9 \u0628\u0627\u0639\u062b \u0645\u06cc \u0634\u0648\u062f \u06a9\u062f \u0628\u0647 \u06a9\u0644\u0627\u0633 \u0648 \u063a\u06cc\u0631\u0647 \u0648\u0627\u0628\u0633\u062a\u0647 \u0646\u0628\u0627\u0634\u062f. <\/p>\n<p>\u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u062a\u0645\u0627\u0645 \u06a9\u062f\u0647\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631\u06a9 \u06a9\u0646\u06cc\u062f\u060c \u0632\u06cc\u0631\u0627 \u0631\u0648\u0634\u06cc \u06a9\u0647 Deepmind \u062a\u0645\u0627\u0645 \u062d\u0631\u06a9\u0627\u062a \u0631\u0627 \u062f\u0631 \u0634\u0637\u0631\u0646\u062c \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc \u06a9\u0646\u062f\u060c \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<pre><code class=\"language-py\">#helper methods:\n\n#decoding moves from idx to uci notation\ndef _decodeKnight(action: int) -&gt; Optional[chess.Move]:\n    _NUM_TYPES: int = 8\n\n    #: Starting point of knight moves in last dimension of 8 x 8 x 73 action array.\n    _TYPE_OFFSET: int = 56\n\n    #: Set of possible directions for a knight move, encoded as \n    #: (delta rank, delta square).\n    _DIRECTIONS = utils.IndexedTuple(\n        (+2, +1),\n        (+1, +2),\n        (-1, +2),\n        (-2, +1),\n        (-2, -1),\n        (-1, -2),\n        (+1, -2),\n        (+2, -1),\n    )\n\n    from_rank, from_file, move_type = np.unravel_index(action, (8, 8, 73))\n\n    is_knight_move = (\n        _TYPE_OFFSET &lt;= move_type\n        and move_type &lt; _TYPE_OFFSET + _NUM_TYPES\n    )\n\n    if not is_knight_move:\n        return None\n\n    knight_move_type = move_type - _TYPE_OFFSET\n\n    delta_rank, delta_file = _DIRECTIONS[knight_move_type]\n\n    to_rank = from_rank + delta_rank\n    to_file = from_file + delta_file\n\n    move = utils.pack(from_rank, from_file, to_rank, to_file)\n    return move\n\ndef _decodeQueen(action: int) -&gt; Optional[chess.Move]:\n\n    _NUM_TYPES: int = 56 # = 8 directions * 7 squares max. distance\n\n    #: Set of possible directions for a queen move, encoded as \n    #: (delta rank, delta square).\n    _DIRECTIONS = utils.IndexedTuple(\n        (+1,  0),\n        (+1, +1),\n        ( 0, +1),\n        (-1, +1),\n        (-1,  0),\n        (-1, -1),\n        ( 0, -1),\n        (+1, -1),\n    )\n    from_rank, from_file, move_type = np.unravel_index(action, (8, 8, 73))\n    \n    is_queen_move = move_type &lt; _NUM_TYPES\n\n    if not is_queen_move:\n        return None\n\n    direction_idx, distance_idx = np.unravel_index(\n        indices=move_type,\n        shape=(8,7)\n    )\n\n    direction = _DIRECTIONS[direction_idx]\n    distance = distance_idx + 1\n\n    delta_rank = direction[0] * distance\n    delta_file = direction[1] * distance\n\n    to_rank = from_rank + delta_rank\n    to_file = from_file + delta_file\n\n    move = utils.pack(from_rank, from_file, to_rank, to_file)\n    return move\n\ndef _decodeUnderPromotion(action):\n    _NUM_TYPES: int = 9 # = 3 directions * 3 piece types (see below)\n\n    #: Starting point of underpromotions in last dimension of 8 x 8 x 73 action \n    #: array.\n    _TYPE_OFFSET: int = 64\n\n    #: Set of possibel directions for an underpromotion, encoded as file delta.\n    _DIRECTIONS = utils.IndexedTuple(\n        -1,\n        0,\n        +1,\n    )\n\n    #: Set of possibel piece types for an underpromotion (promoting to a queen\n    #: is implicitly encoded by the corresponding queen move).\n    _PROMOTIONS = utils.IndexedTuple(\n        chess.KNIGHT,\n        chess.BISHOP,\n        chess.ROOK,\n    )\n\n    from_rank, from_file, move_type = np.unravel_index(action, (8, 8, 73))\n\n    is_underpromotion = (\n        _TYPE_OFFSET &lt;= move_type\n        and move_type &lt; _TYPE_OFFSET + _NUM_TYPES\n    )\n\n    if not is_underpromotion:\n        return None\n\n    underpromotion_type = move_type - _TYPE_OFFSET\n\n    direction_idx, promotion_idx = np.unravel_index(\n        indices=underpromotion_type,\n        shape=(3,3)\n    )\n\n    direction = _DIRECTIONS[direction_idx]\n    promotion = _PROMOTIONS[promotion_idx]\n\n    to_rank = from_rank + 1\n    to_file = from_file + direction\n\n    move = utils.pack(from_rank, from_file, to_rank, to_file)\n    move.promotion = promotion\n\n    return move\n\n#primary decoding function, the ones above are just helper functions\ndef decodeMove(action: int, board) -&gt; chess.Move:\n        move = _decodeQueen(action)\n        is_queen_move = move is not None\n\n        if not move:\n            move = _decodeKnight(action)\n\n        if not move:\n            move = _decodeUnderPromotion(action)\n\n        if not move:\n            raise ValueError(f\"{action} is not a valid action\")\n\n        # Actions encode moves from the perspective of the current player. If\n        # this is the black player, the move must be reoriented.\n        turn = board.turn\n        \n        if turn == False: #black to move\n            move = utils.rotate(move)\n\n        # Moving a pawn to the opponent's home rank with a queen move\n        # is automatically assumed to be queen underpromotion. However,\n        # since queenmoves has no reference to the board and can thus not\n        # determine whether the moved piece is a pawn, you have to add this\n        # information manually here\n        if is_queen_move:\n            to_rank = chess.square_rank(move.to_square)\n            is_promoting_move = (\n                (to_rank == 7 and turn == True) or \n                (to_rank == 0 and turn == False)\n            )\n\n            piece = board.piece_at(move.from_square)\n            if piece is None: #NOTE I added this, not entirely sure if it's correct\n                return None\n            is_pawn = piece.piece_type == chess.PAWN\n\n            if is_pawn and is_promoting_move:\n                move.promotion = chess.QUEEN\n\n        return move\n\ndef encodeBoard(board: chess.Board) -&gt; np.array:\n \"\"\"Converts a board to numpy array representation.\"\"\"\n\n array = np.zeros((8, 8, 14), dtype=int)\n\n for square, piece in board.piece_map().items():\n  rank, file = chess.square_rank(square), chess.square_file(square)\n  piece_type, color = piece.piece_type, piece.color\n \n  # The first six planes encode the pieces of the active player, \n  # the following six those of the active player's opponent. Since\n  # this class always stores boards oriented towards the white player,\n  # White is considered to be the active player here.\n  offset = 0 if color == chess.WHITE else 6\n  \n  # Chess enumerates piece types beginning with one, which you have\n  # to account for\n  idx = piece_type - 1\n \n  array[rank, file, idx + offset] = 1\n\n # Repetition counters\n array[:, :, 12] = board.is_repetition(2)\n array[:, :, 13] = board.is_repetition(3)\n\n return array\n <\/code><\/pre>\n<h3 id=\"how-to-load-the-data\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d8%a8%d8%a7%d8%b1%da%af%d8%b0%d8%a7%d8%b1%db%8c_%d8%af%d8%a7%d8%af%d9%87_%d9%87%d8%a7\"><\/span>\u0646\u062d\u0648\u0647 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 \u0642\u0633\u0645\u062a 1\u060c \u0686\u0646\u062f \u0628\u0627\u0632\u06cc \u0634\u0637\u0631\u0646\u062c \u0631\u0627 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u06a9\u0631\u062f\u06cc\u062f\u060c \u0648 \u0633\u067e\u0633 \u062f\u0631 \u0642\u0633\u0645\u062a 2\u060c \u0622\u0646 \u0631\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06a9\u0631\u062f\u06cc\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u06cc\u06a9 \u0645\u062f\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f. <\/p>\n<p>\u0634\u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u0627\u06cc\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u062f\u0631 \u0627\u0634\u06cc\u0627\u0621 \u0628\u0627\u0631\u06af\u0630\u0627\u0631 \u062f\u0627\u062f\u0647 PyTorch \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0627\u0633\u062a.  \u0627\u06af\u0631 \u0642\u0633\u0645\u062a 1 \u06cc\u0627 2 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0646\u062f\u0627\u062f\u0647 \u0627\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0686\u0646\u062f \u0641\u0627\u06cc\u0644 \u0622\u0645\u0648\u0632\u0634\u06cc \u0622\u0645\u0627\u062f\u0647 \u0631\u0627 \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0648\u0634\u0647 Google Drive \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0686\u0646\u062f \u0641\u0631\u0627\u067e\u0627\u0631\u0627\u0645\u062a\u0631 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">FRACTION_OF_DATA = 1\nBATCH_SIZE = 4\n<\/code><\/pre>\n<p>\u0631\u0627 <code>FRACTION_OF_DATA<\/code> \u0645\u062a\u063a\u06cc\u0631\u060c \u0641\u0642\u0637 \u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0628\u062e\u0648\u0627\u0647\u06cc\u062f \u0645\u062f\u0644 \u0631\u0627 \u0633\u0631\u06cc\u0639 \u0622\u0645\u0648\u0632\u0634 \u062f\u0647\u06cc\u062f \u0648 \u0646\u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0631 \u0631\u0648\u06cc \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u06a9\u0627\u0645\u0644 \u0622\u0645\u0648\u0632\u0634 \u062f\u0647\u06cc\u062f.  \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 > 0 \u0648 \u2264 1 \u0628\u0627\u0634\u062f. <\/p>\n<p>\u0631\u0627 <code>BATCH_SIZE<\/code> \u0645\u062a\u063a\u06cc\u0631 \u0627\u0646\u062f\u0627\u0632\u0647 \u062f\u0633\u062a\u0647 \u0627\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u062f\u0644 \u0622\u0645\u0648\u0632\u0634 \u0645\u06cc \u062f\u0647\u062f \u062a\u0639\u06cc\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f.  \u0628\u0647 \u0637\u0648\u0631 \u06a9\u0644\u06cc\u060c \u0627\u0646\u062f\u0627\u0632\u0647 \u062f\u0633\u062a\u0647\u200c\u0627\u06cc \u0628\u0627\u0644\u0627\u062a\u0631 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u062f\u0644 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0633\u0631\u06cc\u0639\u200c\u062a\u0631 \u062a\u0645\u0631\u06cc\u0646 \u06a9\u0646\u062f\u060c \u0627\u0645\u0627 \u0627\u0646\u062f\u0627\u0632\u0647 \u062f\u0633\u062a\u0647 \u0634\u0645\u0627 \u062a\u0648\u0633\u0637 \u0642\u062f\u0631\u062a GPU \u0634\u0645\u0627 \u0645\u062d\u062f\u0648\u062f \u0645\u06cc\u200c\u0634\u0648\u062f. <\/p>\n<p>\u0645\u0646 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0645 \u0628\u0627 \u0633\u0627\u06cc\u0632 \u06a9\u0645 \u062f\u0633\u062a\u0647 4 \u062a\u0633\u062a \u06a9\u0646\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0633\u0639\u06cc \u06a9\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0627\u0641\u0632\u0627\u06cc\u0634 \u062f\u0647\u06cc\u062f \u0648 \u0628\u0628\u06cc\u0646\u06cc\u062f \u06a9\u0647 \u0622\u06cc\u0627 \u0622\u0645\u0648\u0632\u0634 \u0647\u0645\u0686\u0646\u0627\u0646 \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0628\u0627\u06cc\u062f \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06cc\u0627 \u062e\u06cc\u0631.  \u0627\u06af\u0631 \u06cc\u06a9 \u0646\u0648\u0639 \u062e\u0637\u0627\u06cc \u062d\u0627\u0641\u0638\u0647 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062f\u06cc\u062f\u060c \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0646\u062f\u0627\u0632\u0647 \u062f\u0633\u062a\u0647 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u06cc\u062f.<\/p>\n<p>\u0633\u067e\u0633 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0627 \u06a9\u062f \u0632\u06cc\u0631 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u062f.  \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0648\u0634\u0647 \u0648 \u0646\u0627\u0645 \u0641\u0627\u06cc\u0644 \u0634\u0645\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0635\u062d\u06cc\u062d \u0627\u0633\u062a.  \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u067e\u0648\u0634\u0647 \u062f\u0627\u062f\u0647 \u0627\u0648\u0644\u06cc\u0647 \u062f\u0631 \u0647\u0645\u0627\u0646 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u06a9\u062f \u0634\u0645\u0627 \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f. <\/p>\n<p>\u0633\u067e\u0633 \u062f\u0631 \u062f\u0627\u062e\u0644 \u0627\u06cc\u0646 \u067e\u0648\u0634\u0647 \u062f\u0627\u062f\u0647\u060c \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f <code>preparedData<\/code><em> <\/em>\u067e\u0648\u0634\u0647\u060c \u06a9\u0647 \u062d\u0627\u0648\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0631\u0648\u06cc \u0622\u0646\u200c\u0647\u0627 \u0622\u0645\u0648\u0632\u0634 \u062f\u0647\u06cc\u062f.  \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0647\u0627 \u0628\u0627\u06cc\u062f \u0646\u0627\u0645\u06af\u0630\u0627\u0631\u06cc \u0634\u0648\u0646\u062f <code>moves{i}.npy<\/code> \u0648 <code>positions{i}.npy<\/code>\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 i \u0646\u0645\u0627\u06cc\u0647 \u0641\u0627\u06cc\u0644 \u0627\u0633\u062a.  \u0627\u06af\u0631 \u0641\u0627\u06cc\u0644 \u0647\u0627 \u0631\u0627 \u0645\u0627\u0646\u0646\u062f \u0642\u0628\u0644 \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f\u060c \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0628\u0627\u06cc\u062f \u062f\u0631\u0633\u062a \u0628\u0627\u0634\u062f.<\/p>\n<figure class=\"kg-card kg-image-card kg-width-wide kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2023\/12\/0_3LT9odIm09DPFS59.png\" class=\"kg-image\" alt=\"0_3LT9odIm09DPFS59\" width=\"441\" height=\"462\" loading=\"lazy\" title=\"\"><figcaption>\u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0648\u0634\u0647  \u0632\u0631\u062f \u067e\u0648\u0634\u0647\u200c\u0647\u0627 \u0648 \u0641\u06cc\u0631\u0648\u0632\u0647\u200c\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0647\u0633\u062a\u0646\u062f.<\/figcaption><\/figure>\n<pre><code class=\"language-py\">#dataset\n\n#loading training data\n\nallMoves = []\nallBoards = []\n\nfiles = os.listdir('data\/preparedData')\nnumOfEach = len(files) \/\/ 2 # half are moves, other half are positions\n\nfor i in range(numOfEach):\n    try:\n        moves = np.load(f\"data\/preparedData\/moves{i}.npy\", allow_pickle=True)\n        boards = np.load(f\"data\/preparedData\/positions{i}.npy\", allow_pickle=True)\n        if (len(moves) != len(boards)):\n            print(\"ERROR ON i = \", i, len(moves), len(boards))\n        allMoves.extend(moves)\n        allBoards.extend(boards)\n    except:\n        print(\"error: could not load \", i, \", but is still going\")\n\nallMoves = np.array(allMoves)[:(int(len(allMoves) * FRACTION_OF_DATA))]\nallBoards = np.array(allBoards)[:(int(len(allBoards) * FRACTION_OF_DATA))]\nassert len(allMoves) == len(allBoards), \"MUST BE OF SAME LENGTH\"\n\n#flatten out boards\n# allBoards = allBoards.reshape(allBoards.shape[0], -1)\n\ntrainDataIdx = int(len(allMoves) * 0.8)\n\n#NOTE transfer all data to GPU if available\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nallBoards = torch.from_numpy(np.asarray(allBoards)).to(device)\nallMoves = torch.from_numpy(np.asarray(allMoves)).to(device)\n\ntraining_set = torch.utils.data.TensorDataset(allBoards[:trainDataIdx], allMoves[:trainDataIdx])\ntest_set = torch.utils.data.TensorDataset(allBoards[trainDataIdx:], allMoves[trainDataIdx:])\n# Create data loaders for your datasets; shuffle for training, not for validation\n\ntraining_loader = torch.utils.data.DataLoader(training_set, batch_size=BATCH_SIZE, shuffle=True)\nvalidation_loader = torch.utils.data.DataLoader(test_set, batch_size=BATCH_SIZE, shuffle=False)\n<\/code><\/pre>\n<h3 id=\"how-to-define-the-deep-learning-model\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d8%aa%d8%b9%d8%b1%db%8c%d9%81_%d9%85%d8%af%d9%84_%db%8c%d8%a7%d8%af%da%af%db%8c%d8%b1%db%8c_%d8%b9%d9%85%db%8c%d9%82\"><\/span>\u0646\u062d\u0648\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0645\u062f\u0644 \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u0639\u0645\u06cc\u0642<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0633\u067e\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0639\u0645\u0627\u0631\u06cc \u0645\u062f\u0644 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">class Model(torch.nn.Module):\n\n    def __init__(self):\n        super(Model, self).__init__()\n        self.INPUT_SIZE = 896 \n        # self.INPUT_SIZE = 7*7*13 #NOTE changing input size for using cnns\n        self.OUTPUT_SIZE = 4672 # = number of unique moves (action space)\n        \n        #can try to add CNN and pooling here (calculations taking into account spacial features)\n\n        #input shape for sample is (8,8,14), flattened to 1d array of size 896\n        # self.cnn1 = nn.Conv3d(4,4,(2,2,4), padding=(0,0,1))\n        self.activation = torch.nn.ReLU()\n        self.linear1 = torch.nn.Linear(self.INPUT_SIZE, 1000)\n        self.linear2 = torch.nn.Linear(1000, 1000)\n        self.linear3 = torch.nn.Linear(1000, 1000)\n        self.linear4 = torch.nn.Linear(1000, 200)\n        self.linear5 = torch.nn.Linear(200, self.OUTPUT_SIZE)\n        self.softmax = torch.nn.Softmax(1) #use softmax as prob for each move, dim 1 as dim 0 is the batch dimension\n \n    def forward(self, x): #x.shape = (batch size, 896)\n        x = x.to(torch.float32)\n        # x = self.cnn1(x) #for using cnns\n        x = x.reshape(x.shape[0], -1)\n        x = self.linear1(x)\n        x = self.activation(x)\n        x = self.linear2(x)\n        x = self.activation(x)\n        x = self.linear3(x)\n        x = self.activation(x)\n        x = self.linear4(x)\n        x = self.activation(x)\n        x = self.linear5(x)\n        # x = self.softmax(x) #do not use softmax since you are using cross entropy loss\n        return x\n\n    def predict(self, board : chess.Board):\n        \"\"\"takes in a chess board and returns a chess.move object. NOTE: this function should definitely be written better, but it works for now\"\"\"\n        with torch.no_grad():\n            encodedBoard = encodeBoard(board)\n            encodedBoard = encodedBoard.reshape(1, -1)\n            encodedBoard = torch.from_numpy(encodedBoard)\n            res = self.forward(encodedBoard)\n            probs = self.softmax(res)\n\n            probs = probs.numpy()[0] #do not want tensor anymore, 0 since it is a 2d array with 1 row\n\n            #verify that move is legal and can be decoded before returning\n            while len(probs) &gt; 0: #try max 100 times, if not throw an error\n                moveIdx = probs.argmax()\n                try: #TODO should not have try here, but was a bug with idx 499 if it is black to move\n                    uciMove = decodeMove(moveIdx, board)\n                    if (uciMove is None): #could not decode\n                        probs = np.delete(probs, moveIdx)\n                        continue\n                    move = chess.Move.from_uci(str(uciMove))\n                    if (move in board.legal_moves): #if legal, return, else: loop continues after deleting the move\n                        return move \n                except:\n                    pass\n                probs = np.delete(probs, moveIdx) #TODO probably better way to do this, but it is not too time critical as it is only for predictions\n                                             #remove the move so its not chosen again next iteration\n            \n            #TODO can return random move here as well!\n            return None #if no legal moves found, return None<\/code><\/pre>\n<p>\u0634\u0645\u0627 \u0622\u0632\u0627\u062f \u0647\u0633\u062a\u06cc\u062f \u06a9\u0647 \u0645\u0639\u0645\u0627\u0631\u06cc \u0631\u0627 \u0647\u0631 \u0637\u0648\u0631 \u06a9\u0647 \u062f\u0648\u0633\u062a \u062f\u0627\u0631\u06cc\u062f \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f. <\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c \u0645\u0646 \u0641\u0642\u0637 \u0628\u0631\u062e\u06cc \u0627\u0632 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0633\u0627\u062f\u0647 \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0645 \u06a9\u0647 \u0628\u0647 \u062e\u0648\u0628\u06cc \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0631\u062f\u0646\u062f\u060c \u0627\u06af\u0631\u0686\u0647 \u062c\u0627\u06cc\u06cc \u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.  \u0686\u0646\u062f \u0646\u0645\u0648\u0646\u0647 \u0627\u0632 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a\u06cc \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632:<\/p>\n<ol>\n<li>\u0645\u0627\u0698\u0648\u0644\u200c\u0647\u0627\u06cc PyTorch CNN \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f (\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0642\u0628\u0644 \u0627\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0622\u0646\u0647\u0627 \u0622\u0631\u0627\u06cc\u0647 \u0631\u0627 \u0635\u0627\u0641 \u0646\u06a9\u0646\u06cc\u062f)<\/li>\n<li>\u062a\u0648\u0627\u0628\u0639 \u0641\u0639\u0627\u0644 \u0633\u0627\u0632\u06cc \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0647\u0627\u06cc \u0645\u062e\u0641\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f.  \u0645\u0646 \u0627\u06a9\u0646\u0648\u0646 \u0627\u0632 ReLU \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645\u060c \u0627\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 Sigmoid \u06cc\u0627 Tanh \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u060c \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0622\u0646\u0647\u0627 \u0628\u062e\u0648\u0627\u0646\u06cc\u062f.<\/li>\n<li>\u062a\u0639\u062f\u0627\u062f \u0644\u0627\u06cc\u0647 \u0647\u0627\u06cc \u0645\u062e\u0641\u06cc \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f.  \u0647\u0646\u06af\u0627\u0645 \u062a\u063a\u06cc\u06cc\u0631 \u0627\u06cc\u0646\u060c \u0628\u0627\u06cc\u062f \u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0641\u0639\u0627\u0644 \u0633\u0627\u0632\u06cc \u0631\u0627 \u0628\u06cc\u0646 \u0647\u0631 \u0644\u0627\u06cc\u0647 \u062f\u0631 \u0622\u0646 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>forward()<\/code> \u062a\u0627\u0628\u0639.<\/li>\n<li>\u062a\u0639\u062f\u0627\u062f \u0646\u0648\u0631\u0648\u0646 \u0647\u0627 \u0631\u0627 \u062f\u0631 \u0647\u0631 \u0644\u0627\u06cc\u0647 \u067e\u0646\u0647\u0627\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f.  \u0627\u06af\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u062a\u0639\u062f\u0627\u062f \u0646\u0648\u0631\u0648\u0646\u200c\u0647\u0627 \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f\u060c \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u0642\u0627\u0646\u0648\u0646 \u0631\u0627 \u0628\u0647 \u062e\u0627\u0637\u0631 \u0628\u0633\u067e\u0627\u0631\u06cc\u062f \u06a9\u0647 \u062a\u0639\u062f\u0627\u062f \u0646\u0648\u0631\u0648\u0646\u200c\u0647\u0627\u06cc \u0628\u06cc\u0631\u0648\u0646 \u062f\u0631 \u0644\u0627\u06cc\u0647 n \u0628\u0627\u06cc\u062f \u0646\u0648\u0631\u0648\u0646\u200c\u0647\u0627\u06cc \u062f\u0631\u0648\u0646 \u0644\u0627\u06cc\u0647 n+1 \u0628\u0627\u0634\u062f.  \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0645\u062b\u0627\u0644\u060c linear1 1000 \u0646\u0648\u0631\u0648\u0646 \u0631\u0627 \u0645\u06cc \u06af\u06cc\u0631\u062f \u0648 2000 \u0646\u0648\u0631\u0648\u0646 \u0631\u0627 \u062e\u0631\u0648\u062c\u06cc \u0645\u06cc \u062f\u0647\u062f.  \u0633\u067e\u0633 linear2 \u0628\u0627\u06cc\u062f 2000 \u0646\u0648\u0631\u0648\u0646 \u0631\u0627 \u062c\u0630\u0628 \u06a9\u0646\u062f.  \u0633\u067e\u0633 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0632\u0627\u062f\u0627\u0646\u0647 \u062a\u0639\u062f\u0627\u062f \u0646\u0648\u0631\u0648\u0646\u200c\u0647\u0627\u06cc \u062e\u0631\u0648\u062c\u06cc \u0631\u0627 \u062f\u0631 linear2 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f\u060c \u0627\u0645\u0627 \u0645\u0642\u062f\u0627\u0631 \u0628\u0627\u06cc\u062f \u0628\u0627 \u062a\u0639\u062f\u0627\u062f \u0646\u0648\u0631\u0648\u0646\u200c\u0647\u0627\u06cc \u0648\u0631\u0648\u062f\u06cc \u062f\u0631 \u062e\u0637\u06cc 3 \u0648 \u063a\u06cc\u0631\u0647 \u0645\u0637\u0627\u0628\u0642\u062a \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f.  \u0648\u0631\u0648\u062f\u06cc \u0644\u0627\u06cc\u0647 1 \u0648 \u062e\u0631\u0648\u062c\u06cc \u0644\u0627\u06cc\u0647 \u0622\u062e\u0631 \u0628\u0627 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u0634\u0648\u0646\u062f <code>INPUT_SIZE<\/code>\u060c \u0648 <code>OUTPUT_SIZE<\/code>.<\/li>\n<\/ol>\n<p>\u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0645\u0639\u0645\u0627\u0631\u06cc \u0645\u062f\u0644 \u0648 \u062a\u0648\u0627\u0628\u0639 \u0641\u0648\u0631\u0648\u0627\u0631\u062f \u06a9\u0647 \u0647\u0646\u06af\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u062f\u0644 \u0639\u0645\u06cc\u0642 \u0627\u0644\u0632\u0627\u0645\u06cc \u0627\u0633\u062a\u060c a \u0631\u0627 \u0646\u06cc\u0632 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0631\u062f\u0645 <code>predict()<\/code> \u0639\u0645\u0644\u06a9\u0631\u062f\u060c \u062a\u0627 \u062f\u0627\u062f\u0646 \u0645\u0648\u0642\u0639\u06cc\u062a \u0634\u0637\u0631\u0646\u062c \u0628\u0647 \u0645\u062f\u0644 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0634\u0648\u062f \u0648 \u0633\u067e\u0633 \u062d\u0631\u06a9\u062a\u06cc \u06a9\u0647 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0631\u0627 \u062e\u0631\u0648\u062c\u06cc \u0645\u06cc\u200c\u062f\u0647\u062f.<\/p>\n<h3 id=\"how-to-train-the-model\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%ad%d9%88%d9%87_%d8%a2%d9%85%d9%88%d8%b2%d8%b4_%d9%85%d8%af%d9%84\"><\/span>\u0646\u062d\u0648\u0647 \u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u062a\u0645\u0627\u0645 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0631\u0627 \u062f\u0627\u0631\u06cc\u062f \u0648 \u0645\u062f\u0644 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u0634\u0648\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644 \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f.  \u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u06cc\u06a9 \u062f\u0648\u0631\u0647 \u0648 \u0630\u062e\u06cc\u0631\u0647 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0645\u062f\u0644 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">#helper functions for training\ndef train_one_epoch(model, optimizer, loss_fn, epoch_index, tb_writer):\n    running_loss = 0.\n    last_loss = 0.\n\n    # Here, you use enumerate(training_loader) instead of\n    # iter(training_loader) so that you can track the batch\n    # index and do some intra-epoch reporting\n    for i, data in enumerate(training_loader):\n\n        # Every data instance is an input + label pair\n        inputs, labels = data\n\n        # Zero your gradients for every batch!\n        optimizer.zero_grad()\n\n        # Make predictions for this batch\n        outputs = model(inputs)\n\n        # Compute the loss and its gradients\n        loss = loss_fn(outputs, labels)\n        loss.backward()\n\n        # Adjust learning weights\n        optimizer.step()\n\n        # Gather data and report\n        running_loss += loss.item()\n        if i % 1000 == 999:\n            last_loss = running_loss \/ 1000 # loss per batch\n            # print('  batch {} loss: {}'.format(i + 1, last_loss))\n            tb_x = epoch_index * len(training_loader) + i + 1\n            tb_writer.add_scalar('Loss\/train', last_loss, tb_x)\n            running_loss = 0.\n\n    return last_loss\n\n#the 3 functions below help store the best model you have created yet\ndef createBestModelFile():\n    #first find best model if it exists:\n    folderPath = Path('.\/savedModels')\n    if (not folderPath.exists()):\n        os.mkdir(folderPath)\n\n    path = Path('.\/savedModels\/bestModel.txt')\n\n    if (not path.exists()):\n        #create the files\n        f = open(path, \"w\")\n        f.write(\"10000000\") #set to high number so it is overwritten with better loss\n        f.write(\"\\ntestPath\")\n        f.close()\n\ndef saveBestModel(vloss, pathToBestModel):\n    f = open(\".\/savedModels\/bestModel.txt\", \"w\")\n    f.write(str(vloss.item()))\n    f.write(\"\\n\")\n    f.write(pathToBestModel)\n    print(\"NEW BEST MODEL FOUND WITH LOSS:\", vloss)\n\ndef retrieveBestModelInfo():\n    f = open('.\/savedModels\/bestModel.txt', \"r\")\n    bestLoss = float(f.readline())\n    bestModelPath = f.readline()\n    f.close()\n    return bestLoss, bestModelPath\n<\/code><\/pre>\n<p>\u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u062a\u0627\u0628\u0639 \u062f\u0631 \u0627\u0635\u0644 \u0627\u0632 \u0627\u0633\u0646\u0627\u062f PyTorch \u06a9\u067e\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0628\u0627 \u06cc\u06a9 \u062a\u063a\u06cc\u06cc\u0631 \u062c\u0632\u0626\u06cc \u0628\u0627 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0645\u062f\u0644\u060c \u0628\u0647\u06cc\u0646\u0647 \u0633\u0627\u0632 \u0648 \u062a\u0627\u0628\u0639 \u0636\u0631\u0631 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u062a\u0627\u0628\u0639.<\/p>\n<p>\u0633\u067e\u0633 \u0627\u0628\u0631\u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627 \u0631\u0627 \u0645\u0627\u0646\u0646\u062f \u0632\u06cc\u0631 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u062f.  \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u0686\u06cc\u0632\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u0628\u06cc\u0634\u062a\u0631 \u0645\u062f\u0644 \u062e\u0648\u062f \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/p>\n<pre><code class=\"language-py\">#hyperparameters\nEPOCHS = 60\nLEARNING_RATE = 0.001\nMOMENTUM = 0.9\n<\/code><\/pre>\n<p>\u0622\u0645\u0648\u0632\u0634 \u0631\u0627 \u0628\u0627 \u06a9\u062f \u0632\u06cc\u0631 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">#run training\n\ncreateBestModelFile()\n\nbestLoss, bestModelPath = retrieveBestModelInfo()\n\ntimestamp = datetime.now().strftime('%Y%m%d_%H%M%S')\nwriter = SummaryWriter('runs\/fashion_trainer_{}'.format(timestamp))\nepoch_number = 0\n\nmodel = Model()\nloss_fn = torch.nn.CrossEntropyLoss()\noptimizer = torch.optim.SGD(model.parameters(), lr=LEARNING_RATE, momentum=MOMENTUM)\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nmodel.to(device)\n\nbest_vloss = 1_000_000.\n\nfor epoch in tqdm(range(EPOCHS)):\n    if (epoch_number % 5 == 0):\n        print('EPOCH {}:'.format(epoch_number + 1))\n\n    # Make sure gradient tracking is on, and do a pass over the data\n    model.train(True)\n    avg_loss = train_one_epoch(model, optimizer, loss_fn, epoch_number, writer)\n\n    running_vloss = 0.0\n    # Set the model to evaluation mode, disabling dropout and using population\n    # statistics for batch normalization.\n\n    model.eval()\n\n    # Disable gradient computation and reduce memory consumption.\n    with torch.no_grad():\n        for i, vdata in enumerate(validation_loader):\n            vinputs, vlabels = vdata\n            voutputs = model(vinputs)\n\n            vloss = loss_fn(voutputs, vlabels)\n            running_vloss += vloss\n\n    avg_vloss = running_vloss \/ (i + 1)\n\n    #only print every 5 epochs\n    if epoch_number % 5 == 0:\n        print('LOSS train {} valid {}'.format(avg_loss, avg_vloss))\n\n    # Log the running loss averaged per batch\n    # for both training and validation\n    writer.add_scalars('Training vs. Validation Loss',\n                    { 'Training' : avg_loss, 'Validation' : avg_vloss },\n                    epoch_number + 1)\n    writer.flush()\n\n    # Track best performance, and save the model's state\n    if avg_vloss &lt; best_vloss:\n        best_vloss = avg_vloss\n\n        if (bestLoss &gt; best_vloss): #if better than previous best loss from all models created, save it\n            model_path=\"savedModels\/model_{}_{}\".format(timestamp, epoch_number)\n            torch.save(model.state_dict(), model_path)\n            saveBestModel(best_vloss, model_path)\n\n    epoch_number += 1\n\nprint(\"\\n\\nBEST VALIDATION LOSS FOR ALL MODELS: \", bestLoss)\n<\/code><\/pre>\n<p>\u0627\u06cc\u0646 \u06a9\u062f \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0647 \u0634\u062f\u062a \u0627\u0632 \u0627\u0633\u0646\u0627\u062f PyTorch \u0627\u0644\u0647\u0627\u0645 \u06af\u0631\u0641\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0633\u062a\u0647 \u0628\u0647 \u062a\u0639\u062f\u0627\u062f \u0644\u0627\u06cc\u0647\u200c\u0647\u0627\u06cc \u0645\u062f\u0644\u060c \u062a\u0639\u062f\u0627\u062f \u0646\u0648\u0631\u0648\u0646\u200c\u0647\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647\u200c\u0647\u0627\u060c \u062a\u0639\u062f\u0627\u062f \u062f\u0648\u0631\u0647\u200c\u0647\u0627\u060c \u0627\u06af\u0631 \u0627\u0632 GPU \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f \u06cc\u0627 \u0646\u0647\u060c \u0648 \u0686\u0646\u062f\u06cc\u0646 \u0639\u0627\u0645\u0644 \u062f\u06cc\u06af\u0631\u060c \u0632\u0645\u0627\u0646 \u0634\u0645\u0627 \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0627\u0632 \u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647 \u062a\u0627 \u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647 \u0637\u0648\u0644 \u0628\u06a9\u0634\u062f. \u0633\u0627\u0639\u062a \u0647\u0627. <\/p>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0632\u06cc\u0631 \u0645\u06cc \u0628\u06cc\u0646\u06cc\u062f\u060c \u0632\u0645\u0627\u0646 \u062a\u062e\u0645\u06cc\u0646\u06cc \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644 \u0645\u0646 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u062d\u062f\u0648\u062f 2 \u062f\u0642\u06cc\u0642\u0647 \u0628\u0648\u062f.<\/p>\n<figure class=\"kg-card kg-image-card kg-width-wide kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2023\/12\/0_-JEKRkXNUxXy4CYh.gif\" class=\"kg-image\" alt=\"0_-JEKRkXNUxXy4CYh\" width=\"628\" height=\"267\" loading=\"lazy\" title=\"\"><figcaption>\u0641\u06cc\u0644\u0645 \u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644.  \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 LICEcap \u0636\u0628\u0637 \u0634\u062f\u0647 \u0627\u0633\u062a<\/figcaption><\/figure>\n<h3 id=\"how-to-test-your-model\"><span class=\"ez-toc-section\" id=\"%da%86%da%af%d9%88%d9%86%d9%87_%d9%85%d8%af%d9%84_%d8%ae%d9%88%d8%af_%d8%b1%d8%a7_%d8%aa%d8%b3%d8%aa_%da%a9%d9%86%db%8c%d9%85\"><\/span>\u0686\u06af\u0648\u0646\u0647 \u0645\u062f\u0644 \u062e\u0648\u062f \u0631\u0627 \u062a\u0633\u062a \u06a9\u0646\u06cc\u0645<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u062f\u0644 \u0634\u0645\u0627 \u0628\u062e\u0634 \u0645\u0647\u0645\u06cc \u0627\u0632 \u0628\u0631\u0631\u0633\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f \u06cc\u0627 \u062e\u06cc\u0631.  \u0645\u0646 \u062f\u0648 \u0631\u0648\u0634 \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0645\u062f\u0644 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0631\u062f\u0647 \u0627\u0645:<\/p>\n<h4 id=\"yourself-vs-ai\">\u062e\u0648\u062f\u062a \u062f\u0631 \u0645\u0642\u0627\u0628\u0644 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc<\/h4>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0631\u0627\u0647 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u062e\u0648\u062f\u062a\u0627\u0646 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0628\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f.  \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0634\u0645\u0627 \u062a\u0635\u0645\u06cc\u0645 \u0645\u06cc \u06af\u06cc\u0631\u06cc\u062f \u06a9\u0647 \u06cc\u06a9 \u062d\u0631\u06a9\u062a \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f\u060c \u0633\u067e\u0633 \u0628\u0647 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u06cc\u062f \u062d\u0631\u06a9\u062a \u0631\u0627 \u062a\u0639\u06cc\u06cc\u0646 \u06a9\u0646\u062f \u0648 \u063a\u06cc\u0631\u0647.  \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc \u06a9\u0646\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0646\u0648\u062a \u0628\u0648\u06a9 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u06cc\u062f \u0633\u0644\u0648\u0644 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u0645\u062e\u062a\u0644\u0641 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0645\u062f\u0644\u06cc \u0631\u0627 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0627\u0632 \u0622\u0645\u0648\u0632\u0634 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.  \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c \u0645\u0646 \u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0627\u0632 \u0641\u0627\u06cc\u0644\u06cc \u06a9\u0647 \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u0645\u060c \u06a9\u0647 \u0645\u0633\u06cc\u0631 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0645\u062f\u0644 \u0634\u0645\u0627 \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u0644\u0628\u062a\u0647 \u0634\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0635\u0648\u0631\u062a \u062f\u0633\u062a\u06cc \u0645\u0633\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u0645\u062f\u0644\u06cc \u06a9\u0647 \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc \u062f\u0647\u06cc\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f.<\/p>\n<pre><code class=\"language-py\">saved_model = Model()\n\n#load best model path from your file\nf = open(\".\/savedModels\/bestModel.txt\", \"r\")\nbestLoss = float(f.readline())\nmodel_path = f.readline()\nf.close()\n\nmodel.load_state_dict(torch.load(model_path))\n<\/code><\/pre>\n<p>\u0633\u067e\u0633 \u0635\u0641\u062d\u0647 \u0634\u0637\u0631\u0646\u062c \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">#play your own game\nboard = chess.Board()\n<\/code><\/pre>\n<p>\u0633\u067e\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u0627\u062c\u0631\u0627\u06cc \u06a9\u062f \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u0633\u0644\u0648\u0644 \u0632\u06cc\u0631 \u0628\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0631\u0634\u062a\u0647 \u062f\u0631 \u062e\u0637 \u0627\u0648\u0644 \u062d\u0631\u06a9\u062a\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f.  \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u06cc\u06a9 \u062d\u0631\u06a9\u062a \u0642\u0627\u0646\u0648\u0646\u06cc \u0627\u0633\u062a:<\/p>\n<pre><code class=\"language-py\">moveStr = \"e2e4\"\nmove = chess.Move.from_uci(moveStr)\nboard.push(move)\n<\/code><\/pre>\n<p>\u0633\u067e\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u062d\u0631\u06a9\u062a \u0628\u0639\u062f\u06cc \u0631\u0627 \u0628\u0627 \u0633\u0644\u0648\u0644 \u0632\u06cc\u0631 \u062a\u0639\u06cc\u06cc\u0646 \u06a9\u0646\u062f:<\/p>\n<pre><code class=\"language-py\">#make ai move:\naiMove = saved_model.predict(board)\nboard.push(aiMove)\nboard\n<\/code><\/pre>\n<p>\u0627\u06cc\u0646 \u062d\u0627\u0644\u062a \u062a\u062e\u062a\u0647 \u0631\u0627 \u0646\u06cc\u0632 \u0686\u0627\u067e \u0645\u06cc \u06a9\u0646\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u06cc\u062f \u0631\u0627\u062d\u062a \u062a\u0631 \u062a\u0635\u0645\u06cc\u0645 \u0628\u06af\u06cc\u0631\u06cc\u062f \u06a9\u0647 \u062d\u0631\u06a9\u062a \u062e\u0648\u062f \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f:<\/p>\n<figure class=\"kg-card kg-image-card kg-width-wide kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2023\/12\/0_mkYWyk2zoU01fyEj.png\" class=\"kg-image\" alt=\"0_mkYWyk2zoU01fyEj\" width=\"286\" height=\"290\" loading=\"lazy\" title=\"\"><figcaption>\u0686\u0627\u067e \u0648\u0636\u0639\u06cc\u062a \u0628\u0631\u062f \u067e\u0633 \u0627\u0632 \u062d\u0631\u06a9\u062a \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc<\/figcaption><\/figure>\n<p>\u0628\u0647 \u0627\u0646\u062c\u0627\u0645 \u0647\u0631 \u062d\u0631\u06a9\u062a \u062f\u06cc\u06af\u0631\u06cc \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u06cc\u062f\u060c \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0647\u0631 \u062d\u0631\u06a9\u062a \u062f\u06cc\u06af\u0631\u06cc \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u062f \u0648 \u0628\u0628\u06cc\u0646\u06cc\u062f \u0686\u0647 \u06a9\u0633\u06cc \u0628\u0631\u0646\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f!<\/p>\n<p>\u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u0632 \u062d\u0631\u06a9\u062a\u06cc \u067e\u0634\u06cc\u0645\u0627\u0646 \u0634\u0648\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\">#regret move:\nboard.pop()\n<\/code><\/pre>\n<h4 id=\"stockfish-vs-your-ai\">Stockfish \u062f\u0631 \u0645\u0642\u0627\u0628\u0644 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0634\u0645\u0627<\/h4>\n<p>\u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u062a\u0646\u0638\u06cc\u0645 Stockfish \u0631\u0648\u06cc \u06cc\u06a9 ELO \u062e\u0627\u0635\u060c \u0641\u0631\u0622\u06cc\u0646\u062f \u0622\u0632\u0645\u0627\u06cc\u0634 \u0631\u0627 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u0622\u0646 \u0628\u0627\u0632\u06cc \u06a9\u0646\u062f:<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0645\u062f\u0644 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f (\u062d\u062a\u0645\u0627\u064b \u0622\u0646 \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f <code>model_path<\/code> \u0628\u0647 \u0645\u062f\u0644 \u062e\u0648\u062f\u062a\u0648\u0646):<\/p>\n<pre><code class=\"language-py\">saved_model = Model()\nmodel_path = \"savedModels\/model_14020702_150228_46\" #TODO CHANGE THIS PATH\nmodel.load_state_dict(torch.load(model_path))\n<\/code><\/pre>\n<p>\u0633\u067e\u0633 Stockfish \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0631\u0648\u06cc \u06cc\u06a9 ELO \u062e\u0627\u0635 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.  \u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0645\u0633\u06cc\u0631 \u0645\u0648\u062a\u0648\u0631 Stockfish \u0631\u0627 \u0628\u0647 \u0645\u0633\u06cc\u0631 \u062e\u0648\u062f \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 Stockfish \u062f\u0627\u0631\u06cc\u062f \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f:<\/p>\n<pre><code class=\"language-py\"># test elo  against stockfish\nELO_RATING = 500\nfrom stockfish import Stockfish\n#TODO CHANGE PATH BELOW\nstockfish = Stockfish(path=r\"C:\\Users\\eivin\\Documents\\ownProgrammingProjects18061402\\ChessEngine\\stockfish\\stockfish\\stockfish-windows-2022-x86-64-avx2\")\nstockfish.set_elo_rating(ELO_RATING)\n<\/code><\/pre>\n<p>\u0631\u062a\u0628\u0647 100 ELO \u0628\u0633\u06cc\u0627\u0631 \u0628\u062f \u0627\u0633\u062a \u0648 \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u06cc\u0645 \u0645\u0648\u062a\u0648\u0631 \u0634\u0645\u0627 \u0627\u0632 \u0622\u0646 \u0639\u0628\u0648\u0631 \u06a9\u0646\u062f.<\/p>\n<p>\u0633\u067e\u0633 \u0628\u0627\u0632\u06cc \u0631\u0627 \u0628\u0627 \u0627\u06cc\u0646 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<pre><code class=\"language-py\">board = chess.Board()\nallMoves = [] #list of strings for saving moves for setting pos for stockfish\n\nMAX_NUMBER_OF_MOVES = 150\nfor i in range(MAX_NUMBER_OF_MOVES): #set a limit for the game\n\n #first my ai move\n try:\n  move = saved_model.predict(board)\n  board.push(move)\n  allMoves.append(str(move)) #add so stockfish can see\n except:\n  print(\"game over. You lost\")\n  break\n\n # #then get stockfish move\n stockfish.set_position(allMoves)\n stockfishMove = stockfish.get_best_move_time(3)\n allMoves.append(stockfishMove)\n stockfishMove = chess.Move.from_uci(stockfishMove)\n board.push(stockfishMove)\n\nstockfish.reset_engine_parameters() #reset elo rating\n\nboard\n<\/code><\/pre>\n<p>\u06a9\u0647 \u0628\u0639\u062f \u0627\u0632 \u067e\u0627\u06cc\u0627\u0646 \u0628\u0627\u0632\u06cc \u0645\u0648\u0642\u0639\u06cc\u062a \u062a\u0627\u0628\u0644\u0648 \u0631\u0627 \u0686\u0627\u067e \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<figure class=\"kg-card kg-image-card kg-width-wide kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/rasanegar.com\/blog\/wp-content\/uploads\/2023\/12\/0_TmLzgIp2R5_bNyy7.png\" class=\"kg-image\" alt=\"0_TmLzgIp2R5_bNyy7\" width=\"355\" height=\"385\" loading=\"lazy\" title=\"\"><figcaption>\u0628\u0639\u062f \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0634\u0645\u0627 \u06cc\u06a9 \u0628\u0627\u0632\u06cc \u0631\u0627 \u0628\u0647 Stockfish \u0628\u0627\u062e\u062a\u060c \u0645\u0648\u0642\u0639\u06cc\u062a \u062e\u0648\u062f \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f<\/figcaption><\/figure>\n<h3 id=\"reflection-on-the-performance-of-the-chess-engine\"><span class=\"ez-toc-section\" id=\"%d8%aa%d8%a3%d9%85%d9%84_%d8%af%d8%b1_%d8%b9%d9%85%d9%84%da%a9%d8%b1%d8%af_%d9%85%d9%88%d8%aa%d9%88%d8%b1_%d8%b4%d8%b7%d8%b1%d9%86%d8%ac\"><\/span>\u062a\u0623\u0645\u0644 \u062f\u0631 \u0639\u0645\u0644\u06a9\u0631\u062f \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0646 \u0633\u0639\u06cc \u06a9\u0631\u062f\u0645 \u0645\u062f\u0644 \u0631\u0627 \u062f\u0631 \u062d\u062f\u0648\u062f 100 \u0647\u0632\u0627\u0631 \u0645\u0648\u0642\u0639\u06cc\u062a \u0648 \u062d\u0631\u06a9\u062a \u0622\u0645\u0648\u0632\u0634 \u062f\u0647\u0645 \u0648 \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f \u0645\u062f\u0644 \u0647\u0646\u0648\u0632 \u0628\u0631\u0627\u06cc \u0634\u06a9\u0633\u062a \u062f\u0627\u062f\u0646 \u06cc\u06a9 \u0631\u0628\u0627\u062a \u0634\u0637\u0631\u0646\u062c \u0633\u0637\u062d \u067e\u0627\u06cc\u06cc\u0646 (500 ELO) \u06a9\u0627\u0641\u06cc \u0646\u06cc\u0633\u062a. <\/p>\n<p>\u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0644\u0627\u06cc\u0644 \u0645\u062e\u062a\u0644\u0641\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f.  \u0634\u0637\u0631\u0646\u062c \u06cc\u06a9 \u0628\u0627\u0632\u06cc \u0628\u0633\u06cc\u0627\u0631 \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0627\u0633\u062a\u060c \u06a9\u0647 \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0628\u0647 \u062d\u0631\u06a9\u0627\u062a \u0648 \u0645\u0648\u0642\u0639\u06cc\u062a \u0647\u0627\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0628\u06cc\u0634\u062a\u0631\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f \u062a\u0627 \u06cc\u06a9 \u0631\u0628\u0627\u062a \u0645\u0646\u0627\u0633\u0628 \u062a\u0648\u0633\u0639\u0647 \u06cc\u0627\u0628\u062f.<\/p>\n<p>\u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0686\u0646\u062f\u06cc\u0646 \u0639\u0646\u0635\u0631 \u0627\u0632 \u0631\u0628\u0627\u062a\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc \u062f\u0647\u06cc\u062f \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0628\u0627\u0644\u0642\u0648\u0647 \u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u0622\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc \u06a9\u0646\u062f.  \u0645\u0639\u0645\u0627\u0631\u06cc \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u06cc\u062f\u060c \u0628\u0631\u0627\u06cc \u0645\u062b\u0627\u0644 \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u06cc\u06a9 CNN \u062f\u0631 \u0627\u0628\u062a\u062f\u0627\u06cc \u062a\u0627\u0628\u0639 \u062c\u0644\u0648\u060c \u0628\u0647 \u0637\u0648\u0631\u06cc \u06a9\u0647 \u0631\u0628\u0627\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u06a9\u0627\u0646\u06cc \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u062f.<\/p>\n<p>  \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0639\u062f\u0627\u062f \u0644\u0627\u06cc\u0647\u200c\u0647\u0627\u06cc \u067e\u0646\u0647\u0627\u0646 \u062f\u0631 \u0644\u0627\u06cc\u0647\u200c\u0647\u0627\u06cc \u06a9\u0627\u0645\u0644\u0627\u064b \u0645\u062a\u0635\u0644 \u06cc\u0627 \u062a\u0639\u062f\u0627\u062f \u0646\u0648\u0631\u0648\u0646\u200c\u0647\u0627\u06cc \u0647\u0631 \u0644\u0627\u06cc\u0647 \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f. <\/p>\n<p>\u06cc\u06a9 \u0631\u0627\u0647 \u0645\u0637\u0645\u0626\u0646 \u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u0628\u06cc\u0634\u062a\u0631 \u0645\u062f\u0644\u060c \u062a\u063a\u0630\u06cc\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0628\u0647 \u0622\u0646 \u0627\u0633\u062a\u060c \u0632\u06cc\u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062f \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0628\u0647 \u062a\u0639\u062f\u0627\u062f \u0646\u0627\u0645\u062d\u062f\u0648\u062f\u06cc \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0631\u06cc\u062f. <\/p>\n<p>\u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0645\u0646 \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0646\u0645 \u0627\u06cc\u0646 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u062a\u0642\u0644\u06cc\u062f\u06cc \u06cc\u0627 \u0628\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0632\u06cc\u0627\u062f\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f \u06cc\u0627 \u0622\u0645\u0648\u0632\u0634 \u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0635\u0631\u0641\u0627\u064b \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u062a\u0642\u0644\u06cc\u062f\u06cc \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0627\u06cc\u062f\u0647 \u0645\u0637\u0644\u0648\u0628\u06cc \u0646\u0628\u0627\u0634\u062f. <\/p>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u062a\u0642\u0644\u06cc\u062f\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0628\u062e\u0634\u06cc \u0627\u0632 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0642\u0631\u0627\u0631 \u06af\u06cc\u0631\u062f\u060c \u0628\u0631\u0627\u06cc \u0645\u062b\u0627\u0644\u060c \u0627\u06af\u0631 \u0631\u0648\u0634 \u0647\u0627\u06cc \u062c\u0633\u062a\u062c\u0648\u06cc \u0633\u0646\u062a\u06cc \u0631\u0627 \u0646\u06cc\u0632 \u067e\u06cc\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0648 \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u062a\u0642\u0644\u06cc\u062f \u0631\u0627 \u0628\u0647 \u0622\u0646 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<h2 id=\"conclusion\"><span class=\"ez-toc-section\" id=\"%d9%86%d8%aa%db%8c%d8%ac%d9%87\"><\/span>\u0646\u062a\u06cc\u062c\u0647<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062a\u0628\u0631\u06cc\u06a9 \u0645\u06cc\u06af\u0645  \u0634\u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0633\u0627\u062e\u062a\u0647 \u0627\u06cc\u062f \u0648 \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645 \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647 \u0686\u06cc\u0632\u06cc \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f.  \u0627\u06af\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u06cc\u0646 \u0645\u0648\u062a\u0648\u0631 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0628\u0628\u062e\u0634\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0627\u0626\u0645\u0627\u064b \u0622\u0646 \u0631\u0627 \u0628\u0647\u062a\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0631\u0642\u0627\u0628\u062a \u0628\u0647\u062a\u0631 \u0648 \u0628\u0647\u062a\u0631\u06cc \u0631\u0627 \u067e\u0634\u062a \u0633\u0631 \u0645\u06cc\u200c\u06af\u0630\u0627\u0631\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u062f \u06a9\u0627\u0645\u0644 \u06a9\u0646\u06cc\u062f\u060c \u0628\u0647 GitHub \u0645\u0646 \u0633\u0631 \u0628\u0632\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u062f\u0631 \u0627\u0635\u0644 \u0642\u0633\u0645\u062a \u0628\u0647 \u0642\u0633\u0645\u062a \u062f\u0631 \u0631\u0633\u0627\u0646\u0647 \u0645\u0646 \u0646\u0648\u0634\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0647\u0631 \u0642\u0633\u0645\u062a \u0631\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<ul>\n<li>\u0628\u062e\u0634 1: \u062a\u0648\u0644\u06cc\u062f \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647<\/li>\n<li>\u0642\u0633\u0645\u062a 2: \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0628\u0627 \u0631\u0648\u0634 AlphaZero<\/li>\n<li>\u0642\u0633\u0645\u062a 3: \u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644<\/li>\n<\/ul>\n<p>\u0627\u06af\u0631 \u0639\u0644\u0627\u0642\u0647 \u0645\u0646\u062f \u0647\u0633\u062a\u06cc\u062f \u0648 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u0648\u0636\u0648\u0639\u0627\u062a \u0645\u0634\u0627\u0628\u0647 \u0628\u06cc\u0634\u062a\u0631 \u0628\u062f\u0627\u0646\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0646 \u0631\u0627 \u062f\u0631 \u0627\u06cc\u0646 \u0622\u062f\u0631\u0633 \u0628\u06cc\u0627\u0628\u06cc\u062f:<\/p>\n<ul>\n<li>\u2705 \u0645\u062a\u0648\u0633\u0637<\/li>\n<li><a href=\"https:\/\/twitter.com\/Ravenspike21\" target=\"_blank\" rel=\"noopener\"><\/a><a href=\"https:\/\/twitter.com\/Ravenspike21\" target=\"_blank\" rel=\"noopener\">\u2705<\/a> <a href=\"https:\/\/twitter.com\/Ravenspike21\" target=\"_blank\" rel=\"noopener\">\u062a\u0648\u06cc\u06cc\u062a\u0631<\/a><\/li>\n<li><a href=\"https:\/\/twitter.com\/Ravenspike21\" target=\"_blank\" rel=\"noopener\">\u2705<\/a> <a href=\"https:\/\/twitter.com\/Ravenspike21\" target=\"_blank\" rel=\"noopener\">L<\/a>inkedIn<\/li>\n<\/ul>\n<\/section>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><br \/>\n<br \/><br \/>\n<br \/>\u0645\u0646\u062a\u0634\u0631 \u0634\u062f\u0647 \u062f\u0631 1402-12-26 13:41:04<br \/>\n<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-center kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;center&quot;,&quot;id&quot;:&quot;9675&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;5&quot;,&quot;greet&quot;:&quot;\u0627\u0645\u062a\u06cc\u0627\u0632 \u0634\u0645\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0637\u0644\u0628&quot;,&quot;legend&quot;:&quot;0\\\/5 (0 \u0631\u0627\u06cc)&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;\u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062e\u0648\u062f\u0628\u0627\u0632\u06cc \u0631\u0627 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0628\u0627 \u0622\u0645\u0648\u0632\u0634 \u062a\u0642\u0644\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ({count} \u0631\u0627\u06cc)&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-left: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            <span class=\"kksr-muted\">\u0627\u0645\u062a\u06cc\u0627\u0632 \u0634\u0645\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0637\u0644\u0628<\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">\u0632\u0645\u0627\u0646 \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0645\u0637\u0627\u0644\u0639\u0647: <\/span> <span class=\"rt-time\"> 24<\/span> <span class=\"rt-label rt-postfix\">\u062f\u0642\u06cc\u0642\u0647<\/span><\/span>\u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0627\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0686\u06af\u0648\u0646\u06af\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0627\u0633\u062a \u06a9\u0647 \u06a9\u0627\u0645\u0644\u0627\u064b \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062f\u0645 \u062a\u0627 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062e\u0648\u062f\u0645 \u0631\u0627 \u0633\u0627\u062e\u062a\u0645. \u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u0648\u062a\u0648\u0631 \u0634\u0637\u0631\u0646\u062c \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u06a9\u0627\u0631 \u0646\u0633\u0628\u062a\u0627\u064b \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0627\u0633\u062a\u060c \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0637\u0648\u0644\u0627\u0646\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f\u060c \u0627\u0645\u0627 \u0628\u0627 \u0645\u0627 \u0647\u0645\u0631\u0627\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c \u0632\u06cc\u0631\u0627 \u0645\u062d\u0635\u0648\u0644\u06cc [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":9676,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1743,1686],"tags":[1747,1958,1313,1938,2348,1776,1916,1936,1779,2349,1959,2347,1803,2344,1806,2346,2343,1745,2345,825,1813],"class_list":["post-9675","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","category-ai","tag-python-vps","tag-1958","tag-1313","tag-1938","tag-2348","tag-1776","tag-1916","tag-1936","tag-1779","tag-2349","tag-1959","tag-2347","tag-1803","tag-2344","tag-1806","tag-2346","tag-2343","tag-1745","tag-2345","tag-825","tag-1813"],"acf":[],"_links":{"self":[{"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/posts\/9675","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/comments?post=9675"}],"version-history":[{"count":0,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/posts\/9675\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/media\/9676"}],"wp:attachment":[{"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/media?parent=9675"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/categories?post=9675"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rasanegaar.com\/blog\/wp-json\/wp\/v2\/tags?post=9675"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}