最近在負責佈線的一些功能的優化 在大神(第二個鏈接的作者)的啓發知道下 知道了 AStar算法 如獲至寶
學習算法的主要連接爲: 極限定律 My Algorithm Space A*算法入門
已有的RCP根據AStar佈線的算法: RCP:gef智能尋路算法(A star)
以下是連接的部分內容和個人理解:
核心公式: f(最終路徑長度) = g(起點到x點的長度)+ h(x點到終點的估計長度)
開啓列表:將要被遍歷的點的集合
關閉列表:已經被遍歷的點的集合
理解: x點: 是正在遍歷 估值的點。 剛開始的時候 x點就是起點;然後以一定策略向終點靠近,x點就是過程中的點;當然最期望的是x點就是終點
g: 是可以明確計算出 並且要實時保持爲最短最優的(通過)
h: 核心是:越靠近終點 值越小
一般是曼哈頓方法方法(|x|+|y|),也可以算兩點間距離(如果不是切割成正方形)還有其他
雖然前方是大河 深淵但還得前進不是,等看到在想辦法
核心策略:
從開啓列表找出最小f的點 遍歷他周圍的點時的邏輯:
1. * 如果它不可通過或者已經在關閉列表中,略過它。
理解:爲了躲過障礙 並且 不回頭
2.* 如果它不在開啓列表中,把它添加進去。把當前格作爲這一格的父節點。記錄這一格的F,G,和H值。
理解:以當前點探索到的新地形 1,爲新地形標記測算並加到可探索集合中去(方便後續計算),2.記錄從何而來 (這點很重要 如果這個點是終點 你就可以從終點找回到起點 你懂的)
3.* 如果它已經在開啓列表中,用G值爲參考檢查新的路徑是否更好。更低的G值意味着更好的路徑。如果是這樣,就把這一格的父節點改成當前格,並且重新計算這一格的G和F值。如果你保持你的開啓列表按F值排序,改變之後你可能需要重新對開啓列表排序。
理解:1.優化G值 這個是明確的值(之前探索結果:A->B->C(權:20 ) 現在: 如果A->C(權:15) 自然要優化C地形 正名呀)
2.遍歷開啓列表F值最小的 (因爲這個點更可能是最優的方向 )
完整的邏輯如下:
1,把起始格添加到開啓列表。
2,重複如下的工作:
a) 尋找開啓列表中F值最低的格子。我們稱它爲當前格。
b) 把它切換到關閉列表。
c) 對相鄰的格中的每一個?
* 如果它不可通過或者已經在關閉列表中,略過它。反之如下。
* 如果它不在開啓列表中,把它添加進去。把當前格作爲這一格的父節點。記錄這一格的F,G,和H值。
* 如果它已經在開啓列表中,用G值爲參考檢查新的路徑是否更好。更低的G值意味着更好的路徑。如果是這樣,就把這一格的父節點改成當前格,並且重新計算這一格的G和F值。如果你保持你的開啓列表按F值排序,改變之後你可能需要重新對開啓列表排序。
d) 停止,當你
* 把目標格添加進了關閉列表(註解),這時候路徑被找到,或者
* 沒有找到目標格,開啓列表已經空了。這時候,路徑不存在。
3.保存路徑。從目標格開始,沿着每一格的父節點移動直到回到起始格。這就是你的路徑。