数据结构——人机对弈(minimax、negamax、alpaha-beta剪枝算法)

本文介绍了数据结构课程中学到的minimax、negamax和alpha-beta剪枝算法,这些算法常用于棋类游戏的人机对战。minimax算法是基于极大化极小原则,通过遍历博弈树寻找最优解。negamax是对minimax的优化,通过取负值简化比较。alpha-beta剪枝则通过设定alpha和beta值来避免无效路径的搜索,提高效率。文章还提供了代码实现,并分享了调试过程中的学习心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

研究契机

本学期学校开设数据结构课程,研究了一下minimax、negamax、alpha-beta剪枝算法,以供自己以后复习参考。

minimax算法

也就是极大化极小算法,对于零和博弈,一方所赢就是另一方所输,对于一棵博弈树,可以被分成max层和min层,所谓max层,在实际应用中就代表博弈时自己的回合,在自己的回合想要将自己的利益最大化,所以会遍历博弈树种孩子孩子结点的权值,并回传权值种最大的值,而对于min层,可以理解为对手回合,对手在自己的回合想要将我们的利益最小化,所以会遍历所有的孩子结点并回传最小值,在算法实现中可以用递归来实现。在这样的原理中,就可以通过遍历博弈树,比较每一种情况的权值,找到当前回合的全局最优解或局部最优解。

negamax算法

negamax算法和minimax在本质思想上是一致的,可以看作对minimax使用了一些数学技巧,首先将所有叶子结点上的值取负,然后在每一次回传时都会再次取负,这样每一次比较都只需取最大值即可,但是本质上都是采用了通过遍历博弈树最大化自身利益最小化对手利益的思想。

alpfa-beta剪枝

在程序实际运行过程中,计算机对于博弈树的遍历时自顶向下的,对于博弈过程中不会采取的路径可以进行剪枝。具体实现方法是将设定alpha代表自身最大利益,beta代表本回合对手能够将为我们的利益降到的权值,将alpha初始化为-∞,beta初始化为∞,在遍历博弈树时,在max层可以更新alpha的值,在min层可以更新beta的值,具体可以通过for循环来实现,当出现alpha>beta的情况时,就会进行剪枝,因为这条路径会导致对手降低我们取得的权重,也就是损害了我们的利益,我们在决策时不会选择这条路径,因此可以进行剪枝。

人机对战应用

在棋类游戏和一些信息对称的零和博弈游戏中,够可以采用minmax算法或者nagamax算法来预测最优解或者局部最优解,这样就可以实现人机对战,而采用alpha-beta剪枝算法,可以避免对不必要路径遍历所带来的时间和空间损耗。

代码实现

贴出了我所设计程序过程中所使实现的算法,针对不同需求可以进行优化

int minimax(int(*board)[3], int depth, int alpha, int beta) {
   
    int result = score(board, 3).result;
    if (depth == 0 || result != -1) {
   //如果可以分出输赢,直接返回结果
        if (result != -1)//首先判断是否结束
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值