一. 演算法步驟:
1. 初始化圖,openlist,closedlist
2. 將起點加入openlist,
3. 在openlist中尋找啟發函式值f=g+h最小的節點v,
4. 將v從openlist中刪除,
5. 將從openlist中刪除的節點v加入closedlist
6. 對於節點v周圍的8個節點v1而言:
如果v1是障礙物或者已經處於closedlist中了,則不做任何處理
如果v1不在openlist中則將v1加入openlist中
如果v1已經在openlist中,則比較v1經過v到達起點的代價g1是否比之前的代價g0要小,如果g1大於g0,不做任何處理,如果g17. 如果終點goal也位於openlist中,說明路徑已經找到,否則返回步驟3進行迴圈
8. 如果openlist為空,終點還沒有找到,則說明路徑不存在
9. 最後從終點gaol通過其父節點回溯,尋找起點到終點的路徑。
二. 演算法實現
用c++實現a*, 其中包含兩個物件,節點物件,及a*路徑搜尋物件。
節點類可以如下定義:
1. astarnode:
#includeclass astarnode
void cal_f()
void cal_g(astarnode* cur_point)
void cal_h( astarnode* end) // 曼哈頓距離
};
2. a*路徑搜尋類astar如下定義:
#include#include"astarnode.h"
#include"minheap.h"
class astar
;
#include"astar.h"
astar::astar():openlist, closedlist()
,,,, }; }
astar::astar(std::vector < std::vector> &maz, int capacity) :openlist
bool astar::isinclosedlist(std::vector&closedlist1, int x, int y)
}}
int ine= openlist.isinheap(end.x, end.y);
if (ine)
return &openlist.date[ine];
} return null;
}bool astar::isobstacle(int x,int y)
int astar::cal_g(astarnode* cur_point, astarnode* sur_point)
void astar::getpath(astarnode *end)
}void astar::printpath()
int size_y = map.size();
int size_x= map[0].size();
std::cout << "a*搜尋結果" << std::endl;
for (int i = 0; i < size_y; i++)
}
3. 主函式
#include#include"astar.h"
int main()
,,,, };
int size_y = map.size();
int size_x = map[0].size();
std::cout << size_x << " " << size_y << std::endl;
for(int i=0;ix = 0;
start->y = 3;
start->parent = null;
start->f = 0;
start->g = 0;
start->h = 0;
astarnode *end = new astarnode;
end->x = 5;
end->y = 4;
end->parent = null;
end->f = 0;
end->g = 0;
end->h = 0;
int cap = 100;
astar astar;
astarnode *endpoint=astar.findpath(*start, *end);
astar.getpath(endpoint);
astar.printpath();
return 0;
}
三. 參考文獻
1. a*,那個傳說中的演算法
2. 堪稱最好的a*演算法
3. a*尋路演算法c++簡單實現
C 實現簡單回文演算法
1.實現簡答回文演算法 編寫乙個程式,判斷乙個字串是否為 回文 回文串 字串字元從前往後與從後往前一致 中心對稱 2.回文演算法思路 通過回文字串的移位比較,檢查是否為回文。3.回文演算法實現 include stdafx.h include include using namespace std ...
Elgamal演算法 簡單C語言演算法實現
目錄 elgamal演算法實現 1.基本演算法 2.具體演算法 3.4.結果 快速冪演算法 pow mod a,b,p 計算a b mod p elgamal加密演算法 elgamal en m,pub,p,g,c1,c2 c1 g k mod p c2 m pub k mod p 其中k為任意整數...
C 雜湊查詢演算法簡單實現
示例 主要使用雜湊表的摺疊法,其實只要懂原理,其實都好辦這種 標頭檔案部分 include stdafx.h 雜湊結果 enum hash result type 構建類似map的結構體 不使用std自帶的方法 struct map class batch int m index 當前位置 map ...