ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:78.73KB ,
资源ID:17391906      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17391906.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(启发式搜索八数码问题Word下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

启发式搜索八数码问题Word下载.docx

1、:计算如果 既不在OPEN表中,又不在CLOCED表中,则用估价函数把它添入OPEN表中。从加一指向其父节点的指针,以便一旦找到目标节点时记住一个解答路径;已在OPEN表或CLOSED表中,则比较刚刚对计算过的和前面计算过的该节点在表中的值。如果新的较小,则(I)以此新值取代旧值。(II)从指向,而不是指向他的父节点。(III)如果节点在CLOSED表中,则把它移回OPEN表中。7转向,即GOTO。4.估价函数计算一个节点的估价函数,可以分成两个部分:1、已经付出的代价起始节点到当前节点;2、将要付出的代价当前节点到目标节点。节点n的估价函数定义为从初始节点、经过n、到达目标节点的路径的最小代

2、价的估计值,即 = + 是从初始节点到达当前节点n的实际代价; 是从节点n到目标节点的最正确路径的估计代价,表达出搜索过程中采用的启发式信息背景知识,称之为启发函数。所占的比重越大,越趋向于宽度优先或等代价搜索;反之,的比重越大,表示启发性能就越强。5.实验代码为方便起见,目标棋局为不变(1)以下代码估价函数为深度+错放棋子个数(2) 假设估价函数为深度+每个棋子与其目标位置之间的距离总和,则加入估价函数int calvalue1(int a) /不在位棋子数 int c = 0; int b=0; for (int i = 0;i = 8;i+)for (int j = 0;j jiedia

3、n.f = depth;(4) 深度搜索采用OPEN-jiedian.f = -depth;源代码:1. #include stdio.h2. 3. int goal9 = 1,2,3,8,0,4,7,6,5 , sgoal9;/goal为棋盘的目标布局,并用中间状态sgoal与之比较4. 5. struct Board6. 7. int shuzu9;8. int d, f, e;/d:深度;f:启发函数;e:记录前一次的扩展节点9. ;10. 11. struct NodeLink12. 13. Board jiedian;14. NodeLink *parent;15. NodeLink

4、 *previous;16. NodeLink *next;17. NodeLink *path;18. ;19. /更新纪录八数码的状态20. void setboard(int a, int b, int flag) /flag=0,写棋子;flag=1,写棋盘21. 22. for (int i = 0;23. if (flag)24. abi = i;25. else26. bai = i;27. 28. /计算启发值的函数29. int calvalue(int a) /不在位棋子数30. 31. int c = 0;32. for (int i = 0;33. if (ai !=

5、goali)34. if (goali !35. c+;36. return c;37. 38. /生成一个新节点的函数39. NodeLink *newnode(NodeLink *TEM, int depth, int flag)40. 41. NodeLink *temp = new NodeLink;42. for (int i = 0;43. temp-jiedian.shuzui = TEM-jiedian.shuzui;44. switch (flag)45. 46. case 1:47. 48. temp-jiedian.shuzu0-;49. temp-jiedian.shu

6、zusgoaltemp-jiedian.shuzu0+; /向左移50. break;51. 52. case 2:53. 54. temp-jiedian.shuzu0+;55. temp-jiedian.shuzu0-; /向右移56. break;57. 58. case 3:59. 60. temp-jiedian.shuzu0 -= 3;61. temp-jiedian.shuzu0 += 3; /向上移62. break;63. 64. case 4:65. 66. temp-jiedian.shuzu0 += 3;67. temp-jiedian.shuzu0 -= 3; /向下

7、移68. break;69. 70. 71. temp-jiedian.d = depth + 1;72. setboard(sgoal, temp-jiedian.shuzu, 1);73. temp-jiedian.f = temp-jiedian.d + calvalue(sgoal);74. temp-jiedian.e = flag;75. temp-parent = TEM;76. return temp;77. 78. /把新节点加入OPEN队列79. NodeLink *addnode(NodeLink *head, NodeLink *node) /把node插入到head链

8、中80. 81. NodeLink *TEM;82. TEM = head;83. head = node;84. head-next = TEM;85. head-previous = NULL;86. if (TEM)87. TEM-previous = head; /TEM已为空,无需操作88. return head;89. 90. 91. /求启发值最小的结点92. NodeLink *minf(NodeLink *head)93. 94. NodeLink *min, *forward;95. min = head;96. forward = head;97. while (for

9、ward)98. 99. if (min-jiedian.fforward-jiedian.f)100. min = forward;101. forward = forward-next;102. 103. return min;104. 105. 106. int main()107. 108. int depth = 0;109. int source9;110. int i, j;111. 112. NodeLink *OPEN = new NodeLink;113. NodeLink *TEMP, *TEM;114. 115. printf(请输入初始状态:n);116. for (

10、i = 0;ijiedian.shuzu, 0);120. OPEN-jiedian.d = depth;121. OPEN-jiedian.e = 0;122. OPEN-jiedian.f = depth + calvalue(source);123. OPEN-next = NULL;124. OPEN-125. OPEN-parent = NULL;126. 127. while (OPEN)128. 129. TEMP = minf(OPEN); /求具有最小启发值的节点130. setboard(sgoal, TEMP- /写棋盘131. if (!calvalue(sgoal)1

11、32. break;133. if (TEMP != OPEN) /如果不是第一个节点134. 135. TEMP-previous-next = TEMP-136. TEMP-next-previous = TEMP-previous;137. 138. else /是第一个节点139. 140. if (OPEN-next) /如果还有节点141. 142. OPEN = OPEN-143. OPEN-144. 145. else OPEN = NULL; /否则置为空146. 147. 148. if (TEMP-jiedian.shuzu0 - 1 = 0 & TEMP-jiedian

12、.e != 2) /防止棋子回到原状态149. OPEN = addnode(OPEN, newnode(TEMP, depth, 1);150. if (TEMP-jiedian.shuzu0 + 1 jiedian.shuzu0 - 3 = 4)153. OPEN = addnode(OPEN, newnode(TEMP, depth, 3);154. if (TEMP-jiedian.shuzu0 + 3 path = NULL;162. while (TEMP-parent) /每次回溯父节点,生成路径163. 164. TEMP-parent-path = TEMP;165. TEM

13、P = TEMP-parent;166. 167. j = 0;168. while (TEMP-path)169. 170. setboard(sgoal, TEMP-171. printf(第%d步:, j);172. for (i = 0;= 2;173. printf( %d, sgoali);174. printf( n175. for (i = 3;= 5;176. printf(177. printf(178. for (i = 6;179. printf(180. printf(181. TEMP = TEMP-path;182. j+;183. 184. setboard(s

14、goal, TEMP-185. printf(186. for (i = 0;187. printf(188. printf(189. for (i = 3;190. printf(191. printf(192. for (i = 6;193. printf(194. printf(195. 196. else197. printf(无法求解!198. (1)以上代码估价函数为深度+错放棋子个数(2) 假设估价函数为深度+每个棋子与其目标位置之间的距离总和,则函数改为int calvalue(int a) /不在位棋子数6.输出结果:输入为:目标状态为:(1)估价函数为深度+错放棋子个数(2) 估价函数为深度+每个3棋子与其目标位置之间的距离总和

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1