@@ -145,39 +145,42 @@ def getAction(self, gameState: GameState):
145145 maxAction = actions [0 ]
146146
147147 for state , act in result_action .items ():
148- currVal = self .minimax (state , self .depth , 1 )
149- print (state , act )
148+ currVal = self .value (state , self .depth , 1 )
150149 if maxVal != max (currVal , maxVal ):
151150 maxVal = max (currVal , maxVal )
152151 maxAction = act
153152 return maxAction
154-
155- def minimax (self , gameState , currDepth , agent ):
156- actions = gameState .getLegalActions (agent ) # all possible actions
157- successor_states = [gameState .generateSuccessor (agent , act ) for act in actions ]
158153
154+ def value (self , gameState , currDepth , agent ):
159155 # Base case (Terminate state)
160156 if currDepth == 0 or gameState .isLose () or gameState .isWin ():
161157 return self .evaluationFunction (gameState ) #static evalutation
158+ if agent == 0 :
159+ return self .maxValue (gameState , currDepth , agent )
160+ else :
161+ return self .minValue (gameState , currDepth , agent )
162162
163- # Case 1: Maximizing
164- if agent == 0 : # Pacman
165- maxVal = - float ("inf" )
166- for act in successor_states :
167- val = self .minimax (act , currDepth , 1 )
168- maxVal = max (maxVal , val )
169- return maxVal
170-
171- # Case 2: Minimizing
172- if agent > 0 : # Not Pacman
173- minVal = float ("inf" )
174- for act in successor_states :
175- if agent + 1 == gameState .getNumAgents ():
176- val = self .minimax (act , currDepth - 1 , 0 )
177- else :
178- val = self .minimax (act , currDepth , agent + 1 )
179- minVal = min (minVal , val )
180- return minVal
163+ def maxValue (self , gameState , currDepth , agent ):
164+ actions = gameState .getLegalActions (agent ) # all possible actions
165+ successor_states = [gameState .generateSuccessor (agent , act ) for act in actions ]
166+ maxVal = - float ("inf" )
167+ for act in successor_states :
168+ val = self .value (act , currDepth , 1 )
169+ maxVal = max (maxVal , val )
170+ return maxVal
171+
172+ def minValue (self , gameState , currDepth , agent ):
173+ actions = gameState .getLegalActions (agent ) # all possible actions
174+ successor_states = [gameState .generateSuccessor (agent , act ) for act in actions ]
175+
176+ minVal = float ("inf" )
177+ for act in successor_states :
178+ if agent + 1 == gameState .getNumAgents ():
179+ val = self .value (act , currDepth - 1 , 0 )
180+ else :
181+ val = self .value (act , currDepth , agent + 1 )
182+ minVal = min (minVal , val )
183+ return minVal
181184
182185class AlphaBetaAgent (MultiAgentSearchAgent ):
183186 """
@@ -188,8 +191,61 @@ def getAction(self, gameState: GameState):
188191 """
189192 Returns the minimax action using self.depth and self.evaluationFunction
190193 """
191- "*** YOUR CODE HERE ***"
192- util .raiseNotDefined ()
194+ actions = gameState .getLegalActions (0 )
195+ successor_states = [gameState .generateSuccessor (0 , act ) for act in actions ]
196+ result_action = dict (zip (successor_states , actions ))
197+ maxVal = - float ('inf' )
198+ maxAction = actions [0 ]
199+
200+ alpha = - float ('inf' )
201+ beta = float ('inf' )
202+
203+ for state , act in result_action .items ():
204+ currVal = self .value (state , self .depth , 1 , alpha , beta )
205+ if maxVal != max (currVal , maxVal ):
206+ maxVal = max (currVal , maxVal )
207+ maxAction = act
208+ alpha = currVal
209+
210+ return maxAction
211+
212+ def value (self , gameState , currDepth , agent , alpha , beta ):
213+ # Base case (Terminate state)
214+ if currDepth == 0 or gameState .isLose () or gameState .isWin ():
215+ return self .evaluationFunction (gameState ) #static evalutation
216+ if agent == 0 :
217+ return self .maxValue (gameState , currDepth , agent , alpha , beta )
218+ else :
219+ return self .minValue (gameState , currDepth , agent , alpha , beta )
220+
221+ def maxValue (self , gameState , currDepth , agent , alpha , beta ):
222+ actions = gameState .getLegalActions (agent ) # all possible actions
223+ maxVal = - float ("inf" )
224+ for act in actions :
225+ successor_state = gameState .generateSuccessor (agent , act )
226+ val = self .value (successor_state , currDepth , 1 , alpha , beta )
227+ maxVal = max (maxVal , val )
228+ # Check for pruning
229+ if maxVal > beta :
230+ return maxVal
231+ alpha = max (alpha , maxVal )
232+ return maxVal
233+
234+ def minValue (self , gameState , currDepth , agent , alpha , beta ):
235+ actions = gameState .getLegalActions (agent ) # all possible actions
236+ minVal = float ("inf" )
237+ for act in actions :
238+ successor_state = gameState .generateSuccessor (agent , act )
239+ if agent + 1 == gameState .getNumAgents ():
240+ val = self .value (successor_state , currDepth - 1 , 0 , alpha , beta )
241+ else :
242+ val = self .value (successor_state , currDepth , agent + 1 , alpha , beta )
243+ minVal = min (minVal , val )
244+ # Check for pruning
245+ if minVal < alpha :
246+ return minVal
247+ beta = min (beta , minVal )
248+ return minVal
193249
194250class ExpectimaxAgent (MultiAgentSearchAgent ):
195251 """
0 commit comments