写这篇博客的目的呢,是因为做(嫖)了一个黑白棋的课设,就对这玩意产生了点兴趣,还请个位指教!

Minimax算法

Minimax算法大多被用于棋类游戏中,是一种找出失败的最大可能性中的最小值的算法,即最小化对手的最大得益的算法,就是说想将自己的分数尽量高,而对手尽量选取小的值的算法。

首先先来了解一下这几个概念

局面估价函数:我们给每个局面(state)规定一个估价函数值 f,评价它对于己方的有利程度。胜利的局面的估价函数值为 +oo,而失败的局面的估价函数值为–oo。

Max 局面:假设这个局面轮到己方走,有多种决策可以选择,其中每种决策都导致一种子局面(sub-state)。由于决策权在我们手中,当然是选择估价函数值 f 最大的子局面,因此该局面的估价函数值等于子局面 f 值的最大值,把这样的局面称为 max 局面。

Min 局面:假设这个局面轮到对方走,它也有多种决策可以选择,其中每种决策都导致一种子局面(sub-state)。但由于决策权在对方手中,在最坏的情况下,对方当然是选择估价函数值 f 最小的子局面,因此该局面的估价函数值等于子局面 f 值的最小值,把这样的局面称为 max 局面。

现在看这么一个博弈树


画的好像有点烂,不过没关系的。
现在我和你进行博弈下棋,我先手,我在下棋的时候,当然会想着取到最好的结果,这个结果我们用之前提到的估值来表示,在那个博弈树里面,最后一层代表着估值,我先手,我当然希望我得到最大的估值,那我的那一步也就是那个节点的估值要从下面的节点开始,我们是max局面,就是取得最好值,你对我来说应该取到min局面,为什么我说那你取得是min局面呢??因为你看那个博弈搜索树,我下一步,你下一步,你的min值决定了我的max值,就说第三层和第四层,1 和 -4,你在第五层取-4的时候,也可以取3,但你要是取了3,对我的max局面来说就会取到3,而不是1了。

那我们在设计棋类算法的时候,就要考虑到每个点的估值。

黑白棋中的估值表

多玩几次黑白棋,那就会发现,边角上的棋子很重要,黑白棋的游戏规则就不说了,总之就是边角上的 棋子很重要,在边角旁边的棋子又很危险,因为放置在这里,最后可能会被一波转化掉,根据经验,我们可以得到一个估值表。

这样在AI决策的时候就会方便许多。

对于AI的设定,我们能走边角就尽量走边角,不到万不得已的情况下,不走邻角点,对于其他情况,我们采用极大极小算法。

α-β剪枝

经过查阅可以得知,六层的搜索就接近是二十亿,而十层的搜索就超过两千万亿,so??
就有了所谓的α-β剪枝。
怎么理解这个α-β剪枝呢?
就还拿我上面画的图举例子。我们看第二层吧,1和9,第二层的那个9的选取,第三层的第二个节点是10,第三个节点是9,假如说我们已经已知了9,对第三层10选取的时候,我只知道第四层的第四个是10,第四层的第三个节点假设不清楚,那么第三层的那个节点值它肯定是>=10的吧,因为这里为max决策,然后上一层为min决策,那再10下面的哪一片就可以剪枝掉,这种剪枝方式局叫做α-β剪枝。

简单难度AI设计

这个简单难度的AI就简单设计,AI的算法为贪心算法,寻找每次可以转换最多点。说实话,这个简单AI属实拉跨,我用贪心思想跟AI的贪心算法下,AI有的时候下不过我,哈哈哈哈哈!

POINT2 Easy()                                        //人机对战简单AI
{POINT2 MAX;                                        //定义以及初始化最优解MAX.INIT(0, 0);int maxx = 0;for (int i = 0; i < SIZE; ++i)for (int j = 0; j < SIZE; ++j){if (expect[i][j] >= maxx)             //寻找可以转化棋子最多的点作为最优解{maxx = expect[i][j];MAX.INIT(i, j);}}if (ESCEXIT)gameStart();Sleep(800);                                       //间歇return MAX;                                     //返回最优解
}

纯贪心思想,使用之前给到的每个点的估值进行判断的。

中等难度AI的设计

