(完整版)五子棋人工智能课题毕业论文设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能专家系统论
文
题目五子棋AI算法和网络通信的研究
学生姓名陈维梅
学号
系别商务学院
年级2009
专业计算机科学与技术
指导教师
职称讲师
完成日期
五子棋AI算法和网络通信的研究
摘要:
本系统将利用五子棋游戏作为研究对象,通过设计出一个能够实现两种不同对战模式的五子棋游戏。
并对所涉及到的相关技术进行初步的探讨,将重点放在人机对奕中AI算法研究方面。
游戏中提供两种选择模式:人机对战和人人对战。
在人机对战中玩家通过选择不同的AI等级和电脑一决高下。
在人人对战中双方可以进行下棋,悔棋但要通过对方的同意。
同时还可以实现在线聊天。
AI的不同等级是以不同的搜索深度确定的。
本系统以深度为2,3,4分别为初级,中级,高级。
网络对战中则使用Socket实现点对点通信。
关键字:五子棋、博奕AI算法、网络通信
Research the AIof Renju and the Communication
Summary:
This system will use Renju as research objects, passing to design a Renju game that can provide two kinds of dissimilarities to the play mode.
to involve to of the related technique carry on the study of the first step, play more attention in the AI calculate way research aspect.
It provide two kinds of choice modes in the game:Person's machine to the war and the everyone to war.The player passes to choose the different AI grade and computer in person's machine the rightness the war a definitely superiority.Both parties can carry on play chess in the everyone the rightness the war, the regrets chess but want to pass the approval of the other party.Can also carry out on-line chat in the meantime.AI different grade with search the depth assurance differently.This system takes depth as 2, 3, 4 is an entry-level respectively, medium class, using the Socket realization to order in the war to.
Key word: Renju ,AI,networks
目录
第一章引言 (4)
1.1问题背景 (4)
1.2五子棋简介 (5)
第二章详细设计过程 (5)
2.1.概要介绍 (5)
2.1.1 本程序介绍 (5)
2.1.2 本程序优点 (5)
2.2用软件工程方法学指导开发过程 (5)
2.2.1 问题定义 (6)
2.2.2 可行性研究 (7)
2.2.3 需求分析 (8)
2.2.4总体设计 (9)
2.2.5 详细设计 (10)
2.2.6 编码和单元测试 (10)
2.3用户界面 (10)
2.4系统解析 (11)
2.4.1 界面部分 (11)
2.4.1.1CFiveChessView的属
性 (11)
2.4.1.2CFiveChessView的函数 (12)
2.4.2 通信部分 (14)
2.4.3 其他部分 (15)
2.4.3.1 CMatch---棋盘类 (16)
2.4.3.2 CMessg—消息类 (17)
2.4.3.3 CComputer—电脑类 (18)
2.5.人机对战中的AI算法 (18)
2.5.1 极大极小树 (19)
2.5.2深度优先搜索(DFS) (19)
2.5.3 剪枝方法 (20)
2.5.4 静态估值函数 (21)
2.5.5AI算法的分析和改进 (21)
2.5.5.1算法分析 (22)
2.5.5.2 算法改进 (24)
第三章运行测试 (25)
3.1 网络部分 (25)
3.2 人机部分 (25)
第四章总结部分 (27)
4.1 系统总结 (29)
4.2 不足说明 (29)
4.3 致谢 (28)
参考文献 (29)
第一章引言
1.1 问题背景
计算机运算速度一直遵循着摩尔定律在飞速的发展,随着这些技术的
快速发展,使得大规模的运算得以在很短的时间内实现。
正是基于这些技术,近年来各式各样的棋类游戏软件也纷纷出现在了电脑荧屏上,使得那些喜爱下棋,又常常苦于没有对手的棋迷们能随时过足棋瘾。
所以如果能设计一款兼有人工智能和网络联机的五子棋软件则对五子棋棋迷们来说无疑是个“福音”。
在人机智能方面其中战胜过国际象棋世界冠军-卡斯帕罗夫的“深蓝”便是最具说服力的代表;其它像围棋的“手淡”、象棋的“将族”等也以其优秀的人工智能深受棋迷喜爱;
本系统将重点放在人工智能方面,采用不同的策略将人工中的智能分为不同的等级。
选择五子棋游戏作为本设计的课题,是因为该游戏的规则简单,所涉及的方向比较少。
这样才能将问题的重点放在人工智能解决上,而非规则的解决,有更多的精力放在高效算法和通信过程的优化。
希望能通过本次系统的设计,整合所学的知识,实现从理论到实践上的升华。
1.2 五子棋简介
下面就五子棋的背景和规则做一些简单的介绍。
五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为“连珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
五子棋的规则如下:棋盘:采用同围棋盘一样的15 路或19 路线的棋
盘,为了减小问题的规模,本系统将采用15 路线的棋盘。
下法:两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子。
无子的交叉点又被称为空点。
输赢判断:黑、白双方有一方的5个棋子在横、竖或斜方向上连接成一线即为该方赢。
第二章详细设计过程
2.1概要介绍
2.1.1本程序介绍
游戏中提供两种选择模式:人机对战和人人对战。
在人机对战中玩家通过选择不同的等级和电脑一决高下,可以向后悔棋。
在人人对战中双方通过选择一方作为服务器,通过弹出对话框设置本地应用程序监听端口,而另外一方则作为客户端,通过连接服务器选项,在弹出的对话框中设置要连接的服务器的IP地址和端口号。
当双方都提示连接成功后,两方才可以进行下棋。
如要悔棋则需要通过对方的同意。
同时还可以实现在线聊天。
AI的不同等级是以不同的搜索深度确定的。
本系统以深度为2,3,4分别为初级,中级,高级。
网络对战中则使用Socket实现点对点通信。
2.1.2本程序特点
五子棋游戏程序由于规则简单操作简便等特点,自然就成为程序员对人工智能研究的首选对象。
所以网络上关于这类的程序很多,但是由于主要都是采用搜索穷举技术作为解决方案,这将使得问题的规模变的很庞大如当搜索深度为3时,每走一步电脑在将最坏的情况下需要搜索的点将达到225*225*225=个。
即使采用的剪枝技术,其某些点的响应的时间也是让人无法忍受的,如开局时,因为这个时候每个点都是空的,没有可以剪枝的点,必须遍历真个盘面,所以很耗时间,大约需要30多秒的时间,这个显然是不可接受的。
为了程序设计和玩家的忍受时间的需要。
不得不减小
深度,所以绝大部分都采用深度为2的检索,很明显深度越低系统的智力也相对的降低,需要代价的。
本程序的一个主要特点是,采用了高效的优化方法,使得在相同的搜索规模中所花费的计算时间大幅度的减小。
响应时间明显得到提高。
即使搜索深度达到4的时候,其响应时间在绝大部分的情况下还是可以接受的。
2.2用软件工程方法学指导开发过程
在小规模的程序开发中,很多人都不太注意用软件工程的方法学设计系统,包括我本人,在开发一些小功能程序时总是随心所欲的添加需求:有时为了类与类之间的通信需要,往类中添加不相关的变量,直接修改变量的属性或者声明一大堆的全局变量。
虽然最后系统都能够”笨重”的运行起来,但这是明显违背程序设计方法学。
可维护行,易修改性严重降低。
后期如果需要添加某些功能的时候将变得十分的繁琐。
可以想象在多个团队一起开发的大型系统中这种粗陋的开发方法根本是行不通的。
所以要养成用正确的方法指导开发过程的习惯,虽然有时候看起来有点大题小做,但我觉的这是作为一名合格的软件开发工程师所必须掌握的技能。
通过长期不断的积累才能增加我们参与大型项目开发的能力。
下面对软件工程作下简单的介绍:
软件工程一直以来都缺乏一个统一的定义,很多学者、组织机构都分别给出了自己的定义:
Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。
IEEE:软件工程是开发、运行、维护和修复软件的系统方法。
Fritz Bauer:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。
目前比较认可的一种定义认为:软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。
我个人对软件工程理解是,它一种工程上的方法学,用一种有步骤,有计划的正确有效方法指导开发过程。
软件工程的精髓可以用著名的软件工程专家B.Boehm的七条基本原理来概括。
(1)用分阶段的生存周期计划进行严格的管理。
(2)坚持进行阶段评审。
(3)实行严格的产品控制。
(4)采用现代程序设计技术。
(5)软件工程结果应能清楚地审查。
(6)开发小组的人员应该少而精。
(7)承认不断改进软件工程实践的必要性。
目前绝大部分的软件方法都可以从这七条基本推倒出来。
B.Boehm 指出,遵循前六条基本原理,能够实现软件的工程化生产;按照第七条原理,不仅要积极主动地采纳新的软件技术,而且要注意不断总结经验。
下面扼要介绍软件生存周期在本次每个阶段的基本任务
2.2.1问题定义
问题定义的一个的关键问题是“要解决的问题是什么”,这个是这个阶段必须要明确要回答的问题。
在没将问题定义好,试图准备下个阶段的任务。
这明显是不成熟,甚至不可能的事。
选择操作
调用
图2.1 系统模型
本次系统设计中首先明确了需要解决的问题是五子棋AI算法和网络通信的研究,基本的要求是设计一款能够实现网络和单机对战的五子棋游戏,提供一些基本的操作如退出系统,向后悔棋等操作,重点是放在AI 算法和网络通信的研究。
而并不是美工设计,也不是为了提供各种操作丰富的接口。
主要是通过这种可视化的界面探讨AI,当然增加可玩性和美工会给系统润色不少。
上面只是很粗略的明确大概的方向,严格按照软件工程的方法这个阶段需要生产一份书面报告。
需要通过对系统的实际用户访问调查,扼要地写出他对问题的理解,并在用户和使用部门负责人的会议上认真讨论这份书面报告,澄清含糊不精的地方,改正理解不正确的地方,最后得出一份双方都满意的文档。
本系统的需求很少也很明显了。
2.2.2可行性研究
这个阶段要回答的关键问题:“对于上一个阶段所确定的问题是否可行?”为了回答这个问题,我们需要进行一次大大压缩和简化了的系统分析和设计的过程,也就是在较抽象的高层次上进行的分析和设计的过程。
可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。
可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。
可行性研究以后的那些阶段将需要投入要多的人力物力。
及时中止不值得投资的工程项目,可以避免更大的浪费。
根据这些基本的概念,我在技术上主要是通过相关文档资料的查找后确定可行性,凭着大学期间打下厚实的专业科基础,特别是数据结构和算法,
能够在这段时间内理解通透并应该有所改进,后来证明是对的。
利用剩下时间也应该来说也比较充裕的。
经济上暂不考虑。
下面主要从技术上进行分析:
工具:VC++是一款经久不衰的开发工具,它代表了基于Windows的C++语言产品,完美地集成了传统的编程工具,也集成了Windows中特殊的工具箱,如MFC(Microsoft Foundation Classes)和Windows资源编辑器(App Studio)。
另外还加入了几种新工具,如轮廓应用程序生成器(App Wizard)、C++类管理器(Class Wizard)和类浏览器(Class Browser),以及各种各样为开发Microsoft Windows下的CC++程序而设计的工具,MFC类库为我们提供了丰富的类资源。
所以VC++是最好的选择。
本程序将采用VC++的单文档的视图框架,这样可以简化程序的开发。
网络通信方面将从MFC封装socket的类CSocket实现点对点通信。
算法:在这图论搜索技术这方面,前人已有很成熟的算法。
如粗糙的有深度优先算法(DFS)和广度优先算法(BFS)这两个基本的算法,关键需要解决的是能够设计出一种高效的剪枝函数,减小搜索问题的规模。
目前博弈类游戏中的人工智能基本都采用极大极小值方法这对我来说是个挑战,而剪枝的则采用Alpha-Beta,通过丰富的文档资料初步了解到这些技术已经很成熟了。
我有信心能解决好这个问题。
Socket:联机对战中的数据传输量很少,利用Socket编程是在好不过了,而且在这方面的掌握程度不存在有问题。
所以通过对以上关键问题的分析,可以很明确了该系统的可行性。
这个阶段的任务告一段落了。
可以着手下一个阶段的任务了。
软件工程很强调文档驱动开发过程,只有完成了上个阶段的工作后,才能开始下一步骤,
这是传统的瀑布开发方法。
当然不同的开发模型,过程也会有所区别,大体上都遵循软件工程的这个步骤。
这个阶段应该要产生一份《可行性分析报告》。
2.2.3 需求分析
这个阶段的任务仍然不是具体地解决问题,而是准确地确定“为了解决这个问题,目标系统需要做什么”,主要是确定目标系统必须具备哪些功能。
用户了解他们所面对的问题,知道必须做什么,但是通常不能完整准确地表达出他们的要求,更不知道怎样利用计算机解决他们的问题;软件开发人员知道怎样使用软件实现人们的要求,但是对特定用户的具体要求并不完全清楚。
因此在需求分析阶段必须和用户密切配合,充分交流信息,以得出经过用户确认的系统逻辑模型。
通常用数据流图、数据字典和简要的算法描述表示系统的逻辑模型。
在设计本系统时考虑到用户需要的是一个操作简便界面简单的游戏软件。
同时要提供人机和人人这样的功能。
特别是人机部分,要考虑到不同级别的用户。
电脑智能不能太低需要有一定的智能下棋功能。
本系统用提供平常下棋的一些步骤操作。
网络联机:提供向服务器一方发出连接请求的操作,并从弹出的对话框中设置IP和端口号;服务器提供监听的操作同样在弹出的对话框中设置端口号。
任何一方需要悔棋请求,则必须通过对方的确定后方可。
连接成功后双方可以开始游戏,决定在界面中提供在线聊天功能。
用户可以通过主界面的上的菜单操作执行响应的功能和请求,如向对方发处向后悔棋一步,重新开始,认输等,另一方在接到请求后决定接受或拒绝。
人机对战:选择和电脑对弈的等级操作,同样也可以执行网络联机的悔棋等功能,只是因为是人机所以无需通过确认。
2.2.4总体设计
这个阶段必须回答的关键问题是:“概括地说,应该如何解决这个问题?”首先,应该考虑几种可能的解决方案。
如,目标系统的一些主要功能是用计算机自动完成还是用人工完成;如果使用计算机,那么是使用批处理方式还是人机交互方式;信息存储使用传统的文件系统还是数据库……。
通常至少应该考虑下述几类可能的方案:
低成本的解决方案。
系统只能完成最必要的工作,不能多做一点额处的工作。
本系统的最基本要求就是能够实现必要的操作,其他额外的一些工作在后面完成
中等成本的解决方案。
这样的系统不仅能够很好地完成预定的任务,使用起来很方便,而且可能还具有用户没有具体指定的某些功能和特点。
虽然用户没有提出这些具体要求,但是系统分析员根据自己的知识和经验断定,这些附加的能力在实践中将证明是很有价值的。
这个成本方案在完成上面的低成本方案后添加的。
如增加保存棋局,美化界面,实现观看电脑与电脑之间的对战等功能。
高成本的“十全十美”的系统。
这样的系统具有用户可能希望有的所有功能和特点。
结构设计的一条基本原理就是程序应该模块化,也就是一个大程序应该由许多规模适中的模块按合理的层次结构组织而成。
总体设计阶段的第二项主要任务就是设计软件的结构,也就是确定程序由哪些模块组成以及模块间的关系。
通常用层次图或结构图描绘软件的结构。
2.2结构图
2.2.5详细设计
这个阶段的具体内容我把放到模块分析的章节去分析。
下面仅作个简要的概述。
总体设计阶段以比较抽象概括的方式提出了解决问题的办法。
详细设计阶段的任务就是把解法具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?”
这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。
这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。
2.2.6编码和单元测试
这个阶段的关键任务是根据以上阶段分析的软件模型,编写各个功能模块。
要注意的是程序的扩张性和可读性。
以便以后软件的升级修改。
同时要仔细的测试每个功能编写好的功能模块。
这个内容也放到下面编译运行章节去。
2.3 用户界面
用户界面在整个系统的使用中起着很大的作用,它将直接影响到用户对软件的评价。
界面是人机交互的平台,所以在设计时尽量往用户方考虑。
提供操作简便和友好界面。
以下是系统使用的界面,感觉还有很多地方需要改进和完善。
但是总体来说已经能够基本满足系统的需要。
拥有较为良好的交互功能。
图2.3 用户界面
2.4 系统解析
下面结合操作对各个功能模块设计进行相应的解析。
2.4.1 界面部分
这部分我采用的是vc++提供的单文档视图框架,该框架为我们生成了Window应用程序最基本的界面无需自己动手编写复杂的菜单模块等代码,只要在基于这个框架的基础上对相应的功能进行补充和扩展。
2.4.1.1 CFiveChessView的属性
CView 类是该框架中一个很重要的类,它提供了大部分的交互功能,如菜单,鼠标左键等消息的的响应。
下面对本系统中的CFiveChessView 类的几个重点内容做个介绍。
m_ListenSocket和m_ClientSocket变量,这两个类成员均是派生自CSocket类,前者定义为一个服务端的套接字(Socket)变量,它用于服务端负责监听,当它收到某个主机发来的连接请求时,将m_ClientSocket和远程主机端的套接字关联。
这样双方可以进行通信了。
CMatch m_match 这是一个棋盘类的一个变量。
关于这个类将在后面做详细的讲解,将棋盘单独抽象为一个类,并向外部提供棋盘的一些操作。
这比较符合面向对象编程。
CComputer m_computer 这也是一个很重要的成员,它将人机对战中的电脑方抽象成一个类,该类提供不同的等级的下棋功能。
根据当前棋盘的局势给出最佳的下棋点。
该类也将在后面给出详细的介绍。
m_mode 这是用于标记当前系统的是属于哪种模式人机或者联机,当它是人机的状态时值为P_PK_C(枚举类型的值),同样当它是联
机状态就为P_PK_P。
若当前没有选择的状态值就为NOCHOOSE,表示当前还为进行选择。
m_who 用于标记使用棋子的类型,1代表黑色,2代表白色。
m_turn 这是联机中用于标识当前是轮到哪方下棋了。
m_bWin标识本机方赢的状态。
m_bOver 标识游戏是否已经结束。
2.4.1.2 CFiveChessView的函数
以下的五个变量均为CBitmap类对象,m_lastwhitechess加载的是位图。
m_whitechess加载的是位图,m_lastblackchess加载m_blackchess加载位图,m_black 加载位图。
m_board加载的是棋盘位图。
下面对该视图类一些重要的成员函数做些介绍。
●DrawWhiteChess(int i,int j,CDC *pDC);
●DrawBlackChess(int i,int j,CDC *pDC);
这两个函数根据传递进来的参数,确定要在棋盘的哪个位置和画的类型,如当该点是最近下的一个棋子,则把它用m_lastblackchess或m_lastwhitechess加载的位图贴出来。
否则使用m_whitechess或m_blackchess位图。
这两个函数是在OnDraw(CDC* pDC)函数中被调用的。
这个函数在窗口初始化或者需要重绘的时候被调用的。
系统会发出一个重绘消息,调用OnPaint(),在这个函数中又调用了OnDraw(),将整个界面画出来。
OnLButtonDown(UINT nFlags, CPoint point)是该类中一个非常重要的函数,用户的下棋的操作都是由这个函数完成的。
当左键被点击的时,Window会产生一个左键消息放到该应用程序的消息队列中,而该应用系
统取出消息并通过消息映射确定调用的函数,最后由操作系统调用该函数。
我们可以将其简化理解为用户点击了左键后,该函数就响应了该操作。
●该函数首先判读游戏是否已经结束,如果是那么会弹出对话框询问
用户是否要继续。
●如果没结束的话,并且当前的模式不是NOCHOOSE则根据鼠标
的坐标计算出该点对应的是棋盘的哪个位置,把它保存起来。
若是
则提醒用户选择模式。
●然后判读当前的下棋模式,进入到响应的模块中,在模块中需要判
读该点是否是合法的,若不是则返回。
1) 人机模式:判读该点是否合法,如果是则更新该点(该点区域
重绘),并且记录下该点作为最新下棋点。
接着判断该点是否
能行成五连子。
如果不能,则调用m_computer 成员的响应
等级算法,给出电脑的棋子的坐标。
同样需要判断该点能否行
成五连子,最后更新该点。
2) 联机模式:判读是否轮到己方下棋,若是则判断该点是否合法,
若是修改相应的状态变量,并且发送消息棋盘状态给对方。
同
样判断是否行成了五连子。
下面再介绍一些菜单上的消息响应函数。
⏹void OnSetclient()------连接服务器
该函数用于响应菜单项游戏的子菜单下的连接服务器选项,响应后将弹出
如下的对话框,要求用户设置好需要连接的服务器端的IP和监听端口。
图2.4 连接服务器
⏹void OnSetserver()------开启服务器
该函数也是用于响应游戏菜单下的开启服务器选项,点击后也弹出如下要求设置的监听端口。
图2.5 开启服务器
⏹void OnPrimary()初级选项
⏹void OnSecondary();中级选项
⏹void OnSenior();高级选项
这三个函数响应用户要选择人机对战中电脑的等级,点击该菜单将m_computer的成员m_grade分别设置成1,2或3,并且模式变量m_mode被设置成P_PK_C.
void OnRollback();悔棋选项
悔棋选项分为两个部分:一种是人机对战状态中的悔棋,该模式下用户只需点击该选项,棋局将回退到上一个状态。
另一种是;联机对战的模。