人工智能完成总结报告.docx

上传人:小飞机 文档编号:5005836 上传时间:2023-05-29 格式:DOCX 页数:21 大小:222.37KB
返回 下载 相关 举报
人工智能完成总结报告.docx_第1页
第1页 / 共21页
人工智能完成总结报告.docx_第2页
第2页 / 共21页
人工智能完成总结报告.docx_第3页
第3页 / 共21页
人工智能完成总结报告.docx_第4页
第4页 / 共21页
人工智能完成总结报告.docx_第5页
第5页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《人工智能完成总结报告.docx》由会员分享,可在线阅读,更多相关《人工智能完成总结报告.docx(21页珍藏版)》请在三一办公上搜索。

1、完成总结报告项目名称:数独游戏设计与实现组 员:王郑合2014204081栾杰 2014204080文宽 201420410411:47 AM二十四日1问题描述1。1问题说明数独游戏起源于瑞士,由十八世纪的瑞士数学家欧拉发明,是一种数字拼图 游戏,其游戏规则是: 在9X9的大九宫格内,已给定若干数字,其他宫位留白,玩家需自己按照 逻辑推敲出剩下的空格里是什么数字。 必须满足的条件:每一行与每一列都有1到9的数字,每个小九宫格里也 有1到9的数字,并且一个数字在每行、每列及每个小九宫格里只能出现一次, 既不能重复也不能少。 每个数独游戏都可根据给定的数字为线索,推算解答出来。7114273427

2、731E43耳5S1B321自211.2数独求解描述由于数独游戏的推广与普及,在当今世界上有着大量的数独爱好者,本项目 的目的就是按照数独的游戏规则,通过对数据结构的分析和人工智能算法的研究, 利用计算机程序来实现对已知数独游戏的快速求解。1.3数独出题描述数独游戏挑战者的水平各异,对数独题目的难度要求各不相同,所以本项目 致力于设计一种算法,使其在尽可能短的时间内生成不同难度等级的数独题,以 满足不同水平游戏者的需求。同时,该算法还要考虑到三个方面要求:可变化的 难度、解的唯一性和算法复杂度最小化。2功能分析2。1数独求解数独虽然号称是数学问题,但在求解时几乎用不上数学运算方法,事实上它 更

3、像是一种思维方式。数独游戏开始后,要想在空格中填入正确的数字,先要根 据数独游戏规则对1-9分别进行逻辑判断,然后选择正确的数字填入空格.另外, 由于某个格子填入数据时,有可能还要对原来已填入的数据进行修正,所以可以 考虑使用递推和回溯搜索来求解数独问题。2。2数独出题出题时,要能保证算法生成的数独题具有可变化的难度和唯一解,该算法内 部应该包含有对数独题的求解和评级功能。本项目使用了一种基于“挖洞”思想 的数独题生成算法,将该算法的设计工作分为评级、求解和生成三部分工作。利 用随机数出现的概率不同来确定不同的难度,通过避免重填一个被“挖去”的格 子,或者回溯到一个曾经无法“挖去”的格子,来降

4、低算法的复杂性。2.3题目保存当用户需要退出却仍没有完成数独题目的解答时,可以选择是否保存当前的 求解进度.如果需要,本系统会帮助用户将目前未完成的数独题目的解答进度保 存起来,以便用户下次使用本系统时,可以继续解答上次未完成的题目。2.4题目读取用户可以在程序开始运行后,选则读取一道之前保存起来的题目进行解答, 被读取的题目将会显示到程序界面上。3系统设计3.1功能结构图解题本程序主要有数独求解和数独出题两个功能,数独求解包括题目检验、 和输入输出,数独出题包括答案检验、难度选择、出题和输入输出。3。2业务流程图度向通出通)-W 一、(睑证匏目是否合地)(输妄熟目)- read|101D:

