Стъпка по стъпка ръководство за изграждане на обикновен AI за шах

Нека да разгледаме някои основни понятия, които ще ни помогнат да създадем проста ИИ за шах:

  • ход поколение
  • бордова оценка
  • Минимакс
  • и алфа бета резитба.

На всяка стъпка ще подобрим алгоритъма си с една от тези тествани във времето техники за програмиране на шах. Ще демонстрирам как всеки от тях влияе върху стила на игра на алгоритъма.

Можете да видите окончателния AI алгоритъм тук на GitHub.

Стъпка 1: Преместете генерирането и визуализацията на борда

Ще използваме библиотеката chess.js за генериране на движения, а chessboard.js за визуализиране на дъската. Библиотеката с поколено движение основно прилага всички правила на шаха. Въз основа на това можем да изчислим всички законни ходове за дадено състояние на борда.

Визуализация на функцията за генериране на движение. Началната позиция се използва като вход, а изходът е всички възможни движения от това положение.

Използването на тези библиотеки ще ни помогне да се съсредоточим само върху най-интересната задача: създаване на алгоритъма, който намира най-добрия ход.

Ще започнем със създаването на функция, която просто връща произволен ход от всички възможни ходове:

Въпреки че този алгоритъм не е много солиден шахматист, това е добра отправна точка, тъй като всъщност можем да играем срещу него:

Черното играе произволни ходове. Възпроизвежда се на https://jsfiddle.net/lhartikk/m14epfwb/4

Стъпка 2: Оценка на позицията

Сега нека се опитаме да разберем коя страна е по-силна в определена позиция. Най-простият начин да постигнете това е да преброите относителната сила на парчетата на дъската, като използвате следната таблица:

С функцията за оценка можем да създадем алгоритъм, който избира хода, който дава най-висока оценка:

Единственото осезаемо подобрение е, че нашият алгоритъм вече ще улови парче, ако може.

Черното играе с помощта на простата функция за оценка. Възпроизвежда се на https://jsfiddle.net/lhartikk/m5q6fgtb/1/

Стъпка 3: Търсете дърво с помощта на Minimax

След това ще създадем дърво за търсене, от което алгоритъмът може да избере най-добрия ход. Това става с помощта на алгоритъма Minimax.

В този алгоритъм рекурсивното дърво на всички възможни движения се изследва до дадена дълбочина и позицията се оценява в крайните „листа“ на дървото.

След това връщаме или най-малката, или най-голямата стойност на детето към родителския възел, в зависимост от това дали е бяло или черно за придвижване. (Тоест, ние се опитваме или да сведем до минимум, или да увеличим максимално резултата на всяко ниво.)

Визуализация на алгоритъма на minimax в изкуствено положение. Най-добрият ход за бялото е b2-c3, защото можем да гарантираме, че можем да стигнем до позиция, при която оценката е -50

С минимамакс на място, нашият алгоритъм започва да разбира някои основни тактики на шах:

Minimax с ниво на дълбочина 2. Възпроизвежда се на: https://jsfiddle.net/k96eoq0q/1/

Ефективността на алгоритъма на minimax се основава в голяма степен на дълбочината на търсене, която можем да постигнем. Това е нещо, което ще подобрим в следващата стъпка.

Стъпка 4: Алфа-бета подрязване

Подрязването на алфа-бета е метод за оптимизиране на алгоритъма на minimax, който ни позволява да пренебрегнем някои клонове в дървото за търсене. Това ни помага да оценим дървото на minimax много по-дълбоко, като същевременно използваме същите ресурси.

Алфа-бета резитбата се основава на ситуацията, при която можем да спрем да оценяваме част от дървото за търсене, ако намерим ход, който води до по-лоша ситуация от преди открития ход.

Алфа-бета подрязването не влияе на резултата от алгоритъма на minimax - само го ускорява.

Алфа-бета алгоритъмът също е по-ефективен, ако се случи първо да посетим тези пътища, които водят до добри ходове.

Позициите, които не е необходимо да изследваме дали алфа-бета резитбата се използва и дървото се посещава в описания ред.

С алфа-бета получаваме значително усилване на алгоритъма на minimax, както е показано в следния пример:

Броят позиции, които са необходими за оценка, ако искаме да извършим търсене с дълбочина 4, а позицията „root“ е тази, която е показана.

Следвайте тази връзка, за да опитате алфа-бета подобрената версия на шахматния AI.

Стъпка 5: Подобрена функция за оценка

Функцията за първоначална оценка е доста наивна, тъй като броим само материала, който се намира на дъската. За да подобрим това, добавяме към оценката фактор, който отчита позицията на парчетата. Например рицарят в центъра на дъската е по-добър (защото има повече опции и по този начин е по-активен) от рицар на ръба на дъската.

Ще използваме леко коригирана версия на таблици с части от квадрат, които първоначално са описани в шахматното програмиране-уики.

Визуализираните визуално представени квадратни маси. Можем да намалим или увеличим оценката, в зависимост от местоположението на парчето.

Със следното подобрение започваме да получаваме алгоритъм, който играе някакъв „приличен“ шах, поне от гледна точка на случаен играч:

Подобрена оценка и алфа-бета резитба с дълбочина на търсене от 3. Възпроизвежда се на https://jsfiddle.net/q76uzxwe/1/

Заключения

Силата дори на един прост алгоритъм за игра на шах е, че той не прави глупави грешки. Това каза, че все още няма стратегическо разбиране.

С методите, които въведох тук, успяхме да програмираме алгоритъм за игра на шах, който може да играе основен шах. "AI-частта" (изключена генерация на движения) на крайния алгоритъм е само 200 реда код, което означава, че основните понятия са доста лесни за изпълнение. Можете да проверите окончателната версия на GitHub.

Някои допълнителни подобрения, които бихме могли да направим в алгоритъма, биха били например:

  • ход на заявки
  • по-бързо поколение на движение
  • и специфична оценка в края на играта.

Ако искате да научите повече, разгледайте уикито за програмиране на шах. Това е полезен ресурс за изследване извън тези основни понятия, които представих тук.

Благодаря за четенето!