啟發(fā)式搜索 八數(shù)碼問題_第1頁
啟發(fā)式搜索 八數(shù)碼問題_第2頁
啟發(fā)式搜索 八數(shù)碼問題_第3頁
啟發(fā)式搜索 八數(shù)碼問題_第4頁
啟發(fā)式搜索 八數(shù)碼問題_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、啟發(fā)式搜索1. 介紹八數(shù)碼問題也稱為九宮問題。在33的棋盤,擺有八個(gè)棋子,每個(gè)棋子上標(biāo)有1至8的某一數(shù)字,不同棋子上標(biāo)的數(shù)字不相同。棋盤上還有一個(gè)空格(以數(shù)字0來表示),與空格相鄰的棋子可以移到空格中。要求解決的問題是:給出一個(gè)初始狀態(tài)和一個(gè)目標(biāo)狀態(tài),找出一種從初始轉(zhuǎn)變成目標(biāo)狀態(tài)的移動(dòng)棋子步數(shù)最少的移動(dòng)步驟。所謂問題的一個(gè)狀態(tài)就是棋子在棋盤上的一種擺法。解八數(shù)碼問題實(shí)際上就是找出從初始狀態(tài)到達(dá)目標(biāo)狀態(tài)所經(jīng)過的一系列中間過渡狀態(tài)。2. 使用啟發(fā)式搜索算法求解8數(shù)碼問題。1) A ,A星算法采用估價(jià)函數(shù),其中:是搜索樹中結(jié)點(diǎn)的深度;為結(jié)點(diǎn)的數(shù)據(jù)庫中錯(cuò)放的棋子個(gè)數(shù);為結(jié)點(diǎn)的數(shù)據(jù)庫中每個(gè)棋子與其目標(biāo)位

2、置之間的距離總和。2) 寬度搜索采用f(i)為i的深度,深度搜索采用f(i)為i的深度的倒數(shù)。3. 算法流程 把起始節(jié)點(diǎn)S放到OPEN表中,并計(jì)算節(jié)點(diǎn)S的; 如果OPEN是空表,則失敗退出,無解; 從OPEN表中選擇一個(gè)值最小的節(jié)點(diǎn)。如果有幾個(gè)節(jié)點(diǎn)值相同,當(dāng)其中有一個(gè)為目標(biāo)節(jié)點(diǎn)時(shí),則選擇此目標(biāo)節(jié)點(diǎn);否則就選擇其中任一個(gè)節(jié)點(diǎn)作為節(jié)點(diǎn); 把節(jié)點(diǎn)從 OPEN 表中移出,并把它放入 CLOSED 的已擴(kuò)展節(jié)點(diǎn)表中; 如果是個(gè)目標(biāo)節(jié)點(diǎn),則成功退出,求得一個(gè)解; 擴(kuò)展節(jié)點(diǎn),生成其全部后繼節(jié)點(diǎn)。對(duì)于的每一個(gè)后繼節(jié)點(diǎn):計(jì)算;如果 既不在OPEN表中,又不在CLOCED表中,則用估價(jià)函數(shù)把它添入OPEN表中。從

3、加一指向其父節(jié)點(diǎn)的指針,以便一旦找到目標(biāo)節(jié)點(diǎn)時(shí)記住一個(gè)解答路徑;如果已在OPEN表或CLOSED表中,則比較剛剛對(duì)計(jì)算過的和前面計(jì)算過的該節(jié)點(diǎn)在表中的值。如果新的較小,則(I)以此新值取代舊值。(II)從指向,而不是指向他的父節(jié)點(diǎn)。(III)如果節(jié)點(diǎn)在CLOSED表中,則把它移回OPEN表中。 轉(zhuǎn)向,即GOTO。4. 估價(jià)函數(shù)計(jì)算一個(gè)節(jié)點(diǎn)的估價(jià)函數(shù),可以分成兩個(gè)部分:1、 已經(jīng)付出的代價(jià)(起始節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn));2、 將要付出的代價(jià)(當(dāng)前節(jié)點(diǎn)到目標(biāo)節(jié)點(diǎn))。節(jié)點(diǎn)n的估價(jià)函數(shù)定義為從初始節(jié)點(diǎn)、經(jīng)過n、到達(dá)目標(biāo)節(jié)點(diǎn)的路徑的最小代價(jià)的估計(jì)值,即 = + 。是從初始節(jié)點(diǎn)到達(dá)當(dāng)前節(jié)點(diǎn)n的實(shí)際代價(jià); 是從節(jié)點(diǎn)