5、im-sudaku82J: ini fix|B2: im po35iblfl|B21D: im-review(82 int* randomQ void+ hideQ :d* makeProblemQ ” void/ /HreSolve/read10|10: im-sudokuB2i ini nx|B2: int-posibls821D: int-review82: intread峋仲int-sudoku|B2. int-fix|82 int-pDE-5ible82.|10i ini.-review(&2: ini+ inicializeO i vaid * lineTsstO - baal r

6、nwTestO : boal squaraTestfl . ba al t口 Line I . inL* inRawj). intf toReadQ - int t toSudakuQ - vaid + printAIIQ void* inputQ, void* isExisliQ : bool+ setPossibleQ : void+ fixPossibleQ: boal+ isFullQ : boal+ prep口国非0 : void* calculaheQ : b口口I* -s loveProbl em() voi d-ASudokuDlg类:程序的界面类。Solve类:实现数独题目求

7、解功能。Make类:实现数独题目出题功能.Pre类:对数据进行预处理。3.4界面设计3。5算法设计3。5。1数独求解算法解决该数独求解问题时的要考虑的主要方面有: 判断题目合法性,即验证给出数据本身是否符合游戏规则,行、列以及小 九宫中从不重复地出现数字1-9; 采用递推算法,若可以填入数字则填入数字,并入栈以便回溯,否则回溯 至前面填入数字处重新填数; 所有空白处都要填满数据;其中,最重要的就是如何通过递推算法填入正确的数字,或者通过回溯算法 重新填入数字并得到最终解,这是本算法的核心内容。回溯法是解决数独问题的有效方法,有着较快的解题速度。然而一般的常用 的回溯算法仍然有不足之处,比如会进

8、行重复的运算。所以在采用回溯法之前, 还可以利用一点小技巧,以缩短回溯算法的运行时间,甚至可将运行时间缩短接 近于0.这个小技巧即在回溯算法的基础上,采用有限递推算法进行预处理.算法活动图如下:(读取湖目、)V但断最目合毋8)方.出够提示)T治理、结束吓曜逮推进行该跳理、|向测法进行计算)陆出尝果)结束3.5.1数独出题算法要想设计一个算法用以生成各种难度等级的数独题,通过对游戏规则的分 析,首先从三个方面定义难度等级,分别是已知格总数、已知格的分布和穷举搜 索复杂度.本算法采用“挖洞”思想,经过以下步骤生成数独题: 用随机算法生成一个数独题目; 用求解算法生成终盘; 根据难度挖去部分数字;整

9、个生成数独题的算法分为两步执行:先利用拉斯维加斯随机算法随机生成 一个填满数字且符合游戏规则的终盘;而后根据所需求的难度等级抹去一些数 字,难度等级由随机数出现的概率来决定。算法活动图如下:.开始虫生成随机仙井人勤绍(选择难度 )务束4系统实现4。1开发平台本项目基于Visual Studio 2010平台的MFC,采用C+语言进行开发与测试。4。2运行环境本项目可在各个版本的Win7系统或者Windows XP系统下运行。4.3数据结构数据结构是计算机存储、组织数据的方式。通常情况下,精心选择的数据结 构可以带来拥有更高的运行或存储效率的算法。一般认为,一个数据结构是由数 据元素依据某种逻辑

10、联系组织起来的,对数据元素间逻辑关系的描述称为数据的 逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式, 是其在计算机内的表示。数独从形式上看是一个方阵,十分适合用数组来表示。 4.3。1主要数组本项目中所用到的主要数组有: int sudoku 82该数组的用途是存储题目以及保存最终结果,所有的9X9个数字被依次存储 在该数组中,空白处则初始化为0。之所以把数组范围设计成82而不是81,是为 了程序的易读性,使得数组元素的最大下标可达81,下同。 int fix82该数组的用途是若sudoku数组中某位置的数字不为空,则fix数组相应位置 的元素值为1,否则为0,即fix

