INHOUDSOPGAWE:

Bordspel Kunsmatige Intelligensie: die Minimax -algoritme: 8 stappe
Bordspel Kunsmatige Intelligensie: die Minimax -algoritme: 8 stappe

Video: Bordspel Kunsmatige Intelligensie: die Minimax -algoritme: 8 stappe

Video: Bordspel Kunsmatige Intelligensie: die Minimax -algoritme: 8 stappe
Video: Strategic Brilliance: Unleashing the Minimax Algorithm in Tic-Tac-Toe 2024, Julie
Anonim
Image
Image
Bordspel Kunsmatige Intelligensie: die Minimax -algoritme
Bordspel Kunsmatige Intelligensie: die Minimax -algoritme

Het u al ooit gewonder hoe die rekenaars waarmee u in skaak of damme speel, gemaak word? U hoef nie verder as hierdie instruksies nie, want dit sal u wys hoe u 'n eenvoudige maar effektiewe kunsmatige intelligensie (AI) kan maak met behulp van die Minimax -algoritme! Deur die Minimax -algoritme te gebruik, maak die AI goed beplande en deurdagte bewegings (of volg dit ten minste 'n denkproses na). Nou, ek kan u net die kode gee vir die AI wat ek gemaak het, maar dit sou nie lekker wees nie. Ek sal die logika agter die rekenaar se keuses verduidelik.

In hierdie instruksies sal ek u deur die stappe lei om 'n AI vir Othello (AKA Reversi) in python te maak. U moet 'n intermediêre begrip hê van hoe om in python te kodeer voordat u hierdie projek aanpak. Hier is 'n paar goeie webwerwe om na te kyk om u voor te berei op hierdie Instructable: w3schools of learnpython. Aan die einde van hierdie instruksies moet u 'n AI hê wat berekende bewegings sal maak en die meeste mense moet verslaan.

Aangesien hierdie Instructable hoofsaaklik handel oor hoe om 'n AI te maak, sal ek nie verduidelik hoe om 'n speletjie in python te ontwerp nie. In plaas daarvan gee ek die kode vir die spel waar 'n mens teen 'n ander mens kan speel en dit kan verander sodat u 'n spel kan speel waar 'n mens teen die AI speel.

Ek het geleer hoe om hierdie AI te skep deur middel van 'n somerprogram by Columbia SHAPE. Ek het daar lekker gekuier, so kyk op hul webwerf om te sien of u sou belangstel.

Noudat ons die logistiek uit die weg geruim het, laat ons begin met kodering!

(Ek het 'n paar aantekeninge in die beelde geplaas, so kyk gerus daarna)

Voorrade

Dit is maklik:

1) Rekenaar met 'n luislangomgewing soos Spyder of IDLE

2) Laai die lêers vir die Othello -speletjie af van my GitHub

3) U brein met geduld geïnstalleer

Stap 1: Laai die nodige lêers af

Laai die nodige lêers af
Laai die nodige lêers af
Laai die nodige lêers af
Laai die nodige lêers af

As u by my GitHub ingaan, moet u 5 lêers sien. Laai al 5 af en plaas dit in dieselfde gids. Maak al die lêers in die Spyder -omgewing oop voordat ons die spel begin.

Dit is wat die lêers doen:

1) othello_gui.py hierdie lêer skep die spelbord waarop die spelers kan speel (hetsy menslik of rekenaar)

2) othello_game.py hierdie lêer speel twee rekenaars teen mekaar sonder die speelbord en toon slegs die telling en beweeg posisies

3) ai_template.py dit is waar u al u kode sal plaas om u AI te maak

4) randy_ai.py dit is 'n voorafgemaakte AI wat willekeurig sy bewegings kies

5) othello_shared.py 'n klomp voorafgemaakte funksies wat u kan gebruik om u AI te maak, soos om na beskikbare bewegings, die telling of die staat te kyk

6) Die drie ander lêers: Puma.py, erika_5.py en nathan.py, gemaak deur my, Erika en Nathan onderskeidelik uit die SHAPE -program, dit is drie verskillende AI's met unieke kodes

Stap 2: Hoe om Python Othello oop te maak en te speel

Hoe om Python Othello oop te maak en te speel
Hoe om Python Othello oop te maak en te speel
Hoe om Python Othello oop te maak en te speel
Hoe om Python Othello oop te maak en te speel

