Žingsnis po žingsnio vadovas, kaip sukurti paprastą šachmatų AI

Panagrinėkime keletą pagrindinių sąvokų, kurios mums padės sukurti paprastą šachmatų AI:

  • judėti kartai
  • lentos vertinimas
  • minimumas
  • ir alfa beta genėjimas.

Kiekviename žingsnyje mes patobulinsime savo algoritmą naudodami vieną iš šių laiko patikrintų šachmatų programavimo metodų. Parodysiu, kaip kiekvienas veikia algoritmo žaidimo stilių.

Galutinį AI algoritmą galite peržiūrėti čia, „GitHub“.

1 žingsnis: perkelkite generavimą ir lentos vizualizaciją

Kėlimui naudosime biblioteką „chess.js“, o lentai vizualizuoti - „chessboard.js“. „Move“ kartos biblioteka iš esmės įgyvendina visas šachmatų taisykles. Remdamiesi tuo, mes galime apskaičiuoti visus teisinius žingsnius tam tikroje valdybos būsenoje.

Judėjimo generavimo funkcijos vizualizacija. Pradinė padėtis naudojama kaip įvestis, o išėjimas - visi įmanomi judesiai iš tos padėties.

Naudodamiesi šiomis bibliotekomis, padėsime susikoncentruoti tik į įdomiausią užduotį: sukurti algoritmą, kuris suras geriausią žingsnį.

Pradėsime kurdami funkciją, kuri tik sugrąžins atsitiktinį judesį iš visų galimų judesių:

Nors šis algoritmas nėra labai tvirtas šachmatininkas, jis yra geras atspirties taškas, nes mes iš tikrųjų galime žaisti prieš jį:

Juodieji vaidina atsitiktinius judesius. Galima žaisti https://jsfiddle.net/lhartikk/m14epfwb/4

2 žingsnis: padėties įvertinimas

Dabar pabandykime suprasti, kuri pusė yra stipresnė tam tikroje padėtyje. Paprasčiausias būdas tai pasiekti yra apskaičiuoti santykinį gabalų stiprumą lentoje, naudojant šią lentelę:

Naudodami vertinimo funkciją, mes galime sukurti algoritmą, kuris pasirenka aukščiausią įvertinimą suteikiantį žingsnį:

Vienintelis apčiuopiamas patobulinimas yra tas, kad mūsų algoritmas dabar užfiksuos gabalą, jei jis galės.

Juodas žaisdamas padeda paprastą vertinimo funkciją. Galima žaisti https://jsfiddle.net/lhartikk/m5q6fgtb/1/

3 žingsnis: Ieškokite medžio naudodami „Minimax“

Toliau mes sukursime paieškos medį, iš kurio algoritmas galės pasirinkti geriausią žingsnį. Tai atliekama naudojant „Minimax“ algoritmą.

Šiame algoritme visų galimų judesių medis ištiriamas iki nurodyto gylio, o vieta įvertinama medžio galutiniuose „lapuose“.

Po to į pagrindinį mazgą grąžiname mažiausią arba didžiausią vaiko vertę, atsižvelgiant į tai, ar judėti balta, ar juoda. (Tai yra, mes stengiamės sumažinti arba maksimaliai padidinti rezultatą kiekviename lygmenyje.)

Minimalaus algoritmo vizualizacija dirbtinėje padėtyje. Geriausias baltų žingsnių pasirinkimas yra b2-c3, nes galime garantuoti, kad pateksime į tokią vietą, kur įvertinimas bus -50

Turėdami minimalųjį variantą, mūsų algoritmas pradeda suprasti keletą pagrindinių šachmatų taktikų:

„Minimax“ su gylio lygiu 2. Galima žaisti: https://jsfiddle.net/k96eoq0q/1/

Minimaxx algoritmo efektyvumas labai priklauso nuo paieškos gylio, kurį galime pasiekti. Tai pagerinsime atlikdami šį veiksmą.

4 žingsnis: alfa-beta genėjimas

Alfa-beta genėjimas yra minimax algoritmo optimizavimo metodas, leidžiantis nekreipti dėmesio į kai kurias paieškos medžio šakas. Tai padeda mums įvertinti minimumx paieškos medį daug giliau, naudojant tuos pačius išteklius.

Alfa-beta formos genėjimas remiasi situacija, kai galime nustoti vertinti dalį paieškos medžio, jei randame žingsnį, kuris lemia blogesnę situaciją nei anksčiau aptiktas žingsnis.

Alfa-beta genėjimas neturi įtakos minimax algoritmo rezultatui - jis tik daro jį greitesnį.

Alfa-beta algoritmas taip pat yra efektyvesnis, jei pirmiausia aplankysime tuos kelius, kurie veda link gerų žingsnių.

Pozicijos, kurių mums nereikia tirti, jei naudojamas alfa-beta genėjimas ir medis aplankytas aprašyta tvarka.

Naudodami alfa-beta versiją, mes žymiai padidiname minimax algoritmą, kaip parodyta šiame pavyzdyje:

Pozicijų skaičius, reikalingas įvertinti, ar norime atlikti paiešką, kai gylis yra 4, o „šaknies“ padėtis yra ta, kuri parodyta.

Spustelėkite šią nuorodą ir išbandykite patobulintą šachmatų AI alfa-beta versiją.

5 žingsnis: patobulinta vertinimo funkcija

Pradinė vertinimo funkcija yra gana naivi, nes skaičiuojame tik tą medžiagą, kuri randama lentoje. Norėdami tai pagerinti, į vertinimą įtraukiame veiksnį, kuris atsižvelgia į kūrinių padėtį. Pavyzdžiui, riteris ant lentos centro yra geresnis (nes jis turi daugiau galimybių ir todėl yra aktyvesnis) nei riteris ant lentos krašto.

Mes naudosime šiek tiek pakoreguotą kvadratinių lentelių, kurios iš pradžių aprašytos šachmatų programavimo, wiki, versiją.

Vizualizuotos vaizdinės kvadratinės lentelės. Mes galime sumažinti arba padidinti vertinimą, priklausomai nuo kūrinio vietos.

Atlikę šiuos patobulinimus, mes gauname algoritmą, kuris žaidžia „padorų“ šachmatą, bent jau atsitiktinio žaidėjo požiūriu:

Patobulintas vertinimas ir alfa-beta formos genėjimas, kai ieškos gylis yra 3. Atkuriamas https://jsfiddle.net/q76uzxwe/1/

Išvados

Net paprasto šachmatais žaidžiančio algoritmo pranašumas yra tas, kad jis nedaro kvailų klaidų. Tai sako, kad vis dar trūksta strateginio supratimo.

Taikydami čia pateiktus metodus, mes sugebėjome užprogramuoti šachmatais žaidžiantį algoritmą, kuris gali žaisti pagrindinius šachmatais. Galutinio algoritmo „AI dalis“ (neįskaitant judėjimo kartos) yra tik 200 kodo eilučių, tai reiškia, kad pagrindines sąvokas įgyvendinti yra gana paprasta. Galite patikrinti, ar galutinė versija yra „GitHub“.

Keli papildomi algoritmo patobulinimai, pavyzdžiui:

  • judėjimas-užsakymas
  • greitesnis kartos judėjimas
  • ir konkretaus žaidimo pabaigos vertinimas.

Jei norite sužinoti daugiau, peržiūrėkite šachmatų programavimo wiki. Tai naudingas šaltinis tyrinėjant šias pagrindines sąvokas, kurias čia pristačiau.

Ačiū už skaitymą!