0

0

Gomoku AI 修复:Minimax 必须正确定义胜负评估以防止对手获胜

碧海醫心

碧海醫心

发布时间:2026-01-11 14:42:33

|

576人浏览过

|

来源于php中文网

原创

Gomoku AI 修复:Minimax 必须正确定义胜负评估以防止对手获胜

本文详解 gomoku(五子棋)ai 中 minimax 算法无法识别并阻止对手必胜局面的根本原因——胜负判断时混淆了玩家身份,导致评估值符号错误;通过修正 `iswinningmove` 的归属判断逻辑与返回值语义,可确保 ai 在任意搜索深度下优先拦截对手的四连、活三等致胜威胁。

在实现 Gomoku(五子棋)的 Minimax AI 时,一个常见但隐蔽的致命缺陷是:AI 能积极进攻(如构建四连、制造双杀),却对人类玩家即将形成的五连视而不见。正如问题中所示,当对手(HUMAN)已在棋盘上形成潜在的“活三”或“冲四”时,AI 并未选择防守落点(如示例中的位置 64),反而执行无关紧要的进攻动作(如 20)。这并非搜索深度不足或启发式函数粗糙所致,而是 胜负状态评估逻辑存在根本性语义错误

? 根源问题:胜负归属与评分符号错位

关键错误位于 minimax 函数中对终局状态的提前终止判断:

if (isWinningMove(board, opponent, latestRow, latestCol)) {
  const multiplier = player === COMP ? 1 : -1; // ❌ 错误:应基于 opponent 判断!
  return [ WINNING_MOVE * multiplier, latestRow * COLS + latestCol ];
}

这段代码本意是:若上一手棋(由 opponent 落下)直接导致其获胜,则当前节点为终局。但 multiplier 却错误地依据当前轮到谁走(player) 来决定分值正负,而非依据谁真正获胜(opponent)

  • ✅ 正确逻辑:若 opponent === COMP(即电脑刚赢),该局面对当前 player(人类)是极大劣势 → 应返回大负值(-WINNING_MOVE);
  • ✅ 若 opponent === HUMAN(即人类刚赢),该局面对当前 player(电脑)是极大劣势 → 应返回大负值(-WINNING_MOVE);
  • ❌ 原逻辑中 player === COMP ? 1 : -1 实际将人类获胜判为 +WINNING_MOVE(对电脑有利!),彻底反转了胜负语义,导致 AI 主动“欢迎”对手获胜。

✅ 正确修复:按实际获胜方定符号,按逻辑清空无效 move

只需两处修改:

if (isWinningMove(board, opponent, latestRow, latestCol)) {
  // ✅ 修正1:multiplier 由 opponent 决定(COMP 是最大化方,HUMAN 是最小化方)
  const multiplier = opponent === COMP ? 1 : -1;

  // ✅ 修正2:终局无“最佳移动”,返回 -1 表示无效 move,避免误导上层
  return [ WINNING_MOVE * multiplier, -1 ];
}

同时,建议同步修正 depth === 0 分支中的 move 返回值(虽非本问题主因):

Removal.AI
Removal.AI

AI移出图片背景工具

下载
if (depth === 0) {
  const val = evaluateBoard(board, latestRow, latestCol);
  return [val, -1]; // 非终局也无需返回具体 move,由上层收集
}

? 为什么低深度有时“碰巧有效”?

当 maxDepth = 1 时,AI 仅看一步后局面:若人类落子后直接五连,isWinningMove(..., HUMAN, ...) 触发,原错误逻辑会返回 WINNING_MOVE * (-1) = -100000 —— 这个巨大负值仍能被 min 层捕获并规避。但随着深度增加(如 depth=3),错误评分会在多层传播中被剪枝(alpha-beta)或平均效应削弱,导致防守意图被“淹没”。修复后,所有深度下人类获胜均稳定返回 -100000,确保防守动作始终具备最高优先级。

? 完整修复后行为验证(示例棋盘)

对问题中 exampleBoard,修复后调用 getBestMove(exampleBoard, 3) 将稳定返回 64(即第7行第1列,0-indexed 行列 row=7, col=1),该位置恰好堵住人类从 (6,2)→(5,3)→(4,4) 延伸的斜线四连,消除下一步必胜威胁。

? 进阶建议:为提升实战鲁棒性,可在 evaluatePlayerBoard 中增强局部威胁检测(如区分“活四”“冲四”“活三”并赋不同权重),但胜负判定的符号正确性是 Minimax 生效的前提,不可妥协。

通过本次修复,你的 Gomoku AI 将真正具备“攻守兼备”的博弈能力:既不放过任何制胜机会,也绝不放任对手完成五连——这才是完备博弈 AI 的基石。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

400

2023.08.14

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

61

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

31

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

73

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

20

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

4

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

49

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号