logo

Minimax-algoritme i spillteori | Sett 1 (introduksjon)

Minimax er en slags backtracking-algoritme som brukes i beslutningstaking og spilteori for å finne det optimale trekket for en spiller, forutsatt at motstanderen din også spiller optimalt. Det er mye brukt i turbaserte tospillerspill som Tic-Tac-Toe, Backgammon, Mancala, sjakk, etc.
I Minimax kalles de to spillerne maximizer og minimizer. De maksimerer prøver å få høyest mulig poengsum mens minimerer prøver å gjøre det motsatte og få lavest mulig poengsum.
Hver styrestat har en verdi knyttet til seg. I en gitt tilstand, hvis maksimering har overhånd, vil poengsummen til brettet ha en tendens til å være en positiv verdi. Hvis minimeren har overtaket i den tavletilstanden, vil den ha en tendens til å være en negativ verdi. Verdiene til brettet beregnes av noen heuristikk som er unike for hver type spill.

Eksempel:
Tenk på et spill som har 4 slutttilstander og stier for å nå slutttilstand er fra rot til 4 blader av et perfekt binært tre som vist nedenfor. Anta at du er den maksimerende spilleren og at du får den første sjansen til å bevege deg, det vil si at du er ved roten og motstanderen din på neste nivå. Hvilket trekk ville du gjort som en maksimerende spiller med tanke på at motstanderen din også spiller optimalt?



Spillteori Minimax-algoritme

Siden dette er en tilbakesporingsbasert algoritme, prøver den alle mulige bevegelser, går deretter tilbake og tar en avgjørelse.

  • Maksimering går til VENSTRE: Det er nå minimizerens tur. Minimeren har nå et valg mellom 3 og 5. Som minimer vil den definitivt velge minst blant begge, det vil si 3
  • Maksimering går til HØYRE: Det er nå minimizerens tur. Minimeren har nå et valg mellom 2 og 9. Han vil velge 2 da det er den minste blant de to verdiene.

Som maksimer vil du velge den største verdien som er 3. Derfor er det optimale trekket for maksimering å gå til VENSTRE og den optimale verdien er 3.



Nå ser spilltreet slik ut:

Spillteori Minimax Algorithm1

sql multiple table select

Treet ovenfor viser to mulige poengsummer når maksimering gjør trekk til venstre og høyre.



Merk: Selv om det er en verdi på 9 på det høyre undertreet, vil minimeren aldri velge det. Vi må alltid anta at motstanderen vår spiller optimalt.

Nedenfor er implementeringen for det samme.

C++




// A simple C++ program to find> // maximum score that> // maximizing player can get.> #include> using> namespace> std;> // Returns the optimal value a maximizer can obtain.> // depth is current depth in game tree.> // nodeIndex is index of current node in scores[].> // isMax is true if current move is> // of maximizer, else false> // scores[] stores leaves of Game tree.> // h is maximum height of Game tree> int> minimax(>int> depth,>int> nodeIndex,>bool> isMax,> >int> scores[],>int> h)> {> >// Terminating condition. i.e> >// leaf node is reached> >if> (depth == h)> >return> scores[nodeIndex];> >// If current move is maximizer,> >// find the maximum attainable> >// value> >if> (isMax)> >return> max(minimax(depth+1, nodeIndex*2,>false>, scores, h),> >minimax(depth+1, nodeIndex*2 + 1,>false>, scores, h));> >// Else (If current move is Minimizer), find the minimum> >// attainable value> >else> >return> min(minimax(depth+1, nodeIndex*2,>true>, scores, h),> >minimax(depth+1, nodeIndex*2 + 1,>true>, scores, h));> }> // A utility function to find Log n in base 2> int> log2(>int> n)> {> >return> (n==1)? 0 : 1 + log2(n/2);> }> // Driver code> int> main()> {> >// The number of elements in scores must be> >// a power of 2.> >int> scores[] = {3, 5, 2, 9, 12, 5, 23, 23};> >int> n =>sizeof>(scores)/>sizeof>(scores[0]);> >int> h = log2(n);> >int> res = minimax(0, 0,>true>, scores, h);> >cout <<>'The optimal value is : '> << res << endl;> >return> 0;> }>

>

>

Java




// A simple java program to find maximum score that> // maximizing player can get.> import> java.io.*;> class> GFG {> > // Returns the optimal value a maximizer can obtain.> // depth is current depth in game tree.> // nodeIndex is index of current node in scores[].> // isMax is true if current move is of maximizer, else false> // scores[] stores leaves of Game tree.> // h is maximum height of Game tree> >static> int> minimax(>int> depth,>int> nodeIndex,>boolean> isMax,> >int> scores[],>int> h)> {> >// Terminating condition. i.e leaf node is reached> >if> (depth == h)> >return> scores[nodeIndex];> >// If current move is maximizer, find the maximum attainable> >// value> >if> (isMax)> >return> Math.max(minimax(depth+>1>, nodeIndex*>2>,>false>, scores, h),> >minimax(depth+>1>, nodeIndex*>2> +>1>,>false>, scores, h));> >// Else (If current move is Minimizer), find the minimum> >// attainable value> >else> >return> Math.min(minimax(depth+>1>, nodeIndex*>2>,>true>, scores, h),> >minimax(depth+>1>, nodeIndex*>2> +>1>,>true>, scores, h));> }> // A utility function to find Log n in base 2> >static> int> log2(>int> n)> {> return> (n==>1>)?>0> :>1> + log2(n/>2>);> }> // Driver code> >public> static> void> main (String[] args) {> >// The number of elements in scores must be> >// a power of 2.> >int> scores[] = {>3>,>5>,>2>,>9>,>12>,>5>,>23>,>23>};> >int> n = scores.length;> >int> h = log2(n);> >int> res = minimax(>0>,>0>,>true>, scores, h);> >System.out.println(>'The optimal value is : '> +res);> > >}> }> // This code is contributed by vt_m>

