首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >隔三岔五聊算法之极小极大算法

隔三岔五聊算法之极小极大算法

作者头像
PM小王
发布2019-07-02 16:52:14
1.7K0
发布2019-07-02 16:52:14
举报
文章被收录于专栏:程序员小王程序员小王

这是一个全新的系列--隔三岔五聊算法。这个系列充满不确定性,什么时间更新全靠自己的心情,今天的文章也有能是最后一篇,内容方面会用通俗易懂的方式聊一下自己学过的算法。

最近学校的课程设计自己做了个五子棋的游戏,今天就聊一聊五子棋游戏中用到的极小极大算法(The Minimax Algorithm)

具体介绍

Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两方较量的游戏和程序,这类程序由两个游戏者轮流,每次执行一个步骤。我们众所周知的五子棋、象棋等都属于这类程序,所以说Minimax算法是基于搜索的博弈算法的基础。该算法是一种零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,而另一方则选择令对手优势最小化的方法。

基本思路:

一般解决博弈类问题的自然想法是将格局组织成一棵树,树的每一个节点表示一种格局,而父子关系表示由父格局经过一步可以到达子格局。Minimax也不例外,它通过对以当前格局为根的格局树搜索来确定下一步的选择。而一切格局树搜索算法的核心都是对每个格局价值的评价。Minimax算法基于以下朴素思想确定格局价值:

  • Minimax是一种悲观算法,即假设对手每一步都会将我方引入从当前看理论上价值最小的格局方向,即对手具有完美决策能力。因此我方的策略应该是选择那些对方所能达到的让我方最差情况中最好的,也就是让对方在完美决策下所对我造成的损失最小。
  • Minimax不找理论最优解,因为理论最优解往往依赖于对手是否足够愚蠢,Minimax中我方完全掌握主动,如果对方每一步决策都是完美的,则我方可以达到预计的最小损失格局,如果对方没有走出完美决策,则我方可能达到比预计的最悲观情况更好的结局。总之我方就是要在最坏情况中选择最好的。

说白了,这个算法就是一个树形结构的递归算法,每个节点的孩子和父节点都是对方玩家,所有的节点被分为极大值节点和极小值节点。

代码演示:

function minimax(node, depth)
    if node is a terminal node or depth = 0
        return the heuristic value of node
    if the adversary is to play at node
        let α := +∞
        foreach child of node
            α := min(α, minimax(child, depth-1))
    else {we are to play at node}
        let α := -∞
        foreach child of node
            α := max(α, minimax(child, depth-1))
    return α

上述代码depth是最多预测层数限制,函数递归有两个出口,一是到达层数限制即depth 为 0,二是已经递归到叶子节点,在游戏中体现为“死棋“或者有一方已经确定胜利获失败

图解算法:

假设我们有如下图的游戏,我是先手,我应该如何利用Minmax算法来选出第一步怎么走呢?

这个时候我们就要从结果看起,也就是第4步。图中标注第四步是我的对手下的,所以他要做的是最小化这个分数,于是对手根据结果可以反推出如下选择

继续从后往前看到第3步,当我们知道了对手的选择以后,我们可以根据对手的结果反推出自己的选择,我们要做的是最大化这个分数,如图

重复这个步骤,我们最终可以发现第一步的最优选择,如图

以上就是极小极大算法(Minimax)。

这只是一个简单的案例,对于一个复杂的游戏来说,比如五子棋,肯定是需要非常多步才能完成的。因为minimax的算法是树形结构,不断地向下拓展该树会导致计算量的倍数增加(多少倍取决于所剩可选的当前支孩子节点的数量),也就是说,如果这个游戏每一步都有n个选择,那么在x步以后,将会有n^x个选择。当选择多的时候,就需要采取剪枝算法(Alpha-Beta)来减少运算量。从剪枝算法这个名字我们就能看出,这个算法能让我们剪掉树状图中的一些分支,从而减少运算量

【参考资料】

http://web.cs.ucla.edu/~rosen/161/notes/alphabeta.html

http://web.cs.ucla.edu/~rosen/161/notes/minimax.html

http://blog.codinglabs.org/articles/2048-ai-analysis.html

我是小王,

如果有下一篇的话,

我们下一篇再见。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 具体介绍
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档