--- title: 【軟體】經典導航算法 tags: TTennis Pickup Robot disqus: hackmd --- <h1 style="text-align: center; color: orange;"> 🛠️ 【軟體】經典導航算法 🛠️ </h1> <h2 style="text-align: center; color: skyblue;"> 前言 </h2> <center> 機器導航是在一地圖上進行的連續控制行為, 地圖和目的地都可能是未知的. 導航算法的目標, 是讓機器既快又優雅地走到目標. 關於地圖, 高精度的 dense map 可能會採用隨機灑點的算法策略. 精度較低的場景, 可以直接將地圖切分為一定精度的 grid map. 總之不同 scenario 下有其適應的導航算法, 也有很多可優化的面向. </center> </br> <h2 style="text-align: center; color: skyblue;"> Dijkstra's vs. Best-First-Search</h2> <center> 場景:網格地圖、地圖已知、目的地已知 Dijkstra's 其實就是導航場景下的廣度優先搜尋(BFS). 速度慢但一定是最佳路徑解. Best-First-Search 顧名思義就是先走當下代價 $g(v)$ 最低的路徑, 是種貪心策略. 它不會去回頭考慮沒走到的路徑, 是否會比當前有更高的期望值. 此算法求解速度快, 但經常不是最佳解. 所謂代價, 可以是移動到該點的路徑長, 或是該點與目標的距離等. 所謂 greedy policy, 意指貪心地只考慮當下最優解的算法. 但會忽略先苦後甘且整體代價更小的路徑解. 另個名詞是 heuristic(啟發式的): 意指有使用經驗法則的演算法. 任意導航算法中如果有考慮**節點與目標點的距離函數**, 是歐式距離、曼哈頓距離還是其他啟發函數 $h(v)$ 才是最有效率的, 取決於場景跑圖經驗, 沒有標準答案, 我們會稱作是 heuristic 的. Dijkstra's 就是一套制式標準的走法, 並不是 heuristic 的. </center> <h2 style="text-align: center; color: skyblue;"> A* algorithm</h2> <center> A* algorithm = Dijkstra's + Best-First-Search A* 每次迭代, 會像 BFS 展開當前節點能行走到的點, 並考慮 spanning tree 中所有末節點的 $h(v)$+$g(v)$ 最低的走. **在啟發函數定合適下, A* 會盡可能快地找到最優路徑.** 也就是說, A* 每走下步都會回頭考慮所有路徑可能性, 並搭配啟發函數合理地往正確方向移動或止損. 不會像 greedy policy 一定要撞牆才反悔, 但又不像 BFS 那樣純暴力展開. </center>