漫画:什么是A*寻路算法
轉(zhuǎn)載自??玻璃貓 程序員小灰
比如像這樣子:
第一步:把起點放入OpenList
第二步:找出OpenList中F值最小的方格,即唯一的方格Node(1,2)作為當(dāng)前方格,并把當(dāng)前格移出OpenList,放入CloseList。代表這個格子已到達并檢查過了。
第三步:找出當(dāng)前格上下左右所有可到達的格子,看它們是否在OpenList當(dāng)中。如果不在,加入OpenList,計算出相應(yīng)的G、H、F值,并把當(dāng)前格子作為它們的“父親節(jié)點”。
圖中,每個格子的左下方數(shù)字是G,右下方是H,左上方是F。
Round2 ~ 第一步:找出OpenList中F值最小的方格,即方格Node(2,2)作為當(dāng)前方格,并把當(dāng)前格移出OpenList,放入CloseList。代表這個格子已到達并檢查過了。
Round2 ~ 第二步:找出當(dāng)前格上下左右所有可到達的格子,看它們是否在OpenList當(dāng)中。如果不在,加入OpenList,計算出相應(yīng)的G、H、F值,并把當(dāng)前格子作為它們的“父親節(jié)點”。
為什么這一次OpenList只增加了兩個新格子呢?因為Node(3,2)是墻壁,自然不用考慮,而Node(1,2)在CloseList當(dāng)中,說明已經(jīng)檢查過了,也不用考慮。
Round3 ~ 第一步:找出OpenList中F值最小的方格。由于這時候多個方格的F值相等,任意選擇一個即可,比如Node(2,3)作為當(dāng)前方格,并把當(dāng)前格移出OpenList,放入CloseList。代表這個格子已到達并檢查過了。
Round3 ~ 第二步:找出當(dāng)前格上下左右所有可到達的格子,看它們是否在OpenList當(dāng)中。如果不在,加入OpenList,計算出相應(yīng)的G、H、F值,并把當(dāng)前格子作為它們的“父親節(jié)點”。
剩下的就是以前面的方式繼續(xù)迭代,直到OpenList中出現(xiàn)終點方格為止。這里就僅用圖片簡單描述了,方格中數(shù)字表示F值:
public?Node aStarSearch(Node start, Node end) {// 把起點加入 open list
openList.add(start);
//主循環(huán),每一輪檢查一個當(dāng)前方格節(jié)點
while?(openList.size() >?0) {
// 在OpenList中查找 F值最小的節(jié)點作為當(dāng)前方格節(jié)點
Node current = findMinNode();
// 當(dāng)前方格節(jié)點從open list中移除
openList.remove(current);
// 當(dāng)前方格節(jié)點進入 close list
closeList.add(current);
// 找到所有鄰近節(jié)點
List<Node> neighbors = findNeighbors(current);
for?(Node node : neighbors) {
if?(!openList.contains(node)) {
//鄰近節(jié)點不在OpenList中,標記父親、G、H、F,并放入OpenList
markAndInvolve(current, end, node);
}
}
//如果終點在OpenList中,直接返回終點格子
if?(find(openList, end) !=?null) {
return?find(openList, end);
}
}
//OpenList用盡,仍然找不到終點,說明終點不可到達,返回空
return null;
}
幾點說明:
1.這里對于A*尋路的描述做了很大的簡化。實際場景中可能會遇到斜向移動、特殊地形等等因素,有些時候需要對OpenList中的方格進行重新標記。
2.截圖中的小游戲可不是小灰開發(fā)的,而是一款經(jīng)典的老游戲,有哪位小伙伴玩過嗎?
總結(jié)
以上是生活随笔為你收集整理的漫画:什么是A*寻路算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络用语wdnm啥意思 网络用语wdnm
- 下一篇: 漫画:什么是布隆算法