a*演算法的核心是估值函式,通過估值函式來確定代價,永遠只保留經過同乙個點時代價最小的那條路徑。
如 :a b c
e fg 六個點 我們要由a到達 c,可有的路徑是 a-b-c、 a-e-f-b-c、a-e-b-c等 這幾個路徑都經過b,暫且把,每相鄰兩點的直接的代價都定為1,對角線的定為2,那麼上面三個路徑經過b的代價 分別是 1、3、3,由此我們可以只需存乙個較小值就可以了,因為這個代價無疑是最小的。我們途徑每乙個的節點時都預判下這個代價是不是當前最小的,是最小的記下來,不是就不管它,這就是a*演算法的精髓! 下面是**模擬實現,就不解釋了
//寫乙個自己實現的a*搜尋演算法 // #include "stdafx.h" #include #include #include #include #include using namespace std; const int nmapwidth = 8; const int nmapheight = 8; struct node ; }; std::mapm_openlist; std::mapm_closelist; std::vectorm_keylist; node m_mapnode[nmapwidth][nmapheight]; //計算openlist中靠前節點周圍的節點 void computerround(int curx,int cury); //將乙個新的節點加入到openlist中 void addnodetoopenlist(node* pnode,int nnum); //列印地圖 void print(node pnode[nmapheight]); void print(node pnode[nmapheight]) else else return; } else } else } } } //將openlist中的乙個靠前的節點展開到closelist中 void addnodetocloselist(node* pnode,int nnum) else else } else } else } } //探索是否該節點可行 void trynode(int nx,int ny,int curx, int cury) #define desx 3 #define desy 4 void computerround(int curx,int cury) void main() } print(m_mapnode); addnodetocloselist(&(m_mapnode[1][1]),0); std::map::iterator itr; while(!m_keylist.empty()) cout<::iterator itrc; for (int n = 0; n < nmapwidth; ++n) { for(int m = 0; m < nmapheight; ++m) { if (m == 0) cout<
啟發式與元啟發式演算法
啟發式演算法 heuristic algorigthm 是一種基於直觀或經驗構造的演算法,在可接受的花費 指計算時間 計算空間等 給出待解決優化問題的每一例項的乙個可行解,該可行解與與最優解的偏離程度一般不可以事先預計。啟發式演算法是一種技術,這種演算法可以在可接受的計算費用內找到最好的解,但不一定...
啟發式演算法和元啟發式演算法
是一種基於直觀或經驗構造的演算法,在可接受的花費 指計算時間 計算空間等 給出待解決優化問題的每一例項的乙個可行解,該可行解與與最優解的偏離程度一般不可以事先預計。啟發式演算法是一種技術,這種演算法可以在可接受的計算費用內找到最好的解,但不一定能保證所得到解的可行性及最優性,甚至大多數情況下無法闡述...
啟發式演算法與元啟發式演算法
相對與精確演算法提出的。是一種群體智慧型演算法。平衡區域性最優解與全域性最優解。啟發式演算法可以這樣定義 乙個基於直觀或經驗構造的演算法,在可接受的花費 指計算時間和空間 下給出待解決組合優化問題每乙個例項的乙個可行解,該可行解與最優解的偏離程度一般不能被預計。許多啟發式演算法是相當特殊的,依賴於某...