You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Connect4游戏Minimax算法运行卡顿问题排查求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:35:01