基于“博弈树”的AI五子棋

Ines ·
更新时间:2024-11-15
· 643 次阅读

python讨论qq群:996113038

代码及相关资源获取:

后台回复:五子棋,获取源代码

开发工具:

python3.6.4。

需要安装的库:graphics,time。

可以联系群主安装

效果演示:

基本原理

我们用到了博弈论的算法,下面我简单介绍一下博弈树:

博弈树类似于状态图和问题求解搜索中使用的搜索树。在AI五子棋中,博弈树的节点对应于某一个器具,其分支表示走一步棋。根部对应于开始位置。其叶节点表示对弈到此处结束。竞赛的结果可以是赢,输,平。下面就是一棵典型的博弈树:

如果按照暴力算法,将一局五子棋的所有可能性全部列举出来,理论上讲肯定是可以赢的。但是这样会耗费巨量的计算力。所以枚举法是不可行的。剪枝就是减去一些完全没有意义的走法。大大降低计算量。

部分代码

我们需要设定一个目标函数,计算未来几步怎么走能够使这个目标函数最大化。这样我们就需要对每一种走法的“分”做一个评估,这里的“分”代表的是这个走法产生的棋局优势。

首先我们要写函数评估局势,下面是一个例子:这是判断四个方向里,活四局势的个数。

#该点四个方向里(即v不区分正负),活四局势的个数
def liveFour(x,y):
    key=num[x][y]; s=0
    for u in range(4):
        samekey=1
        samekey,i=numofSamekey(x,y,u,1,key,samekey)
        if(not downOk(x+dx[u]*i,y+dy[u]*i)):
            continue
        samekey,i=numofSamekey(x,y,u,-1,key,samekey)
        if(not downOk(x+dx[u]*i,y+dy[u]*i)):
            continue
        if(samekey==4):
            s=s+1
    return s

我们还要写出:冲四局势个数,四个方向里活三,以及八个方向里断三的个数,该点在四个方向里,是否有六子或以上连线,统计在u方向上,和key值相同的点的个数,即和key同色的连子个数。

估价函数基本规则如下:

我们不断让机器的分数越来越高就行了。

参考资料:

论文:《基于博弈树的五子棋算法研究》---罗景,叶俊民,赵良等

参考来源:https://github.com/hfq0219/wuziqi

扫描下方二维码,关注公众号


作者:剑心211



博弈

需要 登录 后方可回复, 如果你还没有账号请 注册新账号