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

优化带Alpha-Beta剪枝的Minimax算法以解决博弈树超时问题

带Alpha-Beta剪枝的Minimax算法优化问题

问题背景

我正在用带Alpha-Beta剪枝的Minimax算法解决一个博弈编程问题,规则如下:

  • 博弈以一棵有根树表示,每个节点有固定代价,非叶子节点必有子节点,游戏只能在叶子节点结束。
  • 玩家A(最大化方):可选择停留在当前节点,或前往任意子节点,目标是最大化最终获得的代价。
  • 玩家B(最小化方):必须选择子节点移动,无法停留,目标是最小化最终代价。
  • 双方均采用最优策略行动。

目前已实现的代码能得到正确结果,但节点规模较大时会超时。尝试用缓存优化Minimax搜索结果,但仅在玩家A选择前进时有效,玩家A选择停留时仍需重新执行搜索。

初始实现代码

vector<int> edges[MAXN];
int minimax(int node, bool p1_turn, int alpha, int beta) {
    if(edges[node].empty()) return cost[node];

    if(p1_turn) {
        int best = minimax(node, false, alpha, beta);
        for(auto u: edges[node]) {
            int val = minimax(u, false, alpha, beta);
            best = max(val, best);
            alpha = max(alpha, best);

            if(beta <= alpha) {
                break;
            } 
        }
        return best;
    } else {
        int best = MAX_INF;
        for(auto u: edges[node]){
            int val = minimax(u, true, alpha, beta);
            best = min(best, val);
            beta = min(best, beta);

            if(beta <= alpha){
                break;
            }
        }
        return best;
    }
}

// 调用示例
minimax(1, true, MIN_INF, MAX_INF)

修改后的代码(贴合维基百科Alpha-Beta剪枝伪代码)

if(edges[node].empty()) return cost[node];
if(p1_turn) {
    int best = minimax(node, false, alpha, beta);
    for(auto u: edges[node]) {
        best = max(best, minimax(u, false, alpha, beta));
        if(best > beta) {
            break;
        }
        alpha = max(alpha, best);        
    }
    return best;
} else {
    int best = MAX_INF;
    for(auto u: edges[node]){
        best = min(best, minimax(u, true, alpha, beta));
        if(best < alpha){
            break;
        }
        beta = min(best, beta);
    }
    return best;
}

内容的提问来源于stack exchange,提问作者user20888300

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:10:20