From 3fcd55923bd5daa7756eb69ce8abde5771b7f028 Mon Sep 17 00:00:00 2001 From: snsd0805 Date: Tue, 9 Apr 2024 18:46:56 +0800 Subject: [PATCH] feat: alpha-beta prunning --- multiAgents.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/multiAgents.py b/multiAgents.py index 0c47806..a7e7edb 100644 --- a/multiAgents.py +++ b/multiAgents.py @@ -196,7 +196,35 @@ class AlphaBetaAgent(MultiAgentSearchAgent): Returns the minimax action using self.depth and self.evaluationFunction """ "*** YOUR CODE HERE ***" - util.raiseNotDefined() + return self.result(gameState, 0, self.depth, -1e9, 1e9)[1] + + def result(self, state, agentIndex, depth, alpha, beta): + if depth == 0 or state.isLose() or state.isWin(): + return self.evaluationFunction(state), None + elif agentIndex == 0: # maximize + (nextAgentIndex, nextDepth) = (0, depth-1) if agentIndex == (state.getNumAgents()-1) else (agentIndex+1, depth) + max_reward, max_action = -1e9, None + + for action in state.getLegalActions(agentIndex): + reward = self.result(state.generateSuccessor(agentIndex, action), nextAgentIndex, nextDepth, alpha, beta)[0] + if reward > max_reward: + max_reward, max_action = reward, action + if reward > beta: + return reward, action + alpha = max(alpha, max_reward) + return max_reward, max_action + else: # minimize + (nextAgentIndex, nextDepth) = (0, depth-1) if agentIndex == (state.getNumAgents()-1) else (agentIndex+1, depth) + min_reward, min_action = 1e9, None + + for action in state.getLegalActions(agentIndex): + reward = self.result(state.generateSuccessor(agentIndex, action), nextAgentIndex, nextDepth, alpha, beta)[0] + if reward < min_reward: + min_reward, min_action = reward, action + if reward < alpha: + return reward, action + beta = min(beta, min_reward) + return min_reward, min_action class ExpectimaxAgent(MultiAgentSearchAgent): """