Skip to content

Commit 719146f

Browse files
committed
minimax & alphabeta complete
1 parent 9cd01bd commit 719146f

File tree

2 files changed

+82
-26
lines changed

2 files changed

+82
-26
lines changed

2022/FA22/intro-ai-series/workshop-2-multi-agent-algorithms/src/multiAgents.py

Lines changed: 82 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

182185
class 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

194250
class ExpectimaxAgent(MultiAgentSearchAgent):
195251
"""

0 commit comments

Comments
 (0)