MinMax Algoritmen Implementation och optimering Joakim Östlund 15 juni 2004 1
Samanfattning MinMax är en algoritm som kan användas i turbaserade spel för att skapa en virituell motståndare. Algoritmen fungerar genom att testa samtliga möjliga spelutfall, och avgöra vilket som leder till det bästa slutresultatet. Detta är dock en väldigt krävande metod, som kräver optimeringar och restriktioner för att kunna användas på annat än de simplaste spelen. 2
Innehåll 1 Introduktion 4 2 MinMax Algoritmen 5 3 Alpha-Beta Pruning 6 4 Fall-Specika Optimeringar 7 5 Slutsats 8 A Fakulteter 9 3
1 Introduktion MinMax är en generell algoritm för AI i tur-baserade strategispel, som t.ex. Tre-I-Rad eller Schack. Algoritmen fungerar genom att (i teorin) beräkna alla möjliga drag som går att göra, och kan på det sättet avgöra vilket drag som kommer att leda till ett så bra slutresultat som möjligt. Oftast går det dock inte att simulera en hel spelomgång. I t.ex. tre-i-rad går detta, då beslutsträdet utan optimeringar endast kommer att bestå utav 9! (9 fakultet, se appendix A) noder. Detta kommer sig av att i början av spelet nns det 9 tomma rutor som alla är lagliga att spela på, vilket gör 9 möjliga drag. Efter första draget nns det 8 möjliga drag kvar att göra. För att beräkna alla möjliga drag vid den tidpunkten behöver man beakta totalt 9 8 olika drag, och man fortsätter på samma sätt tills spelet är över. I ett mer komplext spel som schack minskar inte antalet möjligheter efter varje drag, och då det både nns er spelrutor och mer komplexa spelregler kan man säga att det i snitt nns 35 möjliga drag att göra på varje nivå. För en schakmatch som pågår i 50 drag (25 från varje spelare) betyder detta 35 50, eller ca 1.5 10 77, beslutsnoder. Att generera fram alla dessa är orimligt, och därför behöver man kunna restriktera antalet noder, utan att för den skull behöva spela dumt. Därför har det utvecklats era olika sätt att optimera sökandet efter det optimala draget. Alpha-Beta pruning är en av de vanligaste, vilket tillsammans med diverse heuristiska optimeringar dramatiskt kan dra ner på tiden det tar att komma fram till ett resultat. Som en fotnot kan nämnas att även med alla dessa optimeringar tar ett beslutsträd för schack för lång tid att generera fram i sin helhet, vilket också är anledningen till att schackdatorer kan förlora. När man någon gång i framtiden har minneskapacitet och datorkraft nog att skapa ett komplett beslutsträd under en rimlig tidsrymd, kommer schackdatorer att bli oslagbara, på samma sätt som en korrekt implementerad tre-i-rad AI inte kan förlora. 4
2 MinMax Algoritmen Grunden i MinMax är ett beslutsträd som består av de möjliga drag som går att göra i spelet utifrån ett visst läge. Vid genereringen av beslutsträdet antar man att det nns två spelare, vilka kallas för Min och Max. Vilken av dessa spelare som börjar spelet saknar betydelse, dock är det viktigt att komma ihåg vem som började, då man genererar hela trädet utifrån Max synvinkel. Varje nivå i trädet representerar en av spelarna, och då man turas om med att göra sina drag kommer varannan nivå att representera Max drag, och varannan att representera Mins drag. På varje nivå testas samtliga drag som en spelare kan göra, och dragen poängsätts beroende på vilket slutresultat som kommer att uppnås. Hur denna poängsättning görs är implementationsspecikt. Poängen på varje möjligt drag används sedan för att avgöra vilket drag den spelare som representeras av den nuvarande nivån bör spela. På en nivå som representerar Max drag söker man att uppnå en så hög poäng som möjligt (dvs, Max vinner), medan man för Mins drag söker en så låg poäng som möjligt (dvs, Max förlorar). Tre-i-rad är ett av de enklaste spelen att implementera denna algoritm på, då beslutsträdet utan optimeringar endast kommer att bestå utav 9! noder. I ett mer komplext spel, såsom schack, kan beslutsträdet bli ohanterligt stort, och kräver hårda optimeringar och begränsningar. Figur 1: Exempel på hur MinMax algorithmen poängsätter Max drag I gur 2 ser vi hur en omgång mellan en datorspelare (spelar här som Max) och en mänskilg spelare (Min) skulle kunna se ut. I början har alla 9 dragen samma värde, då ett optimalt spel från bägge spelarna skulle leda till oavgjort oavsett vilken ruta spelet börjar i. I det här fallet valde Max att spela på mittenrutan. Min spelar därefter på en av kantrutorna. Nu ser spelplanen annorlunda ut från Max synvinkel. Min har gjort ett misstag, och genom att spela på en av hörnrutorna kan Max försäkra sig om en vinst (Min måste då blocka, varpå Max återigen spelar på ett hörn, och skapar på det sättet ett läge där det nns två rutor som ger vinst, och då Min endast kan blocka en av dessa förlorar denna). 5
3 Alpha-Beta Pruning Alpha-Beta Pruning är en metod som ofta används för att minska (optimera) antalet noder i ett MinMax beslutsträd. Metoden går ut på att när man väl hittat ett drag där resultatet för Max är bättre än resultatet för Min (eller omvänt om man benner sig på en Min nivå), så behöver man inte söka vidare efter er noder på den nivån man benner sig på, och kan därför avbryta sökandet, och returnera upp det bästa resultatet man hittade. Tanken bakom detta är att så länge Max spelar optimalt på noden vi hittade, nns det inget Min kan göra för att få ett bättre slutresultat, och därför spelar det ingen roll hur de andra noderna skulle se ut. I de esta turbaserade spel så är detta sant, och Alpha-Beta Pruning går oftast att implementera med goda resultat. Har man dock ett spel där man kan uppnå era olika nivåer av vinst, så kommer man nog vilja modiera Alpha-Beta pruningen lite, alternativt använda en annan metod för att optimera sitt beslutsträd. 6
4 Fall-Specika Optimeringar Fall-specika optimeringar (även kallade heuristiska optimeringar) görs specikt för ett visst spel eller ett visst regelset. Till exempel så kan man inte överföra denna typ av optimering från schack till tre-i-rad, då dessa spel har helt olika regler och slutmål. En av de första (och kanske mest självklara) optimeringarna som går att införa är att inte försätta att expandera beslutsträdet då ett spelslut är uppnått. Det bör påpekas att de esta heuristiska optimeringarna endast går att genomföra på en nivå som representerar en datorspelare, och som kan antas spela optimalt. En mänsklig spelares oberäknelighet gör att man måste undersöka alla giltiga drag för denna spelare. En tre-i-rad optimering som går att genomföra då datorn börjar är att bestämma sig för en startruta som altid kommer att spelas (till exempel mittenrutan). Denna enkla optimering kommer att minska beslutsträdets storlek med 8 8! noder. Om motståndaren spelar som andra spelare, och inte spelar sitt första drag på ett hörn, kan man spara in 3 7! + 3 5! noder genom att endast undersöka hörnen de följande två dragen. På samma sätt kan man spara in 4 8! noder då datorspelaren inte börjar, då spel på kantrutorna ofta leder till förlust. En annan metod är spegling, som utgår från tre-i-rad brädets symmetriska form och funktion. Då spel på t.ex. någon av hörnrutorna i början är detsamma oavsett vilket hörn man spelar på, behöver man endast beräkna resultatet på ett av dessa, och sedan spegla, eller rotera, trädet om det ska appliceras på något av de andra hörnen. 7
5 Slutsats Medans MinMax är en välformulerad algoritm, som når goda resultat då den tillåts generera ett stort nog beslutsträd, är den i nuläget för långsam för att kunna på allvar utmana en människa i annat än de lättaste spel. Med optimeringar och allt snabbare hårvara kan den dock utgöra ett hot även för hysat bra spelare, vilket schackdatorer som Deep Blue har visat, men i allmänhet är det en hysat bra algoritm för AI liknande betende hos en datormotståndare i ett turbaserat (bräd) spel. 8
A Fakulteter En fakultet skrivs som n!, och utläses n-fakultet alternativt fakulteten av n, och beräknas som produkten av alla heltal mellan 1 och n. T.ex. så gäller det att 5! = 1 2 3 4 5 Fakulteter växer otroligt snabbt, 6! är till exempel 720, medan 7! är uppe i 5040. Redan vid 10! är värdet uppe i era miljoner, och de esta vanliga kalkylatorer klarar inte av att beräkna mer än 69!, vilket är ca 1.7 10 98. Det är viktigt att komma ihåg hur fakulteterna beräknas och hur dom växer när man räknar med dom, annars kan man lätt tro att t.ex. 8 9! är större än 10, vilket är ganska långt från sanningen. 9