POINT2 MIDDLE()                                  //人机对战中等AI
{POINT2 MAX;int maxx = -10005;MAX.INIT(0, 0);for (int i = 0; i < SIZE; i++)for (int j = 0; j < SIZE; j++){if (expect[i][j]){if ((i == 0 && j == 0) || (i == 0 && j == SIZE - 1) || (i == SIZE - 1 && j == SIZE - 1) || (i == SIZE - 1 && j == 0)){MAX.INIT(i, j);return MAX;                                       //如果在角,返回角坐标}int k = difai(i, j, mapp, expect, 0, 1);                   //递归搜索 搜索一层if (k >= maxx){maxx = k;MAX.INIT(i, j);}}}return MAX;
}

困难难度AI

困难难度和中等难度的区别就是搜索的深度不同,通俗点讲的话就是我们下棋可以一眼看几步

POINT2 Difficult()                                   //人机对战困难AI
{POINT2 MAX;int maxx = -10005;MAX.INIT(0, 0);for (int i = 0; i < SIZE; i++)for (int j = 0; j < SIZE; j++){if (expect[i][j]){if ((i == 0 && j == 0) || (i == 0 && j == SIZE - 1) || (i == SIZE - 1 && j == SIZE - 1) || (i == SIZE - 1 && j == 0)){MAX.INIT(i, j);return MAX;                                       //如果在角,返回角坐标}int k = difai(i,j,mapp,expect,0,3);                    //递归搜索 搜索三层if (k >= maxx){maxx = k;MAX.INIT(i, j);}}}return MAX;
}

最大最小搜索搜索算法

还是递归的运用,至于剪枝,是有一点点啦

int difai(int x,int y,int mapnow[SIZE][SIZE],int expectnow[SIZE][SIZE],int depin,int depinmax)                       //极大极小搜索
{if (depin >= depinmax)return 0;                                            //递归出口int maxx = -10005;                                                       //最大权值POINT2 NOW;int expectnow2[SIZE][SIZE] , mapnow2[SIZE][SIZE],mapnext[SIZE][SIZE],expectlast[SIZE][SIZE];                   //定义临时数组copymap(mapnow2, mapnow);                                               //复制当前棋盘mapnow2[x][y] = NOWCOLOR ? 1 : -1;                                     //模拟在当前棋盘上下棋int ME = MAPPOINTCOUNT[x][y] + expectnow[x][y];                           //当前棋子权NOW.INIT(x,y);Change(NOW, mapnow2, false);                                           //改变棋盘AI结束int MAXEXPECT = 0, LINEEXPECT = 0, COUNT = 0;for (int i = 0; i < SIZE; ++i)for (int j = 0; j < SIZE; ++j){expectnow2[i][j] = Judge(i, j, !NOWCOLOR, mapnow2);             //预判对方是否可以走棋if (expectnow2[i][j]){++MAXEXPECT;if ((i == 0 && j == 0) || (i == 0 && j == SIZE - 1) || (i == SIZE - 1 && j == SIZE - 1) || (i == SIZE - 1 && j == 0))return -1800;  //如果对方有占角的可能if ((i < 2 && j < 2) || (i < 2 && SIZE - j - 1 < 2) || (SIZE - 1 - i < 2 && j < 2) || (SIZE - 1 - i < 2 && SIZE - 1 - j < 2))++LINEEXPECT;}}if (LINEEXPECT * 10 > MAXEXPECT * 7)return 1400;                       //如果对方走到坏点状态较多 剪枝for (int i = 0; i < SIZE; i++)for (int j = 0; j < SIZE; j++)if (expectnow2[i][j])                                          //如果对方可以走棋{int YOU = MAPPOINTCOUNT[i][j] + expectnow2[i][j];          //当前权值copymap(mapnext, mapnow2);                                    //拷贝地图mapnext[i][j] = (!NOWCOLOR) ? 1 : -1;                        //模拟对方走棋NOW.INIT(i, j);Change(NOW, mapnext, false);                             //改变棋盘for (int k = 0; k < SIZE; k++)for (int l = 0; l < SIZE; l++)expectlast[k][l] = Judge(k, l, NOWCOLOR, mapnext);   //寻找AI可行点for (int k = 0; k < SIZE; k++)for (int l = 0; l < SIZE;l++)if (expectlast[k][l]){int nowm = ME - YOU + difai(k, l, mapnext, expectlast, depin + 1, depinmax);maxx = maxx < nowm ? nowm : maxx;}}return maxx;
}

本课设以征求开源作者同意使用,本来博主是拒绝白嫖的,ue4不香吗,垃圾玩意崩溃打不开项目了,也就有了这篇博文.

博弈之最大最小搜索搜索相关推荐

  1. 【域泛化综述-2022 TPAMI】Domain Generalization: A Survey

    文章地址:https://doi.org/10.1109/TPAMI.2022.3195549 解决的问题 域泛化和域自适应(Domain Adaptation)相比,目标域数据未知. 机器对分布之外 ...

  2. 《Twenty Lectures On Algorithmic Game Theory》 总结

    文章目录 Part I 机制设计 社会福利最大化机制设计 收益最大化机制设计 多参数机制设计 含支付约束的机制设计 不含钱机制设计(支付约束为0) Part II 一般博弈与均衡 自私路由与无秩序代价 ...

  3. BZOJ2275[Coci2010]HRPA——斐波那契博弈

    题目描述 N个石子,A和B轮流取,A先.每个人每次最少取一个,最多不超过上一个人的个数的2倍. 取到最后一个石子的人胜出,如果A要有必胜策略,第一次他至少要取多少个. 输入 第一行给出数字N,N< ...

  4. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

  5. 清华姚班“斩获”AAAI 2020最佳学生论文:首届弟子贝小辉携手本科在读李子豪,攻坚算法博弈研究...

    本文经AI新媒体量子位(公众号ID:qbitai)授权转载,转载请联系出处 本文约1700字,建议阅读5分钟 江湖英雄辈出,又是姚班少年郎. 江湖英雄辈出,又是姚班少年郎. 第34届美国人工智能协会年 ...

  6. 博弈知识汇总----Tanky Woo(转)

    原文链接:http://www.wutianqi.com/?p=1081 以下是我从网上收集的关于组合博弈的资料汇总: 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个 人 ...

  7. 博弈论入门之威佐夫博弈

    威佐夫博弈 威佐夫博弈是一类经典的博弈问题 有两堆石子,两个顶尖聪明的人在玩游戏,每次每个人可以从任意一堆石子中取任意多的石子或者从两堆石子中取同样多的石子,不能取得人输,分析谁会获得胜利 博弈分析 ...

  8. 模拟上帝之手的对抗博弈——GAN背后的数学原理

    模拟上帝之手的对抗博弈--GAN背后的数学原理 深度学习 人工智能 机器学习 神经网络 神经网络与机器学习-英文版 阅读1984  作者:李乐 CSDN专栏作家 简介 深度学习的潜在优势就在于可以利用 ...

  9. 博弈之 取石子1——6)

    一.巴什博奕(Bash Game): 首先我们来玩一个比较古老的报数游戏.A和B一起报数,每个人每次最少报一个,最多报4个.轮流报数,看谁先报到30. 如果不知道巴什博弈的可能会觉得这个是个有运气成分 ...

最新文章

  1. 华为与各国政府签订无间谍无后门协议
  2. Python脚本后台运行的五种方式
  3. linux下json数据解析,Linux下使用jq简单解析json的方法
  4. 感动 ∣她养我长大,我陪她到老!90后女孩带痴呆症养母读研
  5. yctx mysql.sql_MySQL 安装指南
  6. 微软官方WebCast视频打包下载
  7. (已解决)MAC JAVA错误:Cocoa AWT: Not running on AppKit thread 0 when expected
  8. java 歌词解析代码_网易云歌词爬取(java)
  9. linux计划任务详解(附演示)
  10. win10下如何快速安装迷你迅雷
  11. Zemax操作25--像差理论和修正(球差、慧差、像散)
  12. smartbi和mysql_学不好报表分析?看看Smartbi报表工具的学习笔记吧!
  13. 3d可视化建模产品三维展示平台应用广
  14. CDH6.2配置spark.yarn.jars目录
  15. 朗逸保险丝安培数及保险丝配置说明
  16. 817自动控制原理-2-关于阻尼
  17. php鲜花销售理论意义,鲜花销售系统(论文+源代码)论文有用
  18. 阶段性小结(一)---R语言回归案例实战算法比较
  19. 代码随想录训练营day41
  20. 用python控制钉钉软件_Python实现钉钉消息推送

热门文章

  1. 【调剂】首都师范大学2023年硕士研究生调剂公告
  2. SAP-QM 对于出货检检验批数量和实际批数量对不上?
  3. HTML5期末大作业:仿淘宝电商网站设计——仿淘宝电商管理系统(21页)含论文 HTML+CSS+JavaScript 学生DW网页设计作业成品 大学生网页制作期末作业
  4. C语言东方博宜1667最大数最小数之差
  5. Authentication认证和Authorization授权的作用
  6. 微软爱开发者 | 十月,“拾月”, 盛派开发者社区召唤您
  7. 使用盛派微信SDK(Senparc.Weixin.MP)设计公众号被动回复API不返回信息问题
  8. 沉睡者IT - [短视频运营] 抖音短视频成SEO新风口
  9. 苹果x如何截屏_原来苹果手机按下这个按钮就能长截屏!简单操作几步,轻松搞定...
  10. 好风凭借力,微信产业链上“三大势力”已形成