From 4cb5059fc235be4c3da665559207f771307b4e95 Mon Sep 17 00:00:00 2001
From: DannyAbdi <dannyabdi13@gmail.com>
Date: Fri, 8 Mar 2024 01:44:40 +0000
Subject: [PATCH] Modified minmax algorithm to incorporate alpha beta pruning

---
 minmax.py | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/minmax.py b/minmax.py
index e991a2f..cb745b9 100644
--- a/minmax.py
+++ b/minmax.py
@@ -34,37 +34,42 @@ class MinMax:
                 self.maze.current_level[y][x] != 1)
 
     """
-    Performs the MinMax algorithm to determine the best move the enemy can take.
+    Performs the MinMax algorithm with Alpha-beta pruning to determine the best move the enemy can take.
 
     :param player_position: The current position of the player agent.
     :param enemy_position: The current position of the enemy agent.
     :param depth: The depth of the MinMax search tree.
-    :param maximising_player: True if maximising player (enemy), False if minimising player (player).
+    :param alpha: The best value that the maximizing player currently can guarantee.
+    :param beta: The best value that the minimizing player currently can guarantee.
+    :param maximizing_player: True if maximizing player (enemy), False if minimizing player (player).
     :return: The best move for the enemy agent.
     """
-    def minmax(self, player_position, enemy_position, depth, maximising_player):
+    def minmax(self, player_position, enemy_position, depth, alpha, beta, maximizing_player):
         if depth == 0 or self.game_over():
             # Evaluate the current game state
             return self.evaluate(player_position, enemy_position)
 
-        if maximising_player:
+        if maximizing_player:
             max_eval = float('-inf')
             valid_moves = self.get_valid_moves(enemy_position)
-            best_move = None
             for move in valid_moves:
                 if self.is_valid_move(move):
-                    eval = self.minmax(player_position, move, depth - 1, False)
-                    if eval > max_eval:
-                        max_eval = eval
-                        best_move = move
-            return max_eval if depth == 1 else best_move
+                    eval = self.minmax(player_position, move, depth - 1, alpha, beta, False)
+                    max_eval = max(max_eval, eval)
+                    alpha = max(alpha, eval)
+                    if beta <= alpha:
+                        break
+            return max_eval
         else:
             min_eval = float('inf')
             valid_moves = self.get_valid_moves(player_position)
             for move in valid_moves:
                 if self.is_valid_move(move):
-                    eval = self.minmax(move, enemy_position, depth - 1, True)
+                    eval = self.minmax(move, enemy_position, depth - 1, alpha, beta, True)
                     min_eval = min(min_eval, eval)
+                    beta = min(beta, eval)
+                    if beta <= alpha:
+                        break
             return min_eval
 
     """
-- 
GitLab