Connect4游戏Minimax算法运行卡顿问题排查求助
核心问题:代码逻辑错误导致的异常卡顿
你的代码存在几个关键错误,这些错误不仅会导致卡顿,还会让Minimax算法逻辑完全失效,必须先修复这些问题:
1. 二维棋盘的浅拷贝错误
temp = board.copy()是浅拷贝,对于二维数组来说,内部的每行列表还是引用原数组的对象,修改temp会直接改变原board的状态,导致递归过程中搜索树的状态混乱,计算量暴增且逻辑错误。
修复方案:使用copy.deepcopy来创建独立的棋盘副本:
import copy # ... temp = copy.deepcopy(board)
2. 全局实例变量self.evals的滥用
self.evals是实例级变量,递归调用的所有层级都会共享这个变量,不同分支的评估值会互相覆盖,导致计算出的评估值完全错误。
修复方案:在minimax_c4方法内部创建局部变量来存储当前节点的评估值,而不是依赖全局的self.evals:
def minimax_c4(self, board, computer, move): # ... 其他代码 ... # 初始化当前节点的评估列表,而不是用self.evals current_evals = [] for column in range(len(board[0])): if self.emptyCol(board, column): current_evals.append(None) # 可落子的列 else: current_evals.append(0) # 满列,无价值 # ... 后续逻辑改用current_evals ...
3. 不必要的clearBoard调用
因为之前用了浅拷贝,你试图用clearBoard还原原棋盘,但这完全是错误的操作——如果用深拷贝创建独立的temp,修改temp不会影响原board,所以这个方法完全不需要,应该删除相关调用。
4. chooseMove方法的逻辑错误
方法中if (ev > max)是把列索引和评估值比较,这会导致无法正确选择最大价值的移动,应该改为比较评估值:
if self.evals[ev] > max: max = self.evals[ev] index = ev
是否需要alpha-beta剪枝?
修复上述代码错误后,Minimax算法可以正常运行,但Connect4的状态空间非常庞大(约4.5×10¹⁰种可能状态),在棋盘初期(空位较多时),纯Minimax仍然会非常慢,甚至无法在合理时间内完成计算。此时alpha-beta剪枝是必要的优化,它可以大幅减少需要搜索的节点数量,让算法在合理时间内运行。
但如果是棋盘后期(剩余空位较少,比如少于10个),纯Minimax可以快速计算出结果。
内容的提问来源于stack exchange,提问作者soapeater

