九宫格的启发式搜索.docxVIP

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
九宫格的启发式搜索

九宫格的启发式搜索班级:计算机一班姓名:覃荣锦学号:1240023实验目的加深对局部择优搜索以及全局择优搜索的熟悉程度。了解局部择优搜索以及全局择优搜索的区别。实验语言环境系统:微软Window7系统开发工具:visual c/c++ 6.0语言:c语言实现设计状态表示:九宫格状态以一组一维数组表示。1~8分别表示8个对应的数字,0表示空格,数据结构如下:Typedef struct{Int data[9];}Data;九宫格节点为以线性表表示的树的节点,因此需要加入指向该节点父母的指针,在这里用下标表示,同时由于不同节点有不同的估值,因此需要加入表示其值变量。完整的数据结构如下:typedef struct{int data[9];int parent;int value;} Data;算法介绍:局部择优搜索:把初始节点S0放入open表。如果open表为空,则问题无解,退出。把OPEN表的第一个节点取出放入CLOSE表,记该节点为节点n。观察节点n是否为目标节点,若是,则求得问题的解,退出。拓展节点n,将扩展的的节点排序后放入open表,将合法节点放入open表中。然后转到第二步。全局择优搜索:把初始节点S0放入open表。如果open表为空,则问题无解,退出。把OPEN表的最后一个节点取出放入CLOSE表,记该节点为节点n。观察节点n是否为目标节点,若是,则求得问题的解,退出。拓展节点n,将合法节点放入open表中。排序OPEN表。然后转到第二步。辅助矩阵介绍在本程序中,为了执行提高效率,在拓展和局面评估这两部分采用了矩阵作为辅助。拓展辅助矩阵如下:const static int check[9][4]={{1,3,9,9},{0,2,4,9},{1,5,9,9},{0,4,6,9},{1,3,5,7},{2,4,8,9},{3,7,9,9},{4,6,8,9},{5,7,9,9}};在九宫格中,第0块可以和1、3块交换,第1块可以和0、2、4块交换……根据这个特点,本程序中生成如上的矩阵,对于第i块,它的可交换块为check[i][0]、check[i][1]、check[i][2]等等。评估辅助矩阵如下:const static int a[9][9]={0,1,2,1,2,3,2,3,4,//11,0,1,2,1,2,3,2,3,//22,1,0,3,2,1,4,3,2,//31,2,3,0,1,2,1,2,3,//42,1,2,1,0,1,2,1,2,//53,2,1,2,1,0,3,2,1,//62,3,4,1,2,3,0,1,2,//73,2,3,2,1,2,1,0,1,//84,3,2,3,2,1,2,1,0,//9};该矩阵是一个二维矩阵,矩阵的值a[i][j]表示九宫格第i块和第j块的距离。这可以很方便地求出第i块移动到目标点的代价。比如,数字为n的块当前位置为p,则我们可以通过取a[n][p]的值直接求得它移动到目标花费的代价。当然,值为0的块目标位置是9,因此我们为它取值应该为a[9][p]。初始化节点以及判断目标节点由于硬件的局限性,我们不能保证任何局面都能在一遍内找到走法,因此我们在本程序中添加自动生成在当前硬件条件下可破解的局面。思路为从目标局面开始随机移动30~40步生成一个初始局面。并将该初始局面作为初始节点。算法如下:void InitData(int data[9])//随机生成可破解局面{srand((unsigned)time(NULL));//int a[9]={1,2,3,4,5,6,7,8,0};int k=rand()%10+30;int j,l,temp;while(k=0){for(l=0;l9;l++)if(a[l]==0) break;j=rand()%4;k--;if(check[l][j]!=9){temp=a[check[l][j]];a[check[l][j]]=a[l];a[l]=temp;}}for(j=0;j9;j++)data[j]=a[j];}void Init(int data[9]){for(int i=0;i9;i++)open[opentop].data[i]=data[i];open[opentop].parent=-1;open[opentop].value=GetValue(open[opentop].data);opentop++;}判断目标节点算法如下:bool Checkwin(int data[9]){for(int i=0;i8;i++)if(data[i]!=i+1) return 0;return 1;}拓展节点拓展节点的思路为:对于当前节点,利用上面介绍的辅助矩阵求出其接下来移动后可能生成的2~4个局面。判断每个局面

文档评论(0)

haocen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档