ai五子棋算法优化-极大极小搜索-裁剪-空点判断,基础加权判断,全局与局部结合
作者:互联网
《算法设计与分析》
课 程 报 告
题 目 算法设计与分析
学 院 计算机学院
专 业 网络工程
学生姓名 李浩
学 号 201810420117 班级2018-1
指导教师 袁飞
2021 年 06月 1日
Ai五子棋算法设计与分析
专业:网络工程 学号:201810420117
学生:李浩 指导教师:袁飞
摘要:算法在计算机发展史上是最为重要的一环,一个程序,操作系统的好坏很大程度取决与采用的算法的优劣,本文主要介绍关于五子棋只智能人机的下棋策略部分。
关键词:算法设计与分析,五子棋,人机智能策略
一.关于五子棋的介绍
五子棋为一门简单的棋类运动,正规比赛规则还是很多的,是非常的复杂的(比如:白棋无禁手。黑棋禁手包括"三、三"(Double Three)(包括"四、三、三")、“四、四”(Double Four)(包括"四、四、三")、“长连”(Overline)。黑棋只能以"四、三"取胜。等等 ),本文只是简单分析下算法,对于规则进行了简化:双方交替按顺序落子,直到有一方的棋子已经连成五个,则游戏结束(可以横着、竖着、或者斜着)。
二.常用数据结构与说法
(1)简单ai算法介绍–局部最优(数据结构可以自行设置)
以1为黑棋,2为白棋,0为空位置排列组合所得到的棋型示例,
图一是以所选位置为中心判断的,
图二则是以所选位置为起点判断的,(方向为8个反向,例如竖着就两个方向)
我们可以把这些棋型分别用一个二维数组来保存,方便与所选位置可组成的棋型比较。(连5即是有四个字连在了一起,下后就是五个;活4就是两端无对手棋,对手下一手后还可以连成四字;眠4既是一边有对手棋,另一边可以下)至于用四个来表示是因为还有落子。
图 1
图 2
图三根据棋型打分(可自己设定分数)
图 3
每次下棋前扫描棋盘上所有可以下的位置,把它们保存起来,然后用循环得出每一个位置八个方向可组成的棋型,再根据评分标准给位置评分,将空位的8个分数相加得到这个位置的分数,再判断最高的评分(要考虑有多个最高分的情况)。因为是扫描的空位所以棋盘大的计算就会多,不过对于计算机就非常非常的轻松50的棋盘大概也就10000次计算,大概1秒。
对于对手的判断就不同并且置为负数,对手的盘面越有利负数就越小。Ai的任务就是尽量让自己的分数与对手的相加后高,若为正就说明ai占优势就走权值最高点,若为负就走对手权值最低的点阻止对面扩大优势。
对于胜利的判断很简单对于每一个已经下了棋子进行扫描,对一个棋子的8个方向依次遍历,看是否有五个字的情况有就胜利,没有就另一方落子。
这种可以不断的与ai下棋来调整对于棋型的评分情况找出一种最合理的分数,就是所谓的训练,也即是调整权值。
(2)常见博弈树算法介绍(极大极小算法)–全局最优(需要大量的计算)
五子棋看起来有各种各样的走法,而实际上把每一步的走法展开,就是一颗巨大的博弈树。在这个树中,从根节点为0开始,奇数层表示电脑可能的走法,偶数层表示玩家可能的走法。
假设电脑先手,那么第一层就是电脑的所有可能的走法,第二层就是玩家的所有可能走法,以此类推。
我们假设平均每一步有50种可能的走法,那么从根节点开始,往下面每一层的节点数量是上一层的 50倍,假设我们进行4层思考(计算量已经非常大了),也就是电脑和玩家各走两步,那么这颗博弈树的最后一层的节点数为 50^4 = 625W 个,大概600多秒。(把每一步接下来的所有步数都考虑进去了,所以计算量是前面那一种的几百倍)
有了对博弈树的基本认识,我们就可以用递归来遍历这一棵树。
那么我们如何才能知道哪一个分支的走法是最优的,我们就需要一个评估函数能对当前整个局势作出评估,返回一个分数。我们规定对电脑越有利,分数越大,对玩家越有利,分数越小,分数的起点是0。
用递归遍历的时候就知道怎么选择了:
①电脑走棋的层我们称为 MAX层,这一层电脑要保证自己利益最大化,那么就需要选分最高的节点。
②玩家走棋的层我们称为MIN层,这一层玩家要保证自己的利益最大化,那么就会选分最低的节点。
这也就是极大极小值搜索算法的名称由来。直接盗一个图说明这个问题:
图 4
此图中甲是电脑,乙是玩家,那么在甲层的时候,总是选其中值最大的节点,乙层的时候,总是选其中最小的节点。
而每一个节点的分数,都是由子节点决定的,因此我们对博弈树只能进行深度优先搜索而无法进行广度优先搜索。深度优先搜索用递归非常容易实现,然后主要工作其实是完成一个评估函数,这个函数需要对当前局势给出一个比较准确的评分。(比如对于最底层就同(1)一样求出每个空的权值和找到最大的点,上一层就找出权值和最小的点可以设置成负数,依次寻找,找到和最大的那个点落子,这样落子就是全局最优的点,然而对手肯定会走他分数最高的点,于是再次执行递归算法重新计算,因为是对于空位进行打分,所以越下到后面越快)
而重点就是评估函数,就是(1)中图3的打分表,都是一样的,可以根据自己的思考给予分值。
(3)对于(2)中的极大极小算法的改进
二中的计算量是极为大的,可能下一步棋要十几秒或者几十秒,是不能接受的。所以要对其进行改进。
①对于以一个空白点为中心的周围5步范围内没有其他棋则不进行函数评估,并且不纳入博弈树。在进行博弈树构建之前,先进行一次赛选过滤掉很多很多的点,将会大大减少计算量,比如对于5050的棋盘,运算量将会减少很多倍。并且这个判断并不会进行太大量的计算
②对于上述的的优化还可以进行略微改进,比如在下了一半棋盘之后就不进行①的判断,因为①中的是将周围5步内没有棋子的点剃去范围就有1111,下到一半就可能没有几个这样的点了,就可以不进行判断计算了,当然这个具体是多少手棋之后再暂停的运算要进行大量训练找出效率最优的,同理对于具体是周围几格范围内没有棋子可以自行规定,或则通过大量训练找出最优的范围。
(4)对于前面的再优化–裁枝法
有些棋型的出现是可以直接判断胜负的,不需要再往下搜索。
如果落一子:
①可以成五,则必胜;
②可以成活四,双冲四,冲四活三(自行百度)这样的的绝杀棋,且对手不能一步成五,则必胜;
③可以成双活三,且对手不能一步成五,也不能一步成绝杀棋,则必胜。
多以对于以上的几种情况可以不再将其加入博弈树避免以其为节点的更深的搜索,进行裁剪,虽然避免了更深的搜索但是却是却对于ai的每一层都增加了判断,不过相对来说收益是好的。
(5)对于(4)中还可以进行优化
因为绝杀棋基本至少是ai第五手才会出现,所以对于前面几手就不进行判断,前面几手的判断的量很大的。
(6)同时可以将局部最优和全局最优结合起来
在前面几手实际经过训练或者推算可知极大极小法和局部最优的算法落子基本一致,所以在前面几手可以采用一中的局部最优法求得落子位置,在几手之后再进行极大极小搜索法,究竟是几手可以通过大量训练找到一个合理的值。
三.总结
在对于前面的几种情况都是进行加入后,算法相对于前面的实际的已经优化了很多很多了。但是过于复杂,代码实现花费的时间较多就不进行实现了。落子时间也将会达到一个可以接受的水平。以上就是我的ai五子棋算法分析优化,基础部分由于网上较多,是对于网上的借鉴修改。
标签:分数,落子,对于,ai,五子棋,算法,空点,节点 来源: https://blog.csdn.net/qq_43699118/article/details/117387229