Everyone might be wondering. Argh, another new MINIMAX ALGORITHM.
Why do we need it? Let’s know to play a game of chess or tic-tac-toe we have often wondered if there was an algorithm to win the game.
Table of Contents
Explanation
A lot of times we might have wondered if
- It was possible to decipher the moves of the opponent
- It was possible to play optimally
MiniMax Algorithm brings in just the thing for us!
In a search tree for a two-player game, there can be two kinds of nodes
- MAX Nodes
- These are the nodes representing the move you can make
- Represented as upward-pointing triangles
- The goal of these nodes: Maximizing the value of subtree under the node
- Value of max node: Value of child with the maximum value
- These are the nodes representing the move you can make
- MIN Nodes
- These are the nodes representing the moves your opponent can make
- Represented as downward-pointing triangles
- The Goal of these nodes: Minimizing the value of subtree under the node
- Value of min node: Value of child with the minimum value
- These are the nodes representing the moves your opponent can make
A lot of this might not be making sense to you.
Let’s understand that by an example
Assume we have 8 initial states with the values as shown in the figure below
- Initially, we take the max of each one of two nodes
- Ex-From 3 and 15 we find the max
- We put this max value in the max node(Upward pointing triangles)
- Once the max cycle is completed we take the min from the max nodes
- Ex-From 15 and 10 we take 10
- We put this min value in the min node(Downward pointing triangle)
- Keep repeating this until we reach/finalize a value
Backtracking all the possible moves we make a decision choosing the values accordingly and reaching up to the conclusion
Let’s understand it better by a code snippet
Java Code for Minimax Algorithm
import java.io.*; import java.util.*; public class minimax { public static int decide(int cur,int index,boolean max,int weight[],int height) { int num=0; //If we reach a leaf node if(cur==height) return weight[index]; //If the node is a max one we find the max from sub-nodes if(max) num=Math.max(decide(cur+1,index*2,false,weight,height),decide(cur+1,index*2+1,false,weight,height)); //If it is a min node we minimize the value under the sub-tree else num=Math.min(decide(cur+1,index*2,true,weight,height),decide(cur+1,index*2+1,true,weight,height)); return num; } public static void main(String args[]) { int scor[] = {3, 15, 2, 10, 12, 5, 2, 23}; int n= scor.length; int h= (int)(Math.log(n) / Math.log(2)); int a=decide(0,0,true,scor,h); System.out.println(a); } }
C++ Code for Minimax Algorithm
#include<iostream> #include<cmath> using namespace std; int max(int a,int b) { if(a>b) return a; else return b; } int min(int a,int b) { if(a>b) return b; else return a; } /*int log2(int n) { if(n==1) return 0; else return(log2(n/2)); }*/ int decide(int cur,int index,bool max_dec,int weight[],int height) { int num; //If we reach a leaf node if(cur==height) return weight[index]; //If the node is a max one we find the max from sub-nodes if(max_dec) num=max(decide(cur+1,index*2,false,weight,height),decide(cur+1,index*2+1,false,weight,height)); //If it is a min node we minimize the value under the sub-tree else num=min(decide(cur+1,index*2,true,weight,height),decide(cur+1,index*2+1,true,weight,height)); return num; } int main() { int scor[] = {3, 15, 2, 10, 12, 5, 2, 23}; int n= 8; int h= log2(n); int a= decide(0,0,true,scor,h); cout<<a; return 0; }
12
Complexity Analysis
Time complexity=O(h*m)
Where
h=height/depth of the tree generated
m=number of moves at each point
Thus was an introduction to the minimax algorithm and how it works!
Check out a few other posts