极大极小算法 井字棋人机对战软件应用(可与工业机器人串口通讯)

一、背景:

        在当前人工智能高速发展的时代,多学习点与人工智能有关的知识是很好的,下面这个是我在休闲时间写的一个井字棋人机对战软件,应用的算法是极大极小值算法。

二、极大极小算法

        应用背景:只要是你一步我一步的游戏,都可以应用这个极大极小值算法来进行计算最优解。极大极小值算法求解的过程其实就是个人机博弈的过程,在这个过程中,你想要谁获胜,那这个"人"它的目的就是要求极大值(对它最有力的情况,得分最高的情况)。

        比较官方的说法极大极小值算法主要由两步组成:极大值搜索和极小值搜索,我们需要的是极大值中的最大值。首先,极大值搜索会尝试搜索一个目标函数的最大值,即极值点;其次,极小值搜索会尝试搜索一个目标函数的最小值,即极小值点。最后,算法将最大值和最小值结合起来,得到最优解 。

        我的理解:其实就是遍历所有的游戏结果,然后往上以极大极小值往上递归,直到我们获得最大的极大值。以井字棋为例子,不管是"我"先手还是对方先手,最终都是"我"要获胜,所以我是要求极大值,那么这个条件下我们再来分析一下。

        举个例子,如果是对方先手,那么我们下一步可以走的棋子就剩下八个,我们这一步就有八个选择可以走,每个选择下一次又会长生七个选择的棋路可以走(当然下一次是对手下棋),以此往下推,这样产生的情况数量其实是很多的。所以我们可以用电脑对各种情况进行推演,直到产生结果(平局,我/对方获胜)。

        三种结果对应不同的分数,为了方便区分,分数可以这样设置,平局的情况下,到谁下这一步棋返回给给它的分数是0,如果是"我"赢,则返回的分数是正数,如果是对手赢,则返回的结果是负数。当然结果判定的分数值不能只是一个固定值,而是要有多种奖励条件,满足这个条件应该增加相对应的分数,奖励机制越复杂,AI的获胜几率越大。

        当产生游戏结果的那一步棋子下后,要根据当时是"我"下(如果是"我"先手的情况下,对应全场棋子下的步数应该是奇数,反之则偶数)还是对手下(棋数与"我"相反)的棋子,分别挑选对应的分数。如果是"我"下的棋子,应该把这步棋子产生的分数与我保存最小值的变量进行对比,如果大于或者等于这个值,就要把这个值保存到这个变量里面去。如果是对手下的棋子,应该判断分数是否小于我保存最小值的变量,如果小于它,那应该把这个值保存到变量里面去。

        当我们获取到想要的某个最终的分数后,要把这个值往上用函数递归上去,即反馈给"对手"当它上一步下之前,然后对手根据传过来的多种结果产生的分数,再次根据我上一段说的那个挑选分数的办法,进行分数挑选。最终当我们递归到第一步棋子,也就是"我"实际应该下的棋子的时候,我们从每个结果里面挑选最大的值,然后输出出去,给机器人,机器人变明白我们要下的是哪一步棋子了。

PS:我上面这种写法,需要遍历全部的结果,这样简单的游戏确实可以靠计算机强大的算力去获得结果,但是一旦遇到那种计算量大的游戏,就算是计算机也不是能全部算完的。而为了解决这种情况,我们可以通过αβ剪枝的方法对某一些没必要的过程进行删减,这个我会在后面的五子棋例子中写出来,目前比较忙和懒,没时间写。

下面展示一下我的实际成果:

    图1 棋盘界面

     ps:4*4是因为我是模拟的一个拼多多的硬件棋盘压力模块写的,没必要花钱去买,自己做一个不香嘛,实际我们要用到的只有左上角的3*3的区域。

        图2点击开始按钮,进行人机对战,如果勾选人先手,就是人先下,反之则是机器人先下

ps:不管是我还是电脑每点击一个格子,都会通过串口发送棋盘的数据给你想要给的任何设备,现实中我们可以根据发送的这字节帧去控制设备运作。

        图3平手的结果,这个软件我应该测试很多遍,人不可能赢过我这个,人最多只能保持平手,不可能赢过软件。

图4一盘游戏结束后,点击棋盘清理,就可以清理棋盘,进行下一步的游戏

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值