11、数组是用来记录哪些位置的数字是已经确定下来 的。 int possible 82 10该数组的用途是记录所有未确定数字的所有可能性,possible数组各元素的 值在初始化时被初始化为与其第二维的下标一致,即09 (其中0表示空值); 在中间计算过程中,若发现第一维某位置的某种可能性已不复存在,则将第一维 下标是该位置而第二维下标是该不再可能的数字的元素值改为一1. int review82该数组的用途类似于栈,在回溯算法过程中起到至关重要的作用。回溯之前, 要把所有fix数组中值为0的位置依次存放进review数组;回溯中,由低到高依次 逐渐确定这些位置的数值,无法确定者(即1-9的数字都不

12、适合者)则应当回退 到前一个位置,并修改其fix数组中的值,依次类推,直至review数组所存放的所 有位置的值都能确定(即题目完成),或回退到最初点的前一个位置(即题目有 误)。4。3.2相关函数本项目中为实现算法的数据结构所用到的主要函数如下: void setPossible ()该函数是用来设置possible数组中元素的值,其具体功能是:对于fix数 组中每一个值为0的位置(即对于每一个没有确定下数字的位置),考察其可能 的数字是哪些,并记录下来。考察的方法是:在1 -9这些数字中除去在当前行、 列、九宫中已有的数字,剩下的即为可能的取值对象。 bool fixPossible ()

13、该函数是用来修改fix数组和possible数组中元素的值,其返回值表示了在 此次运行该函数过程中是否执行了修改。其具体功能是:对于fix数组中每一个值 为0的位置(即对于每一个没有确定下数字的位置),考察其可能的数字的个数, 若为1,则将fix数组该位置的值改为1且sudoku数组该位置的值改为该唯一可能 的数字(即该位置的值已确定下来),且返回真;若没有只有一种可能性的位置, 则返回假。 bool isExist (int i, int j)该函数用于回溯过程中,其用途是:判断sudoku数组中位置为i的元素的值 是否可能为j,即判断的是位置i所在的行、列以及九宫中是否已经存在数字j,若

14、存在则返回真,否则返回假。4.4求解算法实现4.4.1有限递推在执行一次fixPossible函数之后,就可能会确定下一些原来没有确定的数 字,那么此时possible数组的值必然也会变动。这是因为确定下的数字越多,某 些位置的可能数字的数目就会减少,那么此时就应再执行setPossible函数修改 possible数组。而修改之后可能又会出现一些只有一种可能性的位置,那么就应 该再执行fixPossible函数。于是,只要如此循环往复下去,就能最大限度地确定 下根据题目本身含义和规则而确定下的内容。确定的数字越多,对于将来回溯也 就越有利。经验表明,有些数独题直接就可以通过执行大约10多次的

15、有限递推循 环体解决。一般情况下,有限递推的循环结束只有两种情况:一是推出了全部结 果;二是fixPossible函数返回值为假,即不存在只有一种可能性的位置。预处理的主要代码见附录.4。4。2回溯回溯是数独求解算法中最为关键的部分,其主要步骤是: 按下标的由低到高扫描fix数组,将值为0的位置记录进review数组,记录 的顺序也是由低到高,最后记录下fix数组中为0位置的个数再加1; 把review数组看作栈,记录栈顶; 先设置一个bool型标志变量flag并初始化为true,下面各步骤都将在一个 条件始终为真的死循环中进行,该循环由一条对flag进行真假判断的语句分成两 大部分。若当前栈

16、顶是经过了回退操作而达到的,则flag会已被记录为false; 否则flag为true .死循环结束的条件是review数组(栈)中top与max的值相等, 即解出最终结果,或者是无解,最终top小于0。在死循环中,若flag为true,则 进入步骤,否则进入步骤。 若flag为true,则说明栈顶是经过正常的假设而达到的,并非由回退达到, 那么根据possible数组以及isExist函数对栈顶所保存位置的可能出现的数字进 行判断,把遇到的第一个可能数字放进sudoku数组,并把fix数组的该位置的值设 为1,并判断是否已经解出结果,艮Preview数组(栈)top和max的值是否相等. 若