Sodra u al die lêers oopgemaak het, tik "run othello_gui.py" in die regter onderste hoek van die skerm en druk op enter in die IPython Console. Of tik in Mac -terminale "python othello_gui.py" (natuurlik nadat u in die regte gids is). Dan moet 'n bord op u skerm verskyn. Hierdie modus is die menslike teenoor die menslike modus. Lig gaan tweede en donker eerste. Kyk na my video as u verward is. i Aan die bokant is die telling van elke kleurteël. Om te speel, klik op 'n geldige skuifspasie om 'n teël daar te plaas en gee dan die rekenaar aan u teenstander wat dieselfde sal doen en herhaal.

As u nie weet hoe om Othello te speel nie, lees hierdie reëls op die ultra boards -webwerf:

Swart beweeg altyd eerste. 'N Beweging word gemaak deur 'n skyf met die kleur van die speler op die bord te plaas in 'n posisie wat een of meer van die teenstanders se skywe "buite flankeer". 'N Skyf of ry skywe word omring as dit aan die ente omring word deur skywe van die teenoorgestelde kleur. 'N Skyf kan 'n aantal skywe in een of meer rye in enige rigting (horisontaal, vertikaal, diagonaal) uitsteek … (lees klaar op hul webwerf)

Die verskil tussen die oorspronklike spel en hierdie python -spel is dat die spel eindig as daar geen geldige bewegings oor is vir een speler nie

Noudat u die speletjie saam met 'n vriend kan speel, laat ons 'n AI maak waarmee u kan speel.

Stap 3: Minimax -algoritme: opwekking van scenario's

Minimax -algoritme: opwekking van scenario's
Minimax -algoritme: opwekking van scenario's

Voordat ons praat oor hoe om dit in kode te skryf, gaan ons na die logika daaragter. Die minimax-algoritme is 'n besluitnemende, terug-opsporingsalgoritme en word tipies gebruik in speletjies met twee spelers om die beurt. Die doel van hierdie AI is om die volgende beste skuif en die volgende beste bewegings te vind totdat dit die wedstryd wen.

Hoe sou die algoritme bepaal watter stap die beste stap is? Stop en dink hoe jy die volgende stap sou kies. Die meeste mense sou die besluit kies wat hulle die meeste punte sou gee, nie waar nie? Of as hulle vooruit dink, sou hulle die stap kies wat 'n situasie sou skep waarin hulle nog meer punte kon behaal. Laasgenoemde manier van dink is die manier waarop die Minimax -algoritme dink. Dit kyk vorentoe na al die toekomstige raadopstellings en maak die stap wat tot die meeste punte kan lei.

Ek het dit 'n backtracking -algoritme genoem, omdat dit begin deur eers al die toekomstige bordstate met hul verwante waardes te skep en te evalueer. Dit beteken dat die algoritme die spel soveel sal speel as wat dit nodig is (die bewegings vir homself en die teenstander maak) totdat elke scenario van die spel gespeel is. Om al die bordtoestande (scenario's) by te hou, kan ons 'n boom teken (kyk op die foto's). Die boom op die foto hierbo is 'n eenvoudige voorbeeld van 'n speletjie Connect 4. Elke bordkonfigurasie word 'n bordstaat genoem en sy plek op die boom word 'n node genoem. Al die nodusse aan die onderkant van die boom is die finale bordtoestande nadat al die bewegings gemaak is. Sommige bordstate is duidelik beter vir die een speler as die ander. Dus, nou moet ons die AI laat kies in watter raadstaat hy wil kom.

Stap 4: Minimax: Evaluering van bordkonfigurasies

Minimaks: Evaluering van bordkonfigurasies
Minimaks: Evaluering van bordkonfigurasies
Minimaks: Evaluering van bordkonfigurasies
Minimaks: Evaluering van bordkonfigurasies

Om waardes aan die bordstawe te gee, moet ons die strategieë van die spel wat ons speel leer: in hierdie geval die strategieë van Othello. Omdat hierdie spel 'n stryd is om die teenstander en u skywe om te draai, is die beste skyfposisies stabiel en kan nie omgedraai word nie. Die hoek is byvoorbeeld die plek waar 'n skyf nie geplaas kan word na die ander kleur nie. Die plek sou dus uiters waardevol wees. Ander goeie posisies sluit die kante van die bord in, waardeur u baie klippe kan neem. Daar is meer strategieë op hierdie webwerf.