4、n到目標(biāo)節(jié)點(diǎn)的最佳路徑的估計(jì)代價(jià),體現(xiàn)出搜索過程中采用的啟發(fā)式信息(背景知識(shí)),稱之為啟發(fā)函數(shù)。所占的比重越大,越趨向于寬度優(yōu)先或等代價(jià)搜索;反之,的比重越大,表示啟發(fā)性能就越強(qiáng)。5. 實(shí)驗(yàn)代碼為方便起見,目標(biāo)棋局為不變(1)以下代碼估價(jià)函數(shù)為深度+錯(cuò)放棋子個(gè)數(shù)(2) 若估價(jià)函數(shù)為深度+每個(gè)棋子與其目標(biāo)位置之間的距離總和,則加入估價(jià)函數(shù)int calvalue1(int a) /不在位棋子數(shù)int c = 0; int b=0;for (int i = 0;i = 8;i+)for (int j = 0;j jiedian.f = depth; (4) 深度搜索采用OPEN-jiedian.f

5、 = -depth;源代碼:1. #include stdio.h 2.3. int goal9 = 1,2,3,8,0,4,7,6,5 , sgoal9;/goal為棋盤的目標(biāo)布局,并用中間狀態(tài)sgoal與之比較4.5. struct Board6. 7. int shuzu9;8. int d, f, e;/d:深度;f:啟發(fā)函數(shù);e:記錄前一次的擴(kuò)展節(jié)點(diǎn)9. ;10.11. struct NodeLink12. 13. Board jiedian;14. NodeLink *parent;15. NodeLink *previous;16. NodeLink *next;17. Node

6、Link *path;18. ;19. /更新紀(jì)錄八數(shù)碼的狀態(tài)20. void setboard(int a, int b, int flag) /flag=0,寫棋子;flag=1,寫棋盤21. 22. for (int i = 0;i = 8;i+)23. if (flag)24. abi = i;25. else26. bai = i;27. 28. /計(jì)算啟發(fā)值的函數(shù)29. int calvalue(int a) /不在位棋子數(shù)30. 31. int c = 0;32. for (int i = 0;i = 8;i+)33. if (ai != goali)34. if (goali

7、!= 0)35. c+;36. return c;37. 38. /生成一個(gè)新節(jié)點(diǎn)的函數(shù)39. NodeLink *newnode(NodeLink *TEM, int depth, int flag)40. 41. NodeLink *temp = new NodeLink;42. for (int i = 0;i jiedian.shuzui = TEM-jiedian.shuzui;44. switch (flag)45. 46. case 1:47. 48. temp-jiedian.shuzu0-;49. temp-jiedian.shuzusgoaltemp-jiedian.shu

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

9、iedian.shuzusgoaltemp-jiedian.shuzu0 -= 3; /向下移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. /把新節(jié)點(diǎn)加入OPEN隊(duì)列79. NodeLink *addnode(

10、NodeLink *head, NodeLink *node) /把node插入到head鏈中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. /求啟發(fā)值最小的結(jié)點(diǎn)92. NodeLink *minf(NodeLink *head)93. 94. NodeLink *min, *forward;95.

11、 min = head;96. forward = head;97. while (forward)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,

12、*TEM;114.115. printf(請(qǐng)輸入初始狀態(tài):n);116. for (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-previous = NULL;125. OPEN-parent = NULL;126.127. while (OPEN)128. 129. TEMP = minf(OPEN); /求具有最小啟發(fā)值的節(jié)點(diǎn)

13、130. setboard(sgoal, TEMP-jiedian.shuzu, 1); /寫棋盤131. if (!calvalue(sgoal)132. break;133. if (TEMP != OPEN) /如果不是第一個(gè)節(jié)點(diǎn)134. 135. TEMP-previous-next = TEMP-next;136. TEMP-next-previous = TEMP-previous;137. 138. else /是第一個(gè)節(jié)點(diǎn)139. 140. if (OPEN-next) /如果還有節(jié)點(diǎn)141. 142. OPEN = OPEN-next;143. OPEN-previous =

14、 NULL;144. 145. else OPEN = NULL; /否則置為空146. 147.148. if (TEMP-jiedian.shuzu0 - 1 = 0 & TEMP-jiedian.e != 2) /防止棋子回到原狀態(tài)149. OPEN = addnode(OPEN, newnode(TEMP, depth, 1);150. if (TEMP-jiedian.shuzu0 + 1 jiedian.e != 1)151. OPEN = addnode(OPEN, newnode(TEMP, depth, 2);152. if (TEMP-jiedian.shuzu0 - 3

15、= 0 & TEMP-jiedian.e != 4)153. OPEN = addnode(OPEN, newnode(TEMP, depth, 3);154. if (TEMP-jiedian.shuzu0 + 3 jiedian.e != 3)155. OPEN = addnode(OPEN, newnode(TEMP, depth, 4);156. depth+;157. 158.159. if (OPEN) /如有解,則打印出解的步驟160. 161. TEMP-path = NULL;162. while (TEMP-parent) /每次回溯父節(jié)點(diǎn),生成路徑163. 164. TE

16、MP-parent-path = TEMP;165. TEMP = TEMP-parent;166. 167. j = 0;168. while (TEMP-path)169. 170. setboard(sgoal, TEMP-jiedian.shuzu, 1);171. printf(第%d步:n, j);172. for (i = 0;i = 2;i+)173. printf( %d, sgoali);174. printf( n);175. for (i = 3;i = 5;i+)176. printf( %d, sgoali);177. printf(n);178. for (i =

17、 6;i path;182. j+;183. 184. setboard(sgoal, TEMP-jiedian.shuzu, 1);185. printf(第%d步:n, j);186. for (i = 0;i = 2;i+)187. printf( %d, sgoali);188. printf(n);189. for (i = 3;i = 5;i+)190. printf( %d, sgoali);191. printf(n);192. for (i = 6;i = 8;i+)193. printf( %d, sgoali);194. printf(n);195. 196. else197. printf(無法求解!);198. (1)以上代碼估價(jià)函數(shù)為深度+錯(cuò)放棋子個(gè)數(shù)(2) 若估價(jià)函數(shù)為深度+每個(gè)棋子與其目標(biāo)位置之間的距離總和,則函數(shù)改為int

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論