17、相等,则得出结果并退出死循环;若发现1-9都不可能应用在栈顶所保存的位 置,则说明前面的假设有错误,此时应当回退。艮Pfix数组和sudoku数组的该位置 重设为0,top减1,并将flag的值设为false.然后结束本轮循环体,继续下一轮的 循环。 若flag为false,说明是经过了回退才达到现在这个栈顶的,那么若仍然没 有可能的数字可以应用在当前栈顶所保存的位置上,则继续执行出栈操作,艮Pfix 数组和sudoku数组的该位置的值重设为0,top减1;否则将遇到的第一个可能数字 应用到该位置,即再设好sudoku数组和fix数组,将top加1,并将flag的值设为 true.然后结束本轮

18、循环体,继续下一轮的循环.回溯的主要代码见附录.4。5出题算法实现4。5。1生成终盘数独出题时要先采用拉斯维加斯算法随机生成一个数独题的终盘。首先,在 一个数独空盘中随机选中n个格子,在这些格子内随机填人数字19;然后, 调用数独求解算法对这个已知n格的数独题S(n)进行求解.如果S(n)有解,则 返回true,否则返回false。拉斯维加斯算法的思想便是不断重复执行上述步骤, 直至其返回值为true为止.生成随机数的主要代码见附录。4.5。2挖洞算法挖洞算法的基本思想就是挖去一个数独终盘上的一些格子,使其成为有唯一 解的数独题目。然而挖洞的机制是多种多样的,本项目为了加快出题算法的速度, 利

19、用不同的随机挖洞概率来区分不同的难度。挖洞的主要代码见附录.4.6程序运行截图开始:数独求解,手动输入题目:数独求解,读取保存的题目:解出答案:厂厂p-厂厂厂数独出题,选择难度:得出题目:保存题目:P Pt r Hfi * uKeM r Prajid r SaJiba -, MM球 Sms,必-|心,卜kA |网HWI I9 )却J晶fli-ifi 3 SdriiirrwiaA H.nJ ElL财虹ALigR i.T.-5Fnu3, uJi .is n IVHdgBlJfl 1.4s11.11*24 N:41i注zla4*a=3LVLI/SA L?:。a a 三,Tfc m& IttMmtsa

20、JB: CiqJriBB.asT:n保存和打开题目的文件格式:立# FJ缁辑 格式心)查吾田1裁助如6 9 8 1 5 0 J 0 d- 2 114 6 2 O.U 9 3 52 ro 3 7 9 4 1s 63 8 7 4 1 & 5 2 9 9 s 1 3 T1 5 4 6 84 G 5 2 s 9 3 7 1 136542B975 4 9 s 6 7 2 13 8 7 2 9 3 16 5 45测试5.1解题测试选取5个难度共25道不同的数独题目进行解题测试,记录程序运行时间, 检验运算结果是否正确,并对实验结果进行分析。难度1:题目12345Average时间14ms13ms22ms2

21、2ms20ms18。 2ms结果正确正确正确正确正确难度2:题目12345Average时间21ms20ms20ms33ms21ms23.0ms结果正确正确正确正确正确-难度3:题目12345Average时间22ms26ms25ms23ms26ms24。 4ms结果正确正确正确正确正确-难度4:题目12345Average时间28ms24ms35ms29ms26ms28。 4ms结果正确正确正确正确正确-难度5:题目12345Average时间28ms50ms22ms44ms29ms34.6ms结果正确正确正确正确正确通过对实验数据的分析可知: 本算法得出的结果全部正确,说明本算法成功实现了

22、通过计算机人工智能 方法对数独问题求解; 随着题目难度加大,平均运行时间逐渐加长; 本次试验中,运行时间最长的题目不超过50ms,大多数题目在20-30ms内 完成,说明本算法的运行速度是比较快捷的。5.2出题测试5个难度各进行5次数独出题运算,记录运行时间,并比较得出的题目是否 会有重复。难度1:题目12345Average时间9ms10ms6ms7ms9ms8.2ms重复-一-无难度2:题目12345Average时间9ms8ms9ms7ms8ms8.2ms重复-无难度3:题目12345Average时间9ms9ms6ms5ms9ms7.6ms重复-一无难度4:题目12345Average

