




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上一、實驗內(nèi)容和要求八數(shù)碼問題:在33的方格棋盤上,擺放著1到8這八個數(shù)碼,有1個方格是空的,其初始狀態(tài)如圖1所示,要求對空格執(zhí)行空格左移、空格右移、空格上移和空格下移這四個操作使得棋盤從初始狀態(tài)到目標(biāo)狀態(tài)。例如:28312316484705765(a) 初始狀態(tài) (b) 目標(biāo)狀態(tài)圖1 八數(shù)碼問題示意圖請任選一種盲目搜索算法(廣度優(yōu)先搜索或深度優(yōu)先搜索)或任選一種啟發(fā)式搜索方法(全局擇優(yōu)搜索,加權(quán)狀態(tài)圖搜索,A 算法或 A* 算法)編程求解八數(shù)碼問題(初始狀態(tài)任選)。選擇一個初始狀態(tài),畫出搜索樹,填寫相應(yīng)的OPEN表和CLOSED表,給出解路徑,對實驗結(jié)果進行分析總結(jié),
2、得出結(jié)論。二、實驗?zāi)康?. 熟悉人工智能系統(tǒng)中的問題求解過程;2. 熟悉狀態(tài)空間的盲目搜索和啟發(fā)式搜索算法的應(yīng)用;3. 熟悉對八數(shù)碼問題的建模、求解及編程語言的應(yīng)用。三、實驗算法A*算法是一種常用的啟發(fā)式搜索算法。在A*算法中,一個結(jié)點位置的好壞用估價函數(shù)來對它進行評估。A*算法的估價函數(shù)可表示為: f(n) = g(n) + h(n) 這里,f(n)是估價函數(shù),g(n)是起點到終點的最短路徑值(也稱為最小耗費或最小代價),h(n)是n到目標(biāo)的最短路經(jīng)的啟發(fā)值。由于這個f(n)其實是無法預(yù)先知道的,所以實際上使用的是下面的估價函數(shù):f(n) = g(n) + h(n) 其中g(shù)(n)是從初始結(jié)點
3、到節(jié)點n的實際代價,h(n)是從結(jié)點n到目標(biāo)結(jié)點的最佳路徑的估計代價。在這里主要是h(n)體現(xiàn)了搜索的啟發(fā)信息,因為g(n)是已知的。用f(n)作為f(n)的近似,也就是用g(n)代替g(n),h(n)代替h(n)。這樣必須滿足兩個條件:(1)g(n)=g(n)(大多數(shù)情況下都是滿足的,可以不用考慮),且f必須保持單調(diào)遞增。(2)h必須小于等于實際的從當(dāng)前節(jié)點到達目標(biāo)節(jié)點的最小耗費h(n)=h(n)。第二點特別的重要??梢宰C明應(yīng)用這樣的估價函數(shù)是可以找到最短路徑的。3.A*算法的步驟A*算法基本上與廣度優(yōu)先算法相同,但是在擴展出一個結(jié)點后,要計算它的估價函數(shù),并根據(jù)估價函數(shù)對待擴展的結(jié)點排序,
4、從而保證每次擴展的結(jié)點都是估價函數(shù)最小的結(jié)點。A*算法的步驟如下:1)建立一個隊列,計算初始結(jié)點的估價函數(shù)f,并將初始結(jié)點入隊,設(shè)置隊列頭和尾指針。2)取出隊列頭(隊列頭指針?biāo)福┑慕Y(jié)點,如果該結(jié)點是目標(biāo)結(jié)點,則輸出路徑,程序結(jié)束。否則對結(jié)點進行擴展。 3)檢查擴展出的新結(jié)點是否與隊列中的結(jié)點重復(fù),若與不能再擴展的結(jié)點重復(fù)(位于隊列頭指針之前),則將它拋棄;若新結(jié)點與待擴展的結(jié)點重復(fù)(位于隊列頭指針之后),則比較兩個結(jié)點的估價函數(shù)中g(shù)的大小,保留較小g值的結(jié)點。跳至第五步。4)如果擴展出的新結(jié)點與隊列中的結(jié)點不重復(fù),則按照它的估價函數(shù)f大小將它插入隊列中的頭結(jié)點后待擴展結(jié)點的適當(dāng)位置,使它們按
5、從小到大的順序排列,最后更新隊列尾指針。5)如果隊列頭的結(jié)點還可以擴展,直接返回第二步。否則將隊列頭指針指向下一結(jié)點,再返回第二步。四、程序框圖五、實驗結(jié)果及分析輸入初始狀態(tài):2 8 3目標(biāo)狀態(tài):1 2 31 6 48 0 47 0 57 6 5運行結(jié)果屏幕打印OPEN表與CLOSE表:OPENCLOSE1 2 3 4 02 3 4 5 60 12 3 4 6 70 1 52 3 4 6 8 90 1 5 72 3 4 8 9 100 1 5 7 62 3 4 8 11 12 13 0 1 5 7 6 92 3 4 8 12 13 14 150 1 5 7 6 9 113 4 8 12 13
6、14 15 16 170 1 5 7 6 9 11 24 8 12 13 14 15 16 17 18 190 1 5 7 6 9 11 2 34 8 12 13 14 15 16 17 19 200 1 5 7 6 9 11 2 3 188 12 13 14 15 16 17 19 21 220 1 5 7 6 9 11 2 3 18 412 13 14 15 16 17 19 21 22 230 1 5 7 6 9 11 2 3 18 4 812 13 14 15 16 17 19 21 22 24 250 1 5 7 6 9 11 2 3 18 4 8 2312 13 14 15 16
7、17 19 21 22 24 260 1 5 7 6 9 11 2 3 18 4 8 23 24發(fā)現(xiàn)26為目標(biāo)節(jié)點072 8 31 0 47 6 5搜索樹:2.112 8 31 6 47 0 5172 0 31 8 47 6 54.112 8 31 4 07 6 53.112 8 30 1 47 6 522.142 8 31 4 57 6 019.122 8 37 1 40 6 521.122 8 31 4 37 6 518.100 8 32 1 47 6 511.142 8 31 6 47 5 010.142 8 31 6 47 0 5692 3 01 8 47 6 5580 2 31 8
8、47 6 5791 2 30 8 47 6 510.112 3 41 8 07 6 520.118 0 32 1 47 6 5注釋:每個方格中最上面兩個數(shù)字分別為編號與啟發(fā)值,下面九個數(shù)字為八數(shù)碼。較粗的箭頭為解路徑8.121 2 37 8 40 6 59.101 2 38 0 47 6 511.91 0 38 2 47 6 523.91 2 37 8 46 0 513.131 2 38 4 07 6 512.131 2 38 6 47 0 524.81 2 37 0 46 8 525.121 2 37 8 46 5 014.120 1 38 2 47 6 515.143 1 08 2 47
9、6 5目標(biāo)節(jié)點六、結(jié)論對于八數(shù)碼問題,BFS算法最慢,A*算法較快。八數(shù)碼問題的一個狀態(tài)實際上是09的一個排列,對于任意給定的初始狀態(tài)和目標(biāo),不一定有解,也就是說從初始狀態(tài)不一定能到達目標(biāo)狀態(tài)。因為排列有奇排列和偶排列兩類,從奇排列不能轉(zhuǎn)化成偶排列。如果一個數(shù)字08的隨機排列,用F(X)表示數(shù)字X前面比它小的數(shù)的個數(shù),全部數(shù)字的F(X)之和為Y=(F(X),如果Y為奇數(shù)則稱原數(shù)字的排列是奇排列,如果Y為偶數(shù)則稱原數(shù)字的排列是偶排列。因此,可以在運行程序前檢查初始狀態(tài)和目標(biāo)狀態(tài)的排序的奇偶行是否相同,相同則問題可解,應(yīng)當(dāng)能搜索到路徑。否則無解。七、源程序及注釋#include #include
10、#include using namespace std;const int ROW = 3;const int COL = 3;const int MAXDISTANCE = 10000;const int MAXNUM = 10000;int abs(int a)if (a0) return a;else return -a;typedef struct _Nodeint digitROWCOL;int dist; / 距離 int dep; / 深度 int index; / 索引值 Node;Node src, dest;vector node_v; / 儲存節(jié)點 bool isEmp
11、tyOfOPEN() /判斷Open表是否空 for (int i = 0; i node_v.size(); i+) if (node_vi.dist != MAXNUM) return false;return true;bool isEqual(int index, int digitCOL) /判斷節(jié)點是否與索引值指向的節(jié)點相同 for (int i = 0; i ROW; i+) for (int j = 0; j COL; j+) if (node_vindex.digitij != digitij) return false; return true;ostream& opera
12、tor(ostream& os, Node& node) for (int i = 0; i ROW; i+) for (int j = 0; j COL; j+) os node.digitij ; os endl;return os;void PrintSteps(int index, vector& rstep_v) /輸出步驟 rstep_v.push_back(node_vindex);index = node_vindex.index;while (index != 0) rstep_v.push_back(node_vindex); index = node_vindex.ind
13、ex;for (int i = rstep_v.size() - 1; i = 0; i-) cout Step rstep_v.size() - i endl rstep_vi endl;void Swap(int& a, int& b) /交換 int t;t = a;a = b;b = t;void Assign(Node& node, int index) /獲取節(jié)點 for (int i = 0; i ROW; i+) for (int j = 0; j COL; j+) node.digitij = node_vindex.digitij;int GetMinNode() /獲取啟
14、發(fā)值最小的節(jié)點 int dist = MAXNUM;int loc; / the location of minimize nodefor (int i = 0; i node_v.size(); i+) if (node_vi.dist = MAXNUM) continue; else if (node_vi.dist + node_vi.dep) dist) loc = i; dist = node_vi.dist + node_vi.dep; return loc;bool isExpandable(Node& node) /判斷是否可擴展 for (int i = 0; i node_
15、v.size(); i+) if (isEqual(i, node.digit) return false;return true;int Distance(Node& node, int digitCOL) /計算距離 int distance = 0;bool flag = false;for(int i = 0; i ROW; i+) for (int j = 0; j COL; j+) for (int k = 0; k ROW; k+) for (int l = 0; l COL; l+) if (node.digitij = digitkl) distance += abs(i -
16、 k) + abs(j - l); flag = true; break; else flag = false; if (flag) break; return distance;int MinDistance(int a, int b) /二者取小 return (a b ? a : b);void ProcessNode(int index) /展開節(jié)點 int x, y;bool flag;for (int i = 0; i ROW; i+) for (int j = 0; j 0) Swap(node_up.digitxy, node_up.digitx - 1y); if (isEx
17、pandable(node_up) dist_up = Distance(node_up, dest.digit); node_up.index = index; node_up.dist = dist_up; node_up.dep = node_vindex.dep + 1; node_v.push_back(node_up); Node node_down; /下移操作Assign(node_down, index);int dist_down = MAXDISTANCE;if (x 0) Swap(node_left.digitxy, node_left.digitxy - 1); i
18、f (isExpandable(node_left) dist_left = Distance(node_left, dest.digit); node_left.index = index; node_left.dist = dist_left; node_left.dep = node_vindex.dep + 1; node_v.push_back(node_left); Node node_right; /右移操作Assign(node_right, index);int dist_right = MAXDISTANCE;if (y 2) Swap(node_right.digitxy, node_right.digitxy + 1); if (isExpandable(node_right) dist_right = Distance(node_right, dest.digit); node_right.index = index; node_right.dist = dist_right; node_right.dep = node_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 粉色建設(shè)工程安全生產(chǎn)考核培訓(xùn)演示模板
- 信用評估模型在不同行業(yè)應(yīng)用比較-洞察闡釋
- 逃離都市計劃代號
- 石黑一雄《遠山淡影》中的不可靠敘述研究
- 2024年深圳市深汕特別合作區(qū)農(nóng)村工作者招聘真題
- 2024年合肥新鑫幼兒教育有限公司所屬幼兒園招聘真題
- 河南職業(yè)技術(shù)學(xué)院《水文地質(zhì)及工程地質(zhì)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古藝術(shù)學(xué)院《光通信傳輸網(wǎng)絡(luò)實訓(xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 南京審計大學(xué)《地方民歌學(xué)唱》2023-2024學(xué)年第二學(xué)期期末試卷
- 青海警官職業(yè)學(xué)院《法醫(yī)學(xué)C》2023-2024學(xué)年第二學(xué)期期末試卷
- 父親節(jié)主題班會晨會課件
- 鐵路筆試試題題庫及答案
- 包蟲病測試試題及答案
- 地質(zhì)數(shù)據(jù)保密管理制度
- 中華民族共同體概論知到課后答案智慧樹章節(jié)測試答案2025年春麗水學(xué)院
- 【MOOC】樹木學(xué)-北京林業(yè)大學(xué) 中國大學(xué)慕課MOOC答案
- 國開《農(nóng)村社會學(xué)》形考作業(yè)1-4參考答案
- 2024年浙江省中考社會試卷真題(含標(biāo)準答案及評分標(biāo)準)
- 籃球《原地單手肩上投籃》教案
- 實驗室生物安全記錄.doc
- 中國金礦地理分布
評論
0/150
提交評論