人工智能五子棋实现原理

关于棋盘棋子的实现逻辑我就不多说了,大家可以看源码,并不复杂,说说AI部分的实现吧:

我的实现思路是:

当玩家走下一步棋的时候,AI要考虑两个因素:

1.走对自己获得胜利最有利的点(说白了就是最接近5子连线的点)

2.堵对对方获得胜利最有利的点(说白了就是堵对方的棋子)

做到这两步就能实现一个初级阶段的人工智能了。

那么接下来就讲讲关于计算获得胜利最有利的点是如何计算出来的:

其实原理也比较简单:

在棋盘上计算每个空白位置的点的4个方向(横向,纵向,左上角到右下角方向,右上角到左下角方向)每个有可能获胜的方向所连成的以当前棋子为出发点的长度为获胜棋子数量的(五子棋为5)中途没有被敌方棋子阻挡的所覆盖的己方棋子数。(是不是很绕,反正如果是我看到会被绕晕,没看懂不要紧,下面有栗子,对是栗子)得出每个方向上最大棋子数之后,然后取出每个棋子四个值里最大的值作为获胜权重(win_weight)。

以下图为例:

这是一个6x6的棋盘,现在我们来计算一下白子获胜的权重:

那么权重是如何计算的呢?举个栗子来说明吧:

首先定义这个棋盘坐标系x方向是向右的,y方向是向下的,左上角的位置是(0,0),(x,y)可以定义一个棋子的坐标。定义xy方向为左上角到右下角方向,yx方向为右上角到左下角方向。

(0,0)点的权重计算:首先判断这一点没有连成5子的可能性,权重为0。

(0,2)点的权重计算:首先判断这一点没有连成5子的可能性,权重为0。

(0,3)点的权重计算:首先判断这一点有连成5子的可能性,接下来x轴方向上经过当前位置可连成五子的棋子有0个,y轴方向上经过当前位置可连成五子的棋子有1个,xy方向不存在连成5子的可能性,yx方向上不存在连成5子的可能性,四个方向中,取最大值,结果为1,那么当前点的获胜权重为1。

以此类推,可以得出所有空白点的白字获胜权重。

那么我们下一步让AI直接走获胜权重最大的点是不是就可以了呢?

非也非也。我们不能只考虑自己获胜,也要考虑防止对手获胜。那么如何防止对手获胜呢?我的方式就是走对手获胜权重最高的位置就可以了,就素堵住对方的棋子(传说中的走别人的路,让别人无路可走)。

同样的方式,我们可以求得黑子的获胜权重(win_weight)分布:

可以看出在(0,0),(0,2),(0,4),(0,5)这几个点是黑子获胜概率最大的点。白子走在这些点就可以堵住黑棋。

好的我们得到了白子赢得胜利最有利的点,以及白子阻止黑子获得胜利最有利的点,那么问题来了:我们到底该如何选择具体走哪个点呢?

有个比较粗劣的实现方式,就是将这两个权重相加,相当于将这两个条件同等来对待,认为对白子获得胜利的影响重要性是相同的,然后取加起来权重最高的点。

但实际情况是这两个条件对获得胜利的影响是不等价的,我们要想办法来得到描述这两者之间关系的公式。这里的实现方式有:

  • 1.通过试探法(就是瞎猜)

尝试去将这两个参数相乘,取得的结果作为最终权重,来进行取值。

或者 白子的获胜权重 + R * 黑子的获胜权重, R是一个系数,我们需要通过不断的调整来接近最好的结果。

通过不断的尝试,来将最接近答案的公式猜出来。

  • 2.通过条件分情况来判断

比如下过五子棋的人都知道一个常识:当对手有三子相连,是一个很危险的情况,如果自己目前没有三子相连,那么你应该去堵住对方的连在一起的三子。那么就可以判断,当对手的win_weight >= 3 的时候,加入对手权重的判断,其余情况不考虑对手获胜权重。

  • 3.通过机器学习来让机器理解人类走棋的逻辑

构建机器学习算法,通过大量的训练数据来训练机器,从而让机器通过历史数据来算出下一步该怎么走

我认为第三种方式是最理想的实现,因为前面两种无法覆盖到所有的情况。不过目前我只是做了第一种的简单的实现,接下来会考虑逐渐完善机器学习算法。

好了,这就是我实现五子棋AI的一个大致思路,有很多人问我什么是机器学习,我觉得在这里可以用一个简单的比喻告诉大家:

人生会经历很多事情,当你年幼无知的时候,可能会由于涉世未深而犯很多次错误,当你渐渐长大了,成熟了,经历的事情多了起来,尤其是当你犯错的时候,有人对你指出这样做是错的,你犯错误的次数就会慢慢减少,这个过程就像是一个机器学习的过程。

机器积累训练数据之前,很容易出错,经过大量的训练数据训练之后,就会做的越来越好,这就是机器学习。

时间: 2025-01-10 14:53:39

人工智能五子棋实现原理的相关文章

个人学习积累

QQ 596957738 - 有问题可以联系我 可以使用 Ctrl + F 搜索 --更新于2018年03月29日 . │ 7z1604-x64加压工具-压缩工具.zip │ t.txt │ 禁止全文件夹分享.txt │ ├───0 Android │ │ 0 注意细节.docx │ │ About MODE_WORLD_READABLE .txt │ │ AutoScalingLayout-master 自动适配的布局.zip │ │ BadgeView 库.例子.rar │ │ event.

网上看到的很棒的东西

ACM进阶计划ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l计算机组成原理l人工智能l编译原理l算法设计与分析除此之外,我希望你们能掌握一些其它的知识,因为知识都是相互联系,触类旁通的.以下学习计划每学期中的内容不分先后顺序,虽说是为立志于学习ACM的同学列的知识清单,但内容不限于ACM的知识.英语之类与专业相距较远的课程请自行分配时间,这里不再列举.大一上

ACM进阶计划

转自 http://www.cnblogs.com/zxhl/p/4690748.html ACM进阶计划ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l计算机组成原理l人工智能l编译原理l算法设计与分析除此之外,我希望你们能掌握一些其它的知识,因为知识都是相互联系,触类旁通的.以下学习计划每学期中的内容不分先后顺序,虽说是为立志于学习ACM的同学列的知识清单

在贴吧上看到的

ACM进阶计划ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l计算机组成原理l人工智能l编译原理l算法设计与分析除此之外,我希望你们能掌握一些其它的知识,因为知识都是相互联系,触类旁通的.以下学习计划每学期中的内容不分先后顺序,虽说是为立志于学习ACM的同学列的知识清单,但内容不限于ACM的知识.英语之类与专业相距较远的课程请自行分配时间,这里不再列举.大一上

大学期间的任务

#include <bits/stdc++.h> 万能头文件= =就算包含了C标准库的所有头文件也没多大意义,实际编程的时候免不了要用到<unistd.h>/<pthread.h>等等.此外把那么多标识符引入全局空间也增加编译器负担,且增加不小心与标准库组件重名的可能 ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:l C/C++两种语言l 高等数学l 线性代数l 数据结构l 离散数学l 数据库原理l 操作系统原理l 计

[转]ACM进阶计划

ACM进阶计划  大学期间,ACM队队员必须要学好的课程有: lC/C++两种语言 l高等数学 l线性代数 l数据结构 l离散数学 l数据库原理 l操作系统原理 l计算机组成原理 l人工智能 l编译原理 l算法设计与分析 除此之外,我希望你们能掌握一些其它的知识,因为知识都是相互联系,触类旁通的. 以下学习计划每学期中的内容不分先后顺序,虽说是为立志于学习ACM的同学列的知识清单,但内容不限于ACM的知识.英语之类与专业相距较远的课程请自行分配时间,这里不再列举.  大一上学期: 必学: 2.简

【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?

怎么成为一个优秀的程序员,而不是一个优秀的码农? 9 条评论 分享 默认排序按时间排序 98 个回答 3844赞同反对,不会显示你的姓名 萧井陌 微信公众号:炼瓜研究所 技术社区 - 3844 人赞同 优秀的程序员会告诉你打根基的重要性,会劝你在厚积薄发前要隐忍. 优秀的码农会告诉你学啥底层.啥啥啥一拖就好了,学了python还要啥自行车啊,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?成为高手有很多种方法汇编是个屁啊? +++基础的分割线+++ 列举几个我认为比较重

ACM进阶

ACM队不是为了一场比赛而存在的,为的是队员的整体提高. 大学期间,ACM队队员必须要学好的课程有: l C/C++两种语言 l 高等数学 l 线性代数 l 数据结构 l 离散数学 l 数据库原理 l 操作系统原理 l 计算机组成原理 l 人工智能 l 编译原理 l 算法设计与分析 除此之外,我希望你们能掌握一些其它的知识,因为知识都是相互联系,触类旁通的. 以下学习计划每学期中的内容不分先后顺序,虽说是为立志于学习ACM的同学列的知识清单,但内容不限于ACM的知识.英语之类与专业相距较远的课程

编程进阶(转载)

ACM算法列表 ACM所有算法 数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列双端队列可并堆左偏堆 二叉查找树Treap伸展树 并查集集合计数问题二分图的识别 平衡二叉树 二叉排序树 线段树一维线段树二维线段树 树状数组一维树状数组N维树状数组 字典树 后缀数组,后缀树 块状链表 哈夫曼树 桶,跳跃表 Trie树(静态建树.动态建树) AC自动机 LCA和RMQ问题 KMP算法 图论 基本图算法图广度优先遍历深度优先遍历拓扑排序割边割点强连通分量Tarjan算法双连通分量强连通分支及其