23、时间10ms9ms8ms6ms11ms8.8ms重复一-一-一无难度5:题目12345Average时间7ms9ms10ms5ms10ms8.2ms重复-无通过对实验数据的分析可知: 本此实验中,各组均无重复的题目出现,说明本算法成功实现了通过计算 机人工智能方法对数独问题的出题; 程序的运行时间不随难度增加而加长,个难度的运行时间基本一样; 运行时间基本维持着8-9ms左右,说明本算法的运行速度是比较快捷的。6工作总结 较好地完成了数独求解和数独出题的算法的设计与实现; 对算法进行功能测试,验证了算法的有效性,并证明了算法具有良好的时 间效率; 实现了良好的用户界面; 实现了数独题目的读取和

24、保存功能; 通过本项目,对人工智能技术有了进一步的了解,并初步掌握了 MFC编程; 锻炼了团队合作能力。7项目安排任务负责人时间项目建议书王郑合、文宽、栾杰9.19-9。30数独求解功能王郑合、栾杰10.1100 21数独出题功能王郑合、文宽10。110o 21测试栾杰10o 22-10o 23中期进展报告王郑合、文宽、栾杰10o 24-10o 28界面文宽10.2911o 4功能集成王郑合11.5-11o 9测试与改进文宽、栾杰11o 1011.20完成总结报告王郑合、文宽、栾杰11o 21-11o 25参考文献1刘晓宝。数独游戏的解题算法J.电脑编程技巧与维护,2007, (5): 64-

25、 67。2严蔚敏,吴伟民。数据结构M。第二版.北京:清华大学出版社,1993:93 95, 43- 45,220-221.3Stanley B Lippman, Josee Lajoie 著,潘爱民等译。C+ Primer (第三版)M。中国电力出版社,2002.4王晓东。算法设计与分析M .第一版。清华大学出版社,2003。5王万良。人工智能及其应用M。第二版。高等教育出版社,2008。预处理算法的主要代码:while (1)setPossible ();if(!fixPossible(sudoku,fix, possible) /即不存在只有一种可能性的位置 break;if (isFul

26、l(sudoku) ) /若已推出全部结果breakif (isFull (sudoku)printAll();/输出结果回溯算法的主要代码:if(isFull(sudoku)return true;int top=0;所有值为0的位置入栈for (int i=1;i 82; i+)if(fix i =0) reviewtop+ =i;int max=top;/记录最大数加1top=0; /指向栈顶int temp;bool flag=true ;/是否正常入栈的标志while(1)assert (top=0); /宏定义,用于调试程序if(flag)int j;for(j=1;j=max)r

27、eturn 1;breakif(j9)/若该位置所有可能值都不成立,则回退一格top;if (top0)printAll ();return 0;flag=false;elseif (sudokureview top =9)/若当前位置的top也没有可以选择的值,则继续回 退fixreviewtop =0;sudokureviewtop=0;toRead(review top);-top;if (top9)break;if (temp) 9) /当前节点没有更换的可能,继续回退fixreview top=0;sudoku review top =0; toRead (reviewtop);to

28、p;if (top0)printAll (); return 0;elsesudoku reviewtop =temp; toRead(reviewtop);+top;flag=true;/重新设置flag的值 生成随机数算法的主要代码:int i,j, r;bool change=true;int temp 10 = 0, 0, 0,0, 0, 0, 0, 0,0, 0);for (i=1;i=9;)change=true;j=1+rand ()%9;for(r=1;r=9;r+)if (tempr =j) change=false; if(change=true)tempi=j;i+;)for(i=1;i=9;i+)sudokui =tempitoRead(i);挖洞算法的主要代码:int i,f;dof=getch ()48;while (f5| f1) ;/共5个难度for (i=1;i=81; i+)if (rand ()%6=f)/利用随机数出现的概率出题 printf (%4d”, sudokui);elseprintf( 0);if (i%9=0)printf(nn” );

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号