Nou kan ons waardes toeken aan die posisies vir elke raad van die staat. As 'n posisie deur die stuk AI ingeneem word, gee u 'n sekere aantal punte, afhangende van die posisie. Byvoorbeeld, op 'n bord waarin die stuk van die AI in die hoek is, kan u 'n bonus van 50 punte gee, maar as dit op 'n ongunstige plek is, kan die stuk 'n waarde van 0. Na inagneming van al die waardes van die posisies, gee u 'n waarde aan die bord toe. Byvoorbeeld, as die AI 'n stuk in die hoek het, kan die bordstaat 'n telling van 50 hê, terwyl 'n ander bord met die stuk van die AI in die middel 'n telling van 10 het.

Daar is baie maniere om dit te doen, en ek het drie verskillende heuristieke om die bordstukke te evalueer. Ek moedig u aan om u eie tipe heuristiek te maak. Ek het drie verskillende AI's na my github opgelaai deur drie verskillende makers, met drie verskillende heuristieke: Puma.py, erika5.py, nathanh.py.

Stap 5: Minimax -algoritme: kies die beste skuif

Minimax -algoritme: kies die beste skuif
Minimax -algoritme: kies die beste skuif
Minimax -algoritme: kies die beste skuif
Minimax -algoritme: kies die beste skuif
Minimax -algoritme: kies die beste skuif
Minimax -algoritme: kies die beste skuif
Minimax -algoritme: kies die beste skuif
Minimax -algoritme: kies die beste skuif

Dit sal nou lekker wees as die AI net al die bewegings kan kies om by die boordstaat met die hoogste telling uit te kom. Maar onthou dat die AI ook die bewegings vir die teenstander gekies het toe dit al die bordtoestande genereer het, en as die teenstander slim is, kan die AI nie die hoogste bordtelling bereik nie. In plaas daarvan sou 'n slim teenstander die besluit neem om die AI na die laagste raad te laat gaan. In die algoritme noem ons die twee spelers 'n maksimaliserende speler en 'n minimaliserende speler. Die AI sou die maksimum speler wees, aangesien dit die meeste punte vir homself wil behaal. Die teenstander is 'n minimale speler aangesien die teenstander probeer om die beweging te maak waar die AI die minste punte kry.

Sodra al die bordtoestande gegenereer is en waardes aan die borde toegeken is, begin die algoritme om die bordtoestande te vergelyk. Op die foto's het ek 'n boom geskep om voor te stel hoe die algoritme sy bewegings sou kies. Elke skeuring in die takke is 'n ander beweging wat die AI of die teenstander kan speel. Links van die rye nodusse het ek geskryf of die maksimaliserende of minimaliserende speler gaan. Die onderste ry is al die raad state met hul waardes. Binne -in elk van die nodusse is 'n getal en dit is die tellings wat ons aan elk van die borde toewys: hoe hoër hulle is, hoe beter is die AI om te hê.

Definisies: ouerknoop - 'n knoop wat knope daaronder veroorsaak of knope skep; die oorsprong van die kinderknope - die nodusse wat uit dieselfde ouerknoop kom

Die leë knope dui aan watter beweging die AI sal maak om by die beste bordstaat uit te kom. Dit begin met die vergelyking van die kinders van die linkerkantste knoop: 10, -3, 5. Aangesien die maksimaliserende speler die skuif sou maak, sou hy die skuif kies wat die meeste punte sou gee: 10. Ons kies en stoor dit dan beweeg met die bordtelling en skryf dit in die ouerknoop. Noudat 10 in die ouerknoop is, is dit nou die beurt aan die minimum spelers. Die node waarmee ons 10 sou vergelyk, is egter leeg, dus moet ons die node eers evalueer voordat die minimaliserende speler kan kies. Dus gaan ons terug na die beurt van die maksimaliserende speler en vergelyk die kinders van die aangrensende knoop: 8, -2. Maksimalisering kies 8 en ons skryf dit in die leë ouerknoop. Noudat die algoritme die leë spasies vir die kinders van 'n knoop daarbo ingevul het, kan die minimaliserende speler die kinders vergelyk - 10 en 8 en kies 8. Die algoritme herhaal hierdie proses totdat die hele boom gevul is. Aan die einde van hierdie voorbeeld het ons die telling 8. Dit is die hoogste bordstaat wat die AI kan speel om te aanvaar dat die teenstander optimaal speel. Die AI sal dus die eerste beweging kies wat na die 8 -bordstaat lei, en as die teenstander optimaal speel, moet die AI alle bewegings speel om aan boordstaat 8 te kom (volg die aantekeninge op my foto's)

