极小化极大算法

此博客是我对之前学习的minimax算法的个人总结,毕竟有一段时间没实际使用此算法了,需要巩固一下。除了我下文标注的引用以外其他内容都是原创的,如果需要转载请注明出处,谢谢。


基本算法思想

极小化极大(minimax)算法顾名思义,就是让最大得情况最小,这里的最大一般是指最差的情况,比如游戏中最不利的情况。

该算法需要满足零和博弈,初略的解释就是若有两个玩家进行游戏,如果其中一方得到利益那么另一方就会失去利益,游戏利益的总和为0(某些情况下为常数)。

因此,零和的约束条件也使得该算法在很多游戏中图体现出很好的效果,比如大多数的棋类游戏。

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

算法思想参考维基的伪代码:

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,二是已经递归到叶子节点,在游戏中体现为“死棋“或者有一方已经确定胜利获失败。

下面的两个迭代过程需要进行玩家判断,因为我们需要最小话敌方的优势(最大化我方优势),所以对应敌方的当前步,需要返回找到的min;我方的当前步,需要返回找到的max。

与此同时,迭代本身体现在我们假设对方也做出了在我们已经考虑到的范围内(同样想到了这层策略)的最佳判断,因为游戏通常是双方交替进行的,所以通常在实际编程中我们还要给minimax方法中添加一个确认当前玩家身份的参数,如果只有两个玩家布朗型可能是一个较好的选择。

每次的迭代,都可以认为是向上一层的预测,当然,因为minimax的算法是树形结构,不断地向下拓展该树会导致计算量的倍数增加(多少倍取决于所剩可选的当前支孩子节点的数量)。但是有可能会出现一种情况,当函数递归到一定层数(计算量达到一定数值后),所剩可选分支已经很少(很多已经到达叶子节点),可继续递归的子节点数量也相应减少,反而高层级的预测计算量并不大。当然通常情况是在还没到达这个极值之前,计算机已经无法在可以接受的时间内进行玩这些计算了,比如围棋。


alpha-beta 剪枝

每个节点都有其α β两个值,α记录当前最大值,β记录当前最小值。所有层级的α默认值为负无穷,β默认值为正无穷。




这里右边正方形节点出现了α >= β的情况,也就是说当前节点我们找到的(部分)最小值已经不大于父节点的最大值判断。因为父节点是极大值节点,当前节点是极小值节点,所以我们如果我们继续遍历剩下的孩子节点,找到的β只可能比当前小,所以从父节点的角度来看,当前已经没有继续遍历的需要,所以我们应该减掉剩下的孩子节点,也就是途中的右下圆形节点,直接更新父节点(上方圆节点),但是如果这不是二叉树结构,还有别的方形节点未访问,仍需继续访问完再更新,但是这种情况下的当前方形节点的圆型子节点就没有必要继续访问了(无论有多少)。


还有一种相反的情况是上过程的方形和圆形节点全部替换,如果在圆形节点出现α >= β的情况,可以减掉剩下的枝(跳过所有剩下未访问的子节点)


关于建模问题

实话说数学建模一直是我的弱点,之前研究机器学习的内容理解还好,但是一旦要实际问题建模我就开始头疼。所以这里我不准备用数学语言做很复杂的描述,而是举几个简单的例子,以说明minimax算法的建模特点为目的,不深究其数学细节。

五子棋例子

五子棋游戏是最适合用minimax算饭进行ai设计的棋类游戏之一,也是很多教程用来教学的案例。五子棋游戏的minimax结构每个节点代表在对应棋格下一子,其所有的子节点是剩下所有空的棋格。当然第一步的棋子最好人为设定走法,因为如果计算的话计算量太大而且没有意义。

对局势判断其实只有一下两个因素的排列组合

      1. 我方棋子目前有多少子相连 A[1,2,3,4,5]

      2. 相连子两边空位有几个 B[0,1,2]

分别看这两组很数据,逻辑明显,越大越好

结合起来假设D[B][A]为决策,当B > 0时,A越大越好

在实际AI设计时,应考虑到优先级最高的是直接赢得比赛,因此可以在当有D[B][4] (B > 0)出现时应该直接选择赢得比赛而不是去防守

所以,需要区分D为表示己方的Dx(加分)和表示对手的Dy(扣分),而且保证Dx[][5] > -Dy[][5]

而当B = 0的情况下,除非A = 5,其他情况对于双方是没有区别的,所以都应该是不加分不减分

当然还有一些其他有趣的细节可以优化这个AI的判断,这些就有待以后慢慢补充了



  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值