by Lauri Hartikka
laten we enkele basisconcepten verkennen die ons zullen helpen een eenvoudig schaakspel te maken AI:
- Move-generation
- board evaluation
- MiniMax
- en alpha beta snoeien.
bij elke stap verbeteren we ons algoritme met een van deze beproefde schaakprogrammeertechnieken. Ik zal laten zien hoe elk de speelstijl van het algoritme beïnvloedt.
u kunt het uiteindelijke AI-algoritme hier op GitHub bekijken.
Stap 1: Verplaats generatie en bordvisualisatie
We zullen het Schaken gebruiken.js bibliotheek voor move generatie, en schaakbord.J ‘ s voor het visualiseren van het bord. De move generation bibliotheek implementeert in principe alle regels van het Schaken. Op basis hiervan kunnen we alle juridische stappen berekenen voor een bepaalde bestuurstoestand.
het gebruik van deze bibliotheken zal ons helpen ons te concentreren op de meest interessante taak: het maken van het algoritme dat de beste zet vindt.
we beginnen met het maken van een functie die gewoon een willekeurige zet teruggeeft van alle mogelijke zetten:
hoewel dit algoritme geen zeer solide schaker is, is het een goed startpunt, omdat we er eigenlijk tegen kunnen spelen:
Stap 2 : Positie evaluatie
laten we nu proberen te begrijpen welke kant sterker is in een bepaalde positie. De eenvoudigste manier om dit te bereiken is door de relatieve sterkte van de stukken op het bord te tellen met behulp van de volgende tabel:
met de evaluatiefunctie kunnen we een algoritme maken dat de zet kiest die de hoogste evaluatie geeft:
de enige tastbare verbetering is dat ons algoritme zal nu een stuk vastleggen als het kan.
Stap 3: zoekboom met Minimax
vervolgens maken we een zoekboom waaruit het algoritme de beste zet kan kiezen. Dit wordt gedaan met behulp van de Minimax algoritme.
in dit algoritme wordt de recursieve boom van alle mogelijke bewegingen onderzocht tot een bepaalde diepte en wordt de positie geëvalueerd aan het einde van “bladeren” van de boom.
daarna keren we de kleinste of de grootste waarde van het kind terug naar de bovenliggende node, afhankelijk van of het een wit of zwart is om te verplaatsen. (Dat wil zeggen, we proberen het resultaat op elk niveau te minimaliseren of te maximaliseren.)
met minimax op zijn plaats begint ons algoritme een aantal basistactieken van Schaken te begrijpen:
de effectiviteit van het MiniMax algoritme is sterk gebaseerd op de zoekdiepte die we kunnen bereiken. Dit is iets wat we zullen verbeteren in de volgende stap.
Stap 4: Alpha-beta snoeien
Alpha-beta snoeien is een optimalisatiemethode voor het minimax algoritme dat ons in staat stelt om enkele takken in de zoekboom te negeren. Dit helpt ons evalueren van de minimax zoekboom veel dieper, terwijl het gebruik van dezelfde middelen.
de alpha-beta snoei is gebaseerd op de situatie waarin we kunnen stoppen met het evalueren van een deel van de zoekboom als we een beweging vinden die leidt tot een slechtere situatie dan een eerder ontdekte beweging.
de alpha-beta snoei heeft geen invloed op de uitkomst van het minimax algoritme — het maakt het alleen sneller.
Het alpha-beta algoritme is ook efficiënter als we eerst die paden bezoeken die tot goede zetten leiden.
met alpha-beta, krijgen we een significante boost voor het MiniMax algoritme, zoals wordt getoond in het volgende voorbeeld:
volg deze link om de alpha-beta verbeterde versie van de chess AI te proberen.
Stap 5: verbeterde evaluatiefunctie
de initiële evaluatiefunctie is vrij naïef omdat we alleen het materiaal tellen dat op het bord wordt gevonden. Om dit te verbeteren, voegen we aan de evaluatie een factor toe die rekening houdt met de positie van de stukken. Bijvoorbeeld, een ridder op het midden van het bord is beter (omdat het meer opties heeft en dus actiever is) dan een ridder op de rand van het bord.
we gebruiken een licht aangepaste versie van vierkante tabellen die oorspronkelijk beschreven zijn in de chess-programming-wiki.
met de volgende verbetering beginnen we een algoritme te krijgen dat wat” fatsoenlijk”Schaken speelt, tenminste vanuit het oogpunt van een casual speler:
conclusies
De kracht van zelfs een eenvoudig schaakspelalgoritme is dat het geen domme fouten maakt. Dit gezegd zijnde, ontbreekt het nog steeds aan strategisch begrip.
met de methoden die ik hier heb geïntroduceerd, hebben we een schaakspel-algoritme kunnen programmeren dat basisschaak kan spelen. De “AI-deel” (Move-generatie uitgesloten) van het uiteindelijke algoritme is slechts 200 regels code, wat betekent dat de basisconcepten zijn vrij eenvoudig te implementeren. Je kunt de definitieve versie bekijken op GitHub.
enkele verdere verbeteringen die we aan het algoritme kunnen aanbrengen zijn bijvoorbeeld:
- verplaatsingsvolgorde
- snellere generatie van bewegingen
- en eindspelspecifieke evaluatie.