a*啟發式搜尋
#include
"iostream"
#include
"stdlib.h"
#include
"conio.h"
#include
#include
#define size 3
using
namespace std;
//定義二維陣列來儲存資料表示某乙個特定狀態
typedef
int status[size]
[size]
;//地圖
struct springlink;
clock_t start,end;
//定義狀態圖中的結點資料結構
typedef
struct node
nnode ,
*pnode;
//定義儲存指向結點後繼結點的指標的位址
typedef
struct springlink
splink ,
*psplink;
pnode open;
pnode closed;
//開始狀態與目標狀態
status startt =
; status target =
;//初始化乙個空鍊錶
void
initlink
(pnode &head)
//判斷鍊錶是否為空
bool
isempty
(pnode head)
//從鍊錶中拿出乙個資料
void
popnode
(pnode &head , pnode &fnode)
fnode = head-
>next;
head-
>next = head-
>next-
>next;
fnode-
>next =
null;}
//向結點的最終後繼結點鍊錶中新增新的子結點
void
addspringnode
(pnode &head , pnode newdata)
//釋放狀態圖中存放結點後繼結點位址的空間
void
freespringlink
(psplink &head)
}//釋放open表與closed表中的資源
void
freelink
(pnode &head)
}//向普通鍊錶中新增乙個結點
void
addnode
(pnode &head , pnode &newnode)
//向非遞減排列的鍊錶中新增乙個結點
void
addascnode
(pnode &head , pnode &newnode)
//上面判斷好位置之後,下面就是簡單的插入了
newnode-
>next = q-
>next;
q->next = newnode;
}//計算結點的h值
intcomputehvalue
(pnode thenode)}}
num = num+
abs(i-a)
+abs
(j-b);}
}return num;
}//計算結點的f,g,h值
void
computeallvalue
(pnode &thenode , pnode parentnode)
//初始化函式,進行演算法初始條件的設定
void
initial()
} start-
>parent =
null
; start-
>child =
null
; start-
>next =
null
;computeallvalue
(start , nullnode)
;//起始結點進入open表
addascnode
(open , start)
;// 按照f值插入
}//將b節點的狀態賦值給a結點
void
statusaeb
(pnode &anode , pnode bnode)}}
//兩個結點是否有相同的狀態
bool
hassamestatus
(pnode anode , pnode bnode)
}return
true;}
//結點與其祖先結點是否有相同的狀態
bool
hasancesamestatus
(pnode originode , pnode ancenode)
return
false;}
//取得方格中空的格仔的位置
void
getposition
(pnode thenode ,
int&row ,
int&col)}}
}//交換兩個數字的值
void
changeab
(int
&a ,
int&b)
//檢查相應的狀態是否在某乙個鍊錶中
bool
inlink
(pnode spcinode , pnode thelink , pnode &thenodelink , pnode &prenode)
prenode = thelink;
thelink = thelink-
>next;
}return
false;}
//產生結點的後繼結點(與祖先狀態不同)鍊錶
void
springlink
(pnode thenode , pnode &spring)
else
}//空的格仔左邊的格仔向右移動
if(col !=0)
else
}//空的格仔上邊的格仔向下移動
if(row !=0)
else
}//空的格仔下邊的格仔向上移動
if(row !=2)
else}}
//輸出給定結點的狀態
void
outputstatus
(pnode stat)
cout << endl;}}
//輸出最佳的路徑
void
outputbestroad
(pnode goal)
cout <<
"第"<< deepnum--
<<
"層的狀態:"
<< endl;
outputstatus
(goal);}
void
astar()
//產生當前檢測結點的後繼(與祖先不同)結點列表,產生的後繼結點的parent屬性指向當前檢測的結點
springlink
(tmpnode , spring)
;//遍歷檢測結點的後繼結點鍊錶
while(!
isempty
(spring)
)free
(tmplnode);}
//狀態在closed表中已經存在
elseif(
inlink
(tmplnode , closed , tmpchartnode , theprenode)
)free
(tmplnode);}
//新的狀態即此狀態既不在open表中也不在closed表中
else
}}
end=
clock()
;double endtime=
(double
)(end-start)
/clocks_per_sec;
cout<<
"total time:"
<1000
<<
"ms"
/ms為單位
//目標可達的話,輸出最佳的路徑
if(getgoal)
//釋放結點所佔的記憶體
freelink
(open)
;freelink
(closed);}
intmain()
八數碼問題 啟發式搜尋
一 問題描述 在乙個3 3 的方棋盤上放置著 1,2,3,4,5,6,7,8 八個數碼 每個數碼佔一格 且有乙個空格。這些數碼可以在棋盤上移動,其移動規則是 與空格相鄰的數碼方格可以移入空格。現在的問題是 對於指定的初始棋局和目標棋局,給出數碼的移動序列。該問題稱八數碼難題或者重排九宮問題。原始碼 ...
八數碼問題 啟發式搜尋
我們在搜尋的時候往往會發現一些資料會導致我們的普通的深搜與廣搜都無法通過,那這個時候我們就需要讓起點與終點建立一些聯絡,今天我們講述的啟發式搜尋就是在廣度優先搜尋的基礎上加了這樣乙個優化,叫做估價函式。對於乙個狀態,在我們知道終點狀態的時候,我們可以設計乙個估價函式使我們對這個狀態距離終點的距離有個...
八數碼問題 python實現 A 啟發式搜尋
class board object def init self self.groud 1,0,2,3,4,5,6,7,8 棋盤,0代表空 self.groud 7 2,4 5,0 6,8 3,1 移動的路徑 self.route def lt self,other return self.prio...