>

xd betydning

>

C#




// A simple C# program to find maximum score that> // maximizing player can get.> using> System;> public> class> GFG> {> > // Returns the optimal value a maximizer can obtain.> // depth is current depth in game tree.> // nodeIndex is index of current node in scores[].> // isMax is true if current move is of maximizer, else false> // scores[] stores leaves of Game tree.> // h is maximum height of Game tree> static> int> minimax(>int> depth,>int> nodeIndex,>bool> isMax,> >int> []scores,>int> h)> {> >// Terminating condition. i.e leaf node is reached> >if> (depth == h)> >return> scores[nodeIndex];> >// If current move is maximizer, find the maximum attainable> >// value> >if> (isMax)> >return> Math.Max(minimax(depth+1, nodeIndex*2,>false>, scores, h),> >minimax(depth+1, nodeIndex*2 + 1,>false>, scores, h));> >// Else (If current move is Minimizer), find the minimum> >// attainable value> >else> >return> Math.Min(minimax(depth+1, nodeIndex*2,>true>, scores, h),> >minimax(depth+1, nodeIndex*2 + 1,>true>, scores, h));> }> // A utility function to find Log n in base 2> static> int> log2(>int> n)> {> >return> (n==1)? 0 : 1 + log2(n/2);> }> // Driver code> static> public> void> Main ()> {> >// The number of elements in scores must be> >// a power of 2.> >int> []scores = {3, 5, 2, 9, 12, 5, 23, 23};> >int> n = scores.Length;> >int> h = log2(n);> >int> res = minimax(0, 0,>true>, scores, h);> >Console.WriteLine(>'The optimal value is : '> +res);> > }> }> // This code is contributed by ajit.>

>

>

Python3




# A simple Python3 program to find> # maximum score that> # maximizing player can get> import> math> def> minimax (curDepth, nodeIndex,> >maxTurn, scores,> >targetDepth):> ># base case : targetDepth reached> >if> (curDepth>=>=> targetDepth):> >return> scores[nodeIndex]> > >if> (maxTurn):> >return> max>(minimax(curDepth>+> 1>, nodeIndex>*> 2>,> >False>, scores, targetDepth),> >minimax(curDepth>+> 1>, nodeIndex>*> 2> +> 1>,> >False>, scores, targetDepth))> > >else>:> >return> min>(minimax(curDepth>+> 1>, nodeIndex>*> 2>,> >True>, scores, targetDepth),> >minimax(curDepth>+> 1>, nodeIndex>*> 2> +> 1>,> >True>, scores, targetDepth))> > # Driver code> scores>=> [>3>,>5>,>2>,>9>,>12>,>5>,>23>,>23>]> treeDepth>=> math.log(>len>(scores),>2>)> print>(>'The optimal value is : '>, end>=> '')> print>(minimax(>0>,>0>,>True>, scores, treeDepth))> # This code is contributed> # by rootshadow>

java char til int

>

>

Javascript




> // Javascript program to find maximum score that> // maximizing player can get.> // Returns the optimal value a maximizer can obtain.> // depth is current depth in game tree.> // nodeIndex is index of current node in scores[].> // isMax is true if current move is of maximizer, else false> // scores[] stores leaves of Game tree.> // h is maximum height of Game tree> >function> minimax(depth, nodeIndex, isMax,> >scores, h)> {> >// Terminating condition. i.e leaf node is reached> >if> (depth == h)> >return> scores[nodeIndex];> > >// If current move is maximizer, find the maximum attainable> >// value> >if> (isMax)> >return> Math.max(minimax(depth+1, nodeIndex*2,>false>, scores, h),> >minimax(depth+1, nodeIndex*2 + 1,>false>, scores, h));> > >// Else (If current move is Minimizer), find the minimum> >// attainable value> >else> >return> Math.min(minimax(depth+1, nodeIndex*2,>true>, scores, h),> >minimax(depth+1, nodeIndex*2 + 1,>true>, scores, h));> }> > // A utility function to find Log n in base 2> >function> log2(n)> {> return> (n==1)? 0 : 1 + log2(n/2);> }> > // Driver Code> >// The number of elements in scores must be> >// a power of 2.> >let scores = [3, 5, 2, 9, 12, 5, 23, 23];> >let n = scores.length;> >let h = log2(n);> >let res = minimax(0, 0,>true>, scores, h);> >document.write(>'The optimal value is : '> +res);> > > >

>

>

Produksjon:

The optimal value is: 12>

Tidskompleksitet: O(b^d) b er forgreningsfaktoren og d er telling av dybde eller lag av graf eller tre.

Plass kompleksitet: O(bd) hvor b er forgreningsfaktor til d er maksimal dybde på treet som ligner på DFS.

Ideen med denne artikkelen er å introdusere Minimax med et enkelt eksempel.

  • I eksemplet ovenfor er det bare to valg for en spiller. Generelt kan det være flere valg. I så fall må vi gjenta for alle mulige trekk og finne maksimum/minimum. For eksempel, i Tic-Tac-Toe, kan den første spilleren gjøre 9 mulige trekk.
  • I eksemplet ovenfor er poengsummene (bladene av Game Tree) gitt til oss. For et typisk spill må vi utlede disse verdiene

Vi vil snart dekke Tic Tac Toe med Minimax-algoritmen.
Denne artikkelen er bidratt av Akshay L. Aradhya.