Ek weet dit was baie. As u een van die soorte is wat iemand met u moet laat praat om iets te verstaan, is hier 'n paar video's wat ek gekyk het om my te help om die idee hier agter te verstaan: 1, 2, 3.

Stap 6: Minimax -algoritme: Pseudokode

Minimaks algoritme: Pseudokode
Minimaks algoritme: Pseudokode

Nadat u die logika agter die minimax -algoritme verstaan het, kyk na hierdie pseudokode (die funksies wat universeel is vir alle kodes) van Wikipedia:

funksie minimax (node, diepte, maximizingPlayer) is

as diepte = 0 of die knoop 'n terminale knoop is

gee die heuristiese waarde van knoop terug

as die maksimalisering van die speler dan

waarde: = −∞

vir elke knoopkind

waarde: = max (waarde, minimax (kind, diepte - 1, ONWAAR))

opbrengswaarde

anders (* minimaliseer speler *)

waarde: = +∞

vir elke knoopkind

waarde: = min (waarde, minimax (kind, diepte - 1, WAAR))

opbrengswaarde

Dit is 'n rekursiewe funksie, wat beteken dat dit homself oor en oor noem totdat dit 'n stoppunt bereik. Eerstens neem die funksie drie waardes in, die knoop, diepte en wie se beurt dit is. Die knoopwaarde is die plek waar u wil hê dat die program moet begin soek. Die diepte is hoe ver u wil hê dat die program moet soek. Byvoorbeeld, in my boomvoorbeeld het dit 'n diepte van 3, omdat dit na drie bewegings in alle bordtoestande gesoek het. Natuurlik wil ons graag hê dat die AI elke bordstaat kontroleer en 'n oorwinning wen, maar in die meeste speletjies waar daar duisende indien nie miljoene bordkonfigurasies is nie, kan u skootrekenaar tuis nie al die konfigurasies verwerk nie. Ons beperk dus die soekdiepte van die AI en laat dit na die beste bordstaat gaan.

Hierdie pseudokode gee die proses weer wat ek in die vorige twee stappe verduidelik het. Laat ons dit nou 'n stap verder neem en dit regstel in die python -kode.

Stap 7: Maak u AI met Ai_template.py

Maak u AI met Ai_template.py
Maak u AI met Ai_template.py
Maak u AI met Ai_template.py
Maak u AI met Ai_template.py
Maak u AI met Ai_template.py
Maak u AI met Ai_template.py
Maak u AI met Ai_template.py
Maak u AI met Ai_template.py

Voordat u na my Minimax AI-kode kyk, probeer u u eie AI maak met die ai_template.py-lêer en die pseudo-kode waaroor ons in die laaste stap gepraat het. Daar is twee funksies in die ai -sjabloon genaamd: def minimax_min_node (bord, kleur) en def minimax_max_node (bord, kleur). In plaas daarvan dat die minimax -funksie homself rekursief noem, het ons twee verskillende funksies wat mekaar noem. Om 'n heuristiek vir die evaluering van bordtoestande te skep, moet u u eie funksie skep. Daar is 'n voorafgemaakte funksie in die othello_shared.py -lêer wat u kan gebruik om u AI te bou.

Sodra u u AI het, probeer dit teen, randy_ai.py. Tik "python othello_gui.py (voeg ai lêernaam in).py (lêernaam in).py" in die mac terminale in of tik "run othello_gui.py (voeg ai lêernaam in).py in om twee ais teen mekaar uit te voer (voeg lêernaam in).py "en maak seker dat u in die regte gids is. Kyk ook na my video vir die presiese stappe.

Stap 8: Tyd om AI te laat veg

Tyd om AI te laat veg!
Tyd om AI te laat veg!
Tyd om AI te laat veg!
Tyd om AI te laat veg!
Tyd om AI te laat veg!
Tyd om AI te laat veg!

Kry nou 'n klomp van u rekenaarvriende en laat hulle hul eie AI ontwerp! Dan kan u 'n kompetisie maak en u AI kan laat vaar. Hopelik kon u, selfs as u nie u eie AI kon bou nie, verstaan hoe die minimax -algoritme werk. As u enige vrae het, plaas gerus enige vrae in die kommentaar hieronder.

Aanbeveel: