五子棋AI算法的改进方法课件
- 格式:doc
- 大小:200.50 KB
- 文档页数:12
【一分钟围棋】看看AI对老定式的修正,可以更好地理解棋理例一例一:老定式。
AI变招一AI变招一:白4刺,黑5粘,白6再飞,黑7再尖三三显然呆重,白8高拆棋形舒展。
AI变招二AI变招二:黑5尖三三,白棋可以根据情况回拆A、B或者C位。
以后有机会可以D位逼住冲断。
例二例二:老定式。
AI修正一AI的修正:白棋不做A位的二路扳粘,避免强化黑棋外势,是这一修正的关键点。
AI变招一AI变招一:黑5飞,依照白棋的走法再定下一步的应对,白6、8是一种方法。
白8直接托,成为流行的'芈氏飞刀'的可能行很大(原先的文章有介绍,不再赘述)。
AI变招二AI变招二:黑9扳,白棋重视边空的下法。
以后角上的补棋或者打吃等手段,都是官子了。
AI变招三AI变招三:黑11断,至白16长出,也很有趣,黑到底拔掉白8一子还是连回黑9一子,有些纠结。
AI变招四AI变招四:白14提子,白16点刺,黑17以后就要看双方的战斗力了。
例三例三:当年流行的小飞定式,几乎已经淘汰。
主要原因是AI认为白4这手棋不紧凑,黑5即使脱先,对黑棋也无严厉的攻击手段。
AI修正版本AI修正版本:白4、6连扳。
现在这种走法成为定式。
例四例四:当年的流行定式。
AI认为A、B位的骚扰对黑棋外势影响很大。
AI的修正版本AI的修正版本:黑11爬过。
例五例五:过去的基本定式。
AI认为白4黑5都不是好棋。
AI修正版本AI修正版本:白4飞压,黑5冲断作战是正道。
AI修正版本二AI修正版本二:白4尖,黑5也要大飞,白6飞进角,黑7就满意。
例六例六:定式没有黑15与白16的交换。
AI认为白8托过不好,让黑棋获取了外势,黑15不必保留,走完脱先即可,黑好。
AI修正版本AI修正版本:白8至14强硬压出。
例七例七:老定式。
AI黑11与白12太保守,应该再奔放一些。
AI的修正版本一AI的修正版本一:黑11、白12提高效率,黑13再压。
AI的修正版本二AI的修正版本二:黑11补,白12至20的走法双方都可下。
又是本人一份人工智能作业……首先道歉,从Word贴到Livewrter,好多格式没了,也没做代码高亮……大家凑活着看……想做个好的人机对弈的五子棋,可以说需要考虑的问题还是很多的,我们将制作拥有强大AI五子棋的过程分为十四步,让我来步步介绍。
第一步,了解禁手规则做一个五子棋的程序,自然对五子棋需要有足够的了解,现在默认大家现在和我研究五子棋之前了解是一样多的。
以这个为基础,介绍多数人不大熟悉的方面。
五子棋的规则实际上有两种:有禁手和无禁手。
由于无禁手的规则比较简单,因此被更多人所接受。
其实,对于专业下五子棋的人来说,有禁手才是规则。
所以,这里先对“有禁手”进行一下简单介绍:五子棋中“先手必胜”已经得到了论证,类似“花月定式”和“浦月定式”,很多先手必胜下法虽然需要大量的记忆,但高手确能做到必胜。
所以五子棋的规则进行了优化,得到了“有禁手”五子棋。
五子棋中,黑棋必然先行。
因此“有禁手”五子棋竞技中对黑棋有以下“禁手”限制:“三三禁”:黑棋下子位置同时形成两个以上的三;“四四禁”:黑棋下子位置同时形成两个以上的四;“长连禁”:六子以上的黑棋连成一线。
黑棋如下出“禁手“则马上输掉棋局。
不过如果“连五”与“禁手”同时出现这时“禁手”是无效的。
所以对于黑棋只有冲四活三(后面会有解释)是无解局面。
反观白棋则多了一种获胜方式,那就是逼迫黑棋必定要下在禁点。
为了迎合所有玩家,五子棋自然需要做出两个版本,或者是可以进行禁手上的控制。
第二步,实现游戏界面这里,我制作了一个简单的界面,但是,对于人机对弈来说,绝对够用。
和很多网上的精美界面相比,我的界面也许略显粗糙,但,开发速度较高,仅用了不到半天时间。
下面我们简单看下界面的做法。
界面我采用了WPF,表现层和逻辑层完全分开,前台基本可以通过拖拽完成布局,这里就不做过多介绍。
根据界面截图简单介绍1处实际上市两个渐变Label的拼接,2、3是两个label,4、5实际上是两个Button,但是没有做事件响应。
人工智能课程设计-------- 五子棋一.序言 (3)1.1 五子棋简介 (3)1.2 五子棋的AI 构想 (3)二. 开发工具可行性解析 (5)三.需求解析 (6)四.程序设计 (6)4.1 程序设计特点 (6)4.2. 程序整体设计 (7)五.代码解析 (8)初始化赋值系统 (8)5.2 初始化获胜组合 (9)5.3 重新设定玩家的获胜标志 (9)5.4 办理鼠标事件 (10)获胜检查算法 (12)5.6 电脑算法 (1) (14)5.7 电脑算法( 2) (17)六.心得领悟 (20)七.参照文件 (20)一.序言人工智能也就是所谓的AI(Artificial Intelligence) ,它是一门很抽象的技术,AI 程序的编写不需要依照任何既定的思虑模式也许规则。
特别是游戏中的AI 可以完满依程序设计者自己的思虑逻辑制作。
我个人认为人工智能的核心应该是使计算机拥有自动的办理事件的能力,而我们的所有的研究也应该围绕着这一方向。
我们今天谈论的是策略类的人工智能。
策略类人工智能能够说是AI 中比较复杂的一种,最常有的策略类AI 游戏就是棋盘式游戏。
在这类游戏中,平时的策略类AI 程序都是使计算机判断当前情况下所有可走的棋与可能的获胜情况,并计算当前计算机可走棋步的获胜分数也许玩家可走棋步的获胜分数,尔后再决定出一个最正确走法。
下面我们先介绍一下五子棋的 AI 构想。
1.1 五子棋简介下面就五子棋的背景和规则做一些简单的介绍。
五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为“连珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row 的缩写 ) ,亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称号。
五子棋不但能加强思想能力,提高智力,而且富含真谛,有助于修身养性。
五子棋既有现代休闲的显然特点“短、平、快”,又有古典哲学的高明学问“阴阳易理”;它既有简单易学的特点,为人民公众所喜闻乐道,又有高妙的技巧和高水平的国际性比赛;它的棋文化源渊流长,拥有东方的奇特和西方的直观;既有“场”的看法,亦有“点”的连接。
又是本人一份人工智能作⋯⋯首先道歉,从Word到Livewrter,好多格式没了,也没做代高亮⋯⋯大家凑活着看⋯⋯想做个好的人机弈的五子棋,可以需要考的是很多的,我将制作有大AI 五子棋的程分十四步,我来步步介。
第一步,了解禁手做一个五子棋的程序,自然五子棋需要有足的了解,在默大家在和我研究五子棋之前了解是一多的。
以个基,介多数人不大熟悉的方面。
五子棋的上有两种:有禁手和无禁手。
由于无禁手的比,因此被更多人所接受。
其,于下五子棋的人来,有禁手才是。
所以,里先“有禁手” 行一下介:五子棋中“先手必”已得到了,似“花月定式”和“浦月定式”,很多先手必下法然需要大量的,但高手确能做到必。
所以五子棋的行了化,得到了“有禁手”五子棋。
五子棋中,黑棋必然先行。
因此“有禁手”五子棋技中黑棋有以下“禁手”限制:“三三禁”:黑棋下子位置同形成两个以上的三;“四四禁”:黑棋下子位置同形成两个以上的四;“ 禁”:六子以上的黑棋成一。
黑棋如下出“禁手“ 上掉棋局。
不如果“ 五”与“禁手”同出“禁手”是无效的。
所以于黑棋只有冲四活三(后面会有解)是无解局面。
反白棋多了一种方式,那就是逼迫黑棋必定要下在禁点。
了迎合所有玩家,五子棋自然需要做出两个版本,或者是可以行禁手上的控制。
第二步,游界面里,我制作了一个的界面,但是,于人机弈来,用。
和很多网上的精美界面相比,我的界面也略粗糙,但,开速度高,用了不到半天。
下面我看下界面的做法。
界面我采用了 WPF ,表和完全分开,前台基本可以通拖拽完成布局,里就不做多介。
根据界面截介1 处实际上市两个渐变Label 但是没有做事件响应。
通过按钮属性。
也许有人会奇怪,为什么的拼接,2 、3 是两个 label ,4 、 56 、7 、8 、9的控制,修改labelButton 会丝毫看出不出有Button实际上是两个Button,和 Button的Content的影子,这里战友whrxiao 写过一个Style 如下<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type Button}"><Grid><ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/></Grid></ControlTemplate></Setter.Value></Setter></Style>这里我们把这个Style称为Style1。
《人工智能导论》课程报告课题名称:五子棋姓名: X X 学号:114304xxxx课题负责人名(学号): X X114304xxxx同组成员名单(学号、角色):x x1143041325XXX1143041036指导教师:张建州评阅成绩:评阅意见:提交报告时间:2014年 1 月 9 日五子棋计算机科学与技术专业学生XXX 指导老师张建州[摘要]人类之所以不断在进步,是因为我们人类一直不断的在思考,五子棋游戏程序的开发符合人类进步也是促进人类进步的一大动力之一。
五子棋游戏程序让人们方便快捷的可以下五子棋,让人们在何时都能通过下棋来提高逻辑思维能力,同时也培养儿童的兴趣以及爱好,让孩子更加聪明。
同时,五子棋游戏程序的开发也使得五子棋这个游戏得到了广泛的推广,让世界各地的人们知道五子棋,玩上五子棋,这已经不是局限。
五子棋游戏程序使得越来越多的人喜欢上了五子棋,热爱下五子棋,它是具有很好的带动性的。
关键词:五子棋进步思考目录《人工智能导论》课程报告 01 引言 (3)1.1五子棋简介 (3)1.2 五子棋游戏的发展与现状 (3)2 研究问题描述 (4)2.1 问题定义 (4)2.2 可行性研究 (4)2.3 需求分析 (5)2.4 总体设计 (5)2.5 详细设计 (6)2.6编码和单元测试 (6)3 人工智能技术 (6)4 算法设计 (7)4.1α-β剪枝算法 (7)4.2极大极小树 (7)4.3深度优先搜索(DFS) (8)4.4静态估值函数 (9)5 软件设计和实现 (9)5.1 数据结构定义 (9)5.2 程序流程图 (17)6 性能测试 (18)6.1 程序执行结果 (18)7 总结 (21)参考文献 (21)1 引言1.1五子棋简介五子棋是一种两人对弈的纯策略型汉族棋类益智游戏,棋具与围棋通用,由中国汉族人发明,起源于中国上古时代的传统黑白棋种之一。
主要流行于华人和汉字文化圈的国家以及欧美一些地区。
五子棋人工智能算法设计与实现五子棋是一种流行的策略游戏,玩家需要在一个15×15的棋盘上相互交替放置黑色和白色的棋子。
游戏的规则简单,但在实际游戏中,需要考虑到许多因素,例如棋盘的当前状态、对手的反应以及自己的策略,这使得五子棋成为一个很有挑战性的游戏。
在设计和实现一个五子棋算法时,需要考虑以下步骤:游戏状态表示:算法首先需要一个方法来表示当前的游戏状态。
这可以通过一个函数来完成,该函数接受当前棋盘上的所有棋子作为输入,并返回一个字符串或字节串表示当前游戏状态。
搜索算法:搜索算法是人工智能算法的核心,它需要找到一个好的落子位置。
常见的搜索算法有暴力搜索、极小化极大搜索(MinMax)算法以及A*搜索算法等。
在五子棋中,可以使用极小化极大搜索算法来找到一个好的落子位置。
评估函数:评估函数用于评估棋盘的当前状态以及每个可能落子的得分。
在五子棋中,评估函数需要考虑当前棋盘上的连珠、对手的威胁以及自己可能形成的威胁等因素。
剪枝:在极小化极大搜索算法中,可以使用剪枝来减少搜索的深度和广度。
通过剪枝,可以排除一些明显不好的落子位置,从而提高搜索效率。
玩家和电脑的落子:在实现算法时,需要编写一个函数来处理玩家和电脑的落子。
这个函数应该接受当前游戏状态和玩家选择的落子位置作为输入,然后更新棋盘状态并返回下一步棋盘状态和落子信息。
游戏结束条件:算法还需要检测游戏是否已经结束。
在五子棋中,当一方获胜时,游戏结束。
public class Gomoku {private static final int SIZE = 15;private int board = new int[SIZE][SIZE];private int heuristic = new int[SIZE][SIZE];public void init() {for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {board[i][j] = 0;public int get(int x, int y) {return board[x][y];public void set(int x, int y, int player) {board[x][y] = player;}随着技术的飞速发展,高性能计算在各个领域的应用越来越广泛。
五子棋人工智能算法实现研究作者:段晓丽来源:《散文百家·下旬刊》2014年第07期摘要:人工智能是一门正在迅速发展的新兴综合学科,博弈是其主要研究领域之一。
五子棋游戏,其规则简单,但变化多端,适宜于研究分析人机博弈算法。
本文设计实现了五子棋人工智能功能,主要采用Alpha-Beta剪枝和MinMax算法,優化博弈树搜索过程,通过控制搜索深度,实现初级和高级的人机对弈。
本文还提出了优化五子棋智能算法的思路,并做出了初步探讨。
关键词:人工智能;五子棋;Alpha-Beta搜索五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为“连珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”等多种称谓[1]。
因其规则简单,变化多端,容易上手,而广受大众喜爱。
五子棋游戏不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋游戏规则比较简单,棋盘通常采用类似围棋盘的15路或19路的棋盘,两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子,无子的交叉点又被称为空点或合法点,当黑白一方有五个棋子在横、竖或斜方向上连接成一线即为该方赢。
人工智能(Artificial Intelligence,AI),是计算机科学的一个分支,是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的综合性的技术科学。
该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等,而博弈是人工智能研究的一个重要分支。
它不仅存在于游戏、下棋之中,也存在于政治、经济、军事和生物竞争中。
与其他棋类游戏相比,五子棋游戏每一层棋局搜索节点数量庞大,规则简单,更便于深入研究博弈算法。
本文以五子棋游戏为研究对象,采用Alpha-Beta剪枝和最大最小树原理,优化了博弈树搜索过程,通过控制搜索深度,实现了初级和高级的人机对弈。
人工智能作业制作拥有强大AI五子棋的过程分为十四步,让我来步步介绍。
第一步,了解禁手规则做一个五子棋的程序,自然对五子棋需要有足够的了解,现在默认大家现在和我研究五子棋之前了解是一样多的。
以这个为基础,介绍多数人不大熟悉的方面。
五子棋的规则实际上有两种:有禁手和无禁手。
由于无禁手的规则比较简单,因此被更多人所接受。
其实,对于专业下五子棋的人来说,有禁手才是规则。
所以,这里先对“有禁手”进行一下简单介绍:五子棋中“先手必胜”已经得到了论证,类似“花月定式”和“浦月定式”,很多先手必胜下法虽然需要大量的记忆,但高手确能做到必胜。
所以五子棋的规则进行了优化,得到了“有禁手”五子棋。
五子棋中,黑棋必然先行。
因此“有禁手”五子棋竞技中对黑棋有以下“禁手”限制:“三三禁”:黑棋下子位置同时形成两个以上的三;“四四禁”:黑棋下子位置同时形成两个以上的四;“长连禁”:六子以上的黑棋连成一线。
黑棋如下出“禁手“则马上输掉棋局。
不过如果“连五”与“禁手”同时出现这时“禁手”是无效的。
所以对于黑棋只有冲四活三(后面会有解释)是无解局面。
反观白棋则多了一种获胜方式,那就是逼迫黑棋必定要下在禁点。
为了迎合所有玩家,五子棋自然需要做出两个版本,或者是可以进行禁手上的控制。
第二步,实现游戏界面这里,我制作了一个简单的界面,但是,对于人机对弈来说,绝对够用。
和很多网上的精美界面相比,我的界面也许略显粗糙,但,开发速度较高,仅用了不到半天时间。
下面我们简单看下界面的做法。
界面我采用了WPF,表现层和逻辑层完全分开,前台基本可以通过拖拽完成布局,这里就不做过多介绍。
根据界面截图简单介绍1处实际上市两个渐变Label的拼接,2、3是两个label,4、5实际上是两个Button,但是没有做事件响应。
通过按钮6、7、8、9 的控制,修改label和Button的Content 属性。
也许有人会奇怪,为什么Button会丝毫看出不出有Button的影子,这里战友whrxiao写过一个Style如下<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type Button}"><Grid><ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/></Grid></ControlTemplate></Setter.Value></Setter></Style>这里我们把这个Style称为Style1。
总的来说,要让电脑知道该在哪一点下子,就要根据盘面的形势,为每一可能落子的点计算其重要程度,也就是当这子落下后会形成什么棋型(如:“冲四”、“活三”等),然后通览全盘选出最重要的一点,这便是最基本的算法。
当然,仅靠当前盘面进行判定是远远不够的,这样下棋很轻易掉进玩家设下的陷阱,因为它没有考虑以后的变化。
所以在此基础上我们加入递归调用,即:在电脑中猜测出今后几步的各种走法,以便作出最佳选择,这也是我们下棋时常说的“想了几步”。
如此一来您的程序便具有一定的水平了。
什么?不信!过来试试吧!总体思路弄清之后,下面进行具体讨论:一:数据结构先来看看数据结构,我们需要哪些变量?首先得为整个棋盘建立一张表格用以记录棋子信息,我们使用一个15*15的二维数组Table[15][15] (15*15是五子棋棋盘的大小),数组的每一个元素对应棋盘上的一个交叉点,用…0‟表示空位、…1‟代表己方的子、…2‟代表对方的子;这张表也是今后分析的基础。
在此之后还要为电脑和玩家双方各建立一张棋型表Computer[15][15][4]和Player[15][15][4],用来存放棋型数据,就是刚才所说的重要程度,比如用…20‟代表“冲四”的点,用…15‟代表“活三”的点,那么在计算重要性时,就可以根据20>15得出前者比后者重要,下子时电脑便会自动选择“冲四”的点。
那为什么棋型表要使用三维数组呢?因为棋盘上的每一个点都可以与横、竖、左斜、右斜四个方向的棋子构成不同的棋型,所以一个点总共有4个记录;这样做的另一个好处是可以轻易判定出复合棋型,例如:假如同一点上有2个…15‟就是双三、有一个…15‟和一个…20‟就是四三。
怎么样!3个数组构成了程序的基本数据骨架,今后只要再加入一些辅助变量便可以应付自如了。
应该不会太难吧?OK!有了这么多有用的数据,我们就可以深入到程序的流程中去了。
二:程序流程我们主要讨论五子棋的核心算法,即:人工智能部分,而其他像图形显示、键盘鼠标控制等,因较为简单,所以就不作过多介绍了。
又是本人一份人工智能作业……首先道歉,从Word贴到Livewrter,好多格式没了,也没做代码高亮……大家凑活着看……想做个好的人机对弈的五子棋,可以说需要考虑的问题还是很多的,我们将制作拥有强大AI五子棋的过程分为十四步,让我来步步介绍。
第一步,了解禁手规则做一个五子棋的程序,自然对五子棋需要有足够的了解,现在默认大家现在和我研究五子棋之前了解是一样多的。
以这个为基础,介绍多数人不大熟悉的方面。
五子棋的规则实际上有两种:有禁手和无禁手。
由于无禁手的规则比较简单,因此被更多人所接受。
其实,对于专业下五子棋的人来说,有禁手才是规则。
所以,这里先对“有禁手”进行一下简单介绍:五子棋中“先手必胜”已经得到了论证,类似“花月定式”和“浦月定式”,很多先手必胜下法虽然需要大量的记忆,但高手确能做到必胜。
所以五子棋的规则进行了优化,得到了“有禁手”五子棋。
五子棋中,黑棋必然先行。
因此“有禁手”五子棋竞技中对黑棋有以下“禁手”限制:“三三禁”:黑棋下子位置同时形成两个以上的三;“四四禁”:黑棋下子位置同时形成两个以上的四;“长连禁”:六子以上的黑棋连成一线。
黑棋如下出“禁手“则马上输掉棋局。
不过如果“连五”与“禁手”同时出现这时“禁手”是无效的。
所以对于黑棋只有冲四活三(后面会有解释)是无解局面。
反观白棋则多了一种获胜方式,那就是逼迫黑棋必定要下在禁点。
为了迎合所有玩家,五子棋自然需要做出两个版本,或者是可以进行禁手上的控制。
第二步,实现游戏界面这里,我制作了一个简单的界面,但是,对于人机对弈来说,绝对够用。
和很多网上的精美界面相比,我的界面也许略显粗糙,但,开发速度较高,仅用了不到半天时间。
下面我们简单看下界面的做法。
界面我采用了WPF,表现层和逻辑层完全分开,前台基本可以通过拖拽完成布局,这里就不做过多介绍。
根据界面截图简单介绍1处实际上市两个渐变Label的拼接,2、3是两个label,4、5实际上是两个Button,但是没有做事件响应。
通过按钮6、7、8、9 的控制,修改label和Button的Content 属性。
也许有人会奇怪,为什么Button会丝毫看出不出有Button的影子,这里战友whrxiao写过一个Style如下<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type Button}"><Grid><ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/></Grid></ControlTemplate></Setter.Value></Setter></Style>这里我们把这个Style称为Style1。
界面逻辑上,将是否开始、是否禁手和是否电脑先行作为两个全局变量的布尔型值,通过设置和判断bool型值进行逻辑上的控制。
中间的棋盘是个canvas,一个15*15的Grid放满Button并将每个Button应用Style1开始时候透明度设为0,也就是根本看不到,在下棋的时候改变Button的背景和透明度,实现落子的效果,因为Grid的位置关系,所以可看起来好像是下在横竖的交线处。
第三步,进行输赢判断:因为规则不同,“无禁手”和“有禁手”的输赢判断自然不同。
先看无禁手:这个比较简单,遍历每个位置,然后从这个位置开始,分别判断它的四个方向:即横、竖、左上到右下、左下到右上。
每个方向从中间点开始,往两边数连子数,然后将两个方向的连字数加和再加一(中间的棋子)。
如果得到大于等于5,那么就说明下子方赢棋。
对于有禁手的五子棋,输赢判断还需要判断禁手,禁手的判定较为复杂。
将待判断点放入黑棋子。
然后搜索待判断点周边棋盘;还原棋盘;利用搜索结果依次对各方向进行分析,判断黑棋放入后所产生的棋型是否形成长连或形成某种四连或三连的的棋型。
若形成长连,判定为禁手,返回长连禁手标识。
若形成某种四连或三连的棋型,该棋型统计数加1,再对下一个方向进行判断,直到各个方向分析结束。
若四连棋型或三连棋型的统计数大于1,则返回为禁手。
其余情况返回非禁手。
第四步:构造棋型估分“有禁手”规则比较复杂,涉及到比较多下棋方面的技巧,而且对算法的思路没有丝毫影响,所以下面我们主要考虑无禁手规则下的AI设计。
若设计好无禁手AI,只需要让AI执黑时坚决不下到禁手点,就可以很快构造有禁手的AI。
虽然这种方式没有利用有禁手规则下的技巧,但这些技巧只需要修改下面所讲到的估分函数即可。
我们可以将五子棋的连珠可以分为以下几种:成5:即构成五子连珠活4:即构成两边均不被拦截的四子连珠。
死4:一边被拦截的四子连珠活3:两边均不被拦截的三字连珠死3:一边被拦截的三字连珠活2:两边均不被拦截的二子连珠死2:一边被拦截的二子连珠单子:四周无相连棋子根据五子棋的技巧,可以将五子棋的棋型用连珠进行分类,分类过后我们按照威力给每种棋型打分。
因为五子棋一次只落一子,因此很容易理解,双活三和三活三的威力是一样的,类似情况不多做解释。
程序中,我以100分为满分,对棋型进行了以下打分:成5, 100分活4、双死4、死4活3,90分双活3,80分死3活3,70分死4,60分活3,50分双活2,40分死3,30分活2,20分死2,10分单子0分有了估分方法,就有了五子棋AI的基础,接下来就是一些博弈的方法了。
第五步:得到位置估分AI单纯应用棋谱以及对五子棋当前局势的分析,对每步进行估分,程序中做如下工作:将每个位置进行分析,假设AI落子在该位置,用以上打分规则为AI打分,并将得到的分数加一。
然后,假设玩家落子在该点,为玩家打分,然后将所有的分值汇总。
取最高分作为这个位置的估分,接下来就是取分数最高的位置下棋了。
“位置估分”,下棋的时候,既可以考虑到自己攻击对手,又能考虑到对对手的防御,可以说,很多时候可以顶上考虑两步的AI。
作实验,从网上下载了一个用博弈做的AI,和“位置估分”对下,结果是一胜一负。
谁先子,谁赢得胜利。
而且一步估分毫无疑问是最快的,即使遍历所有位置,也能很快的做出决策。
第六步:应用博弈树,提高AI智能做五子棋的博弈,自然会用到博弈树,这里我说下自己的思路。
在对弈中,根据下一步由谁来走,AI对任何一个局面根据前面估分方法给出一个分数,我们把这个估分方法汇总成一个评估函数,并返回分值。
据此来选择下一步的走法。
由于人和AI是轮流落子,可以将人的估分也算入,并将前面加负号。
那么,估值越大表明对AI越有利,估分越小则表明对AI 越不利。
那么每次AI选择都是从它可能的走法树的某层节点,返回评估值中最大点。
而用户总是从走法树的某层节点中选择最小点,从而形成一棵极大极小搜索树,然后根据深度优先搜索,可以最后得到固定搜索深度下的一个最好的走法。
我做了下试验,单纯应用博弈树,可以在100ms之内让AI考虑完整的两步,由于组合爆炸,当需要考虑三步的时候,就需要6s左右,4步就需要1分钟。
拿两步来和一步估分作比较,虽然比较慢,但是确实有了一定智能。
第七步:考虑层数,提高AI智能上面的设计对于返回值是统一处理的,但是,层数是个很重要的信息.因为下棋时如果能2步获胜,不应选择4步获胜。
对于输的棋型层数就更重要,AI必须尽可能拖延输的时间,就有更大的可能让AI化险为夷。
这样,可以通过设置一个dep值。
深度约浅,dep越大,用dep和得到的得分相乘,得到搜索节点的得分,再进行以上算法,进一步提高AI的智能。
第八步:应用α-β剪枝,提高AI速度在搜索博弈树的过程中,实际上搜索有很多点是多余的,例如下图图中,方形框节点是该AI走,圆形框节点是该人走.比如C节点,它需要从E和F当中选取最大的值。
目前已经得出E为2,当搜索F节点时,因为F是人走的节点,那么F需要从K L M中选取最小的,因为K已经是1,也就是说F<=1,那么L,M就不需要搜索,因此就发生了α剪枝。
然后看A节点,该人走了,需要从C和D中选取最小值,因为C节点是2,而G是7,那么D至少是7。
因此,D的其他节点不必再考虑,就发生如上图所示的β剪枝。
总结上面规律,我们可以得到剪枝方法如下:当前为AI下棋节点:α剪枝:如果当前节点的值不比父节点的前兄弟节点的大值大,则舍弃此节点。
β剪枝:如果当前节点子节点的值不比当前节点的前兄弟节点中的最小值小,则舍弃该子节点和该子节点的所有后兄弟节点。
当前为用户下棋节点:α剪枝:如果当前节点的某子节点的值不比当前节点的前兄弟节点中的最大值大,则舍弃该子节点和该子节点的所有后兄弟节点。
β剪枝:如果当前节点的子节点的值不比当前的父节点的前兄弟节点中的最小值小则舍弃此节点。
经过α-β剪枝,可以极大的减少搜索的数量,很多时候,能把几十亿的搜索数量,缩小到几亿,那么,就可以把搜索深度增1。
第九步:应用下棋范围,提高AI速度当前节点的子节点的数量和排列顺序对于搜索的速度起着至关重要的影响。
根据五子棋的特点,可以产生一个棋面搜索范围。
记录当前棋面所有棋子的最左最右最上最下点构成的矩形,我们认为下一步棋的位置不会脱离这个框3步以上。
这样在棋子较少的时候,搜索节点的数量大大减少。
可以将AI的速度提高一倍左右。
第十步:利用棋型得分,提高AI速度因为每种下法都对应一种得分,所以,可以每次只考虑当前得分前十的节点进行下一步搜索,大大减少了搜索范围,可以进一步增加搜索的深度。
第十一步:利用置换表,提高AI速度我们一般用递归的方法实现博弈树,但是,递归的效率是低的,而且很明显,有很多重复搜索的节点,所以,我们可以用一个表,记录下所有搜索过节点的情况,然后只要遇到搜索到的节点,就可以直接得到结果。
置于这个“表”是什么,就是一个置换表,利用Zobrist算法,进行Hash处理,使在表中查找的时间大大缩短,这样AI的速度又能提高一个数量级。