更新於 2024/12/02閱讀時間約 9 分鐘

[Python]AGV最佳路徑分析

 AGV最佳路徑分析(自動導引車最佳路徑分析)時,目的是讓 AGV(自動導引車)在工廠、倉庫或其他環境中,找到最短、最有效率且安全的路徑完成任務。


什麼是AGV?

AGV 是一種自動駕駛的小車,可以運送物品,類似於會自己走路的小機器人。比如在超市運送牛奶,或者在工廠裡搬運零件。


什麼是最佳路徑?

想像我們要去市場買菜,走最近的路能節省時間,但如果最近的路塞車,可能會選擇另一條更順暢的路。AGV 的「最佳路徑」也是一樣,它需要計算:

  1. 最短的路程:走的路最短。
  2. 最少的障礙物:避免碰到其他車或堵住的地方。
  3. 節省時間和電量:用最省力的方法完成工作。

怎麼計算最佳路徑?

AGV 會用一些「智慧」的方式來決定路徑,類似於導航軟體。這些方法包括:

  1. 地圖和感測器
    • AGV 會先知道整個環境的地圖(例如路線、障礙物)。
    • 用感測器檢查是否有其他車子或障礙。
  2. 演算法
    • Dijkstra 演算法:像我們用最快路徑算出從家裡到市場的方式。
    • A 演算法*:更聰明的計算,考慮時間和路線的優劣。
    • 動態調整:遇到意外時,例如路線被堵住,AGV 會重新選路。
  3. 多車協作
    • 如果有很多 AGV 一起工作,它們會「溝通」,避免彼此撞到,並分配不同的路徑。

我們可以利用 Python 實作一些經典的路徑搜尋演算法,比如 Dijkstra 演算法 和 A* 演算法,這些是 AGV 路徑規劃中常用的核心技術。

以下我會分別用這兩個演算法來說明如何實現,以及如何應用在簡單的地圖上。


Dijkstra 演算法實作

Dijkstra 是用來找到從一個起點到其他所有點的最短路徑的演算法,適合靜態地圖。

實作步驟

  1. 定義地圖:使用圖(Graph)表示地圖。
  2. 初始化距離:起點距離設為 0,其餘點設為無限大。
  3. 遍歷節點:逐步找出距離最短的節點,更新相鄰節點的距離。
  4. 結束條件:所有節點被訪問完成。

Dijkstra 演算法輸出

這段輸出是執行 Dijkstra 演算法 後的結果,表示從起點節點 A 出發,到達其他節點(BCD)的最短距離。

Shortest distances from node A: {'A': 0, 'B': 1, 'C': 3, 'D': 4}

輸出的含義

  • A: 0
    • 從 A 到自己的距離是 0,因為起點本身不需要移動。
  • B: 1
    • 從 A 到 B 的最短距離是 1。
    • 可能的路徑:直接從 A -> B,成本是 1(根據圖上的邊的權重)。
  • C: 3
    • 從 A 到 C 的最短距離是 3。
    • 可能的路徑:從 A -> B -> C,總成本是 1(A -> B) + 2(B -> C)= 3。注意,直接從 A -> C 的成本是 4(比 3 大),因此不選擇。
  • D: 4
    • 從 A 到 D 的最短距離是 4。
    • 可能的路徑:從 A -> B -> C -> D,總成本是 1(A -> B) + 2(B -> C) + 1(C -> D)= 4。同樣,直接從 A -> B -> D 的成本是 6(比 4 大),因此也不選擇。

如何解釋最短距離?

  1. 最短距離不是直接路徑,而是代價最低的路徑
    • 演算法會自動比較所有可能的路徑,選擇最小的累積距離。
  2. 步驟總結
    • 起點 A 距離初始化為 0,其餘節點距離為無限大。
    • 更新與 A 相鄰的節點距離(B = 1,C = 4)。
    • 確定 B 是下一個最短距離的節點,進一步更新相鄰節點(C = 3,D = 6)。
    • 繼續更新直到所有節點的最短距離被確定。

如何應用這些結果?

在 AGV 的情境中:

  • 如果起點是倉庫入口 A,需要搬運物品到目的地 D
    • AGV 會選擇路徑 A -> B -> C -> D,因為這條路徑的總距離是最短的(代價 4)。
  • 同樣地,如果要搬運到 B 或 C,系統會提供最短的距離和路徑,節省時間與能量。

這樣的分析可以幫助 AGV 在地圖上選擇高效的路徑完成任務!


*演算法實作

A* 是一種搜尋演算法,除了最短距離,還會考慮目標的估計距離(啟發式函數)。

實作步驟

  1. 定義地圖和啟發式函數
  2. 初始化開放節點(Open Set)和已訪問節點(Closed Set)
  3. 計算代價函數 f(n) = g(n) + h(n)
    • g(n):起點到當前節點的實際距離。
    • h(n):當前節點到目標的估計距離。
  4. 重複尋找最小代價路徑,直到找到目標或無法到達


*演算法輸出*

這段輸出是執行* 演算法 後的結果,表示從起點節點 A 出發,到達其他節點(BCD)的最短距離。

Shortest path using A* from A to D: ['A', 'B', 'C', 'D']

輸出的含義

  • ['A', 'B', 'C', 'D'] 是經過 A* 演算法計算後的 最佳路徑,其中:
    • A 是起點。
    • B 是從 A 出發後的下一個節點。
    • C 是從 B 到達的下一個節點。
    • D 是最終目標節點(終點)。

為什麼是這條路徑?

A* 演算法根據以下公式計算每個節點的總代價:

f(n)=g(n)+h(n)f(n)=g(n)+h(n)

  • f(n): 節點的總代價(用來排序的依據)。
  • g(n): 從起點 A 到當前節點的實際距離。
  • h(n): 從當前節點到目標節點 D 的 估計距離(由啟發式函數計算)。

A* 的目的是找到總代價最小的路徑。


步驟詳細解析

  1. 起點 A 的計算
    • g(A) = 0,因為是起點。
    • h(A) = 7(啟發式函數的值,表示從 A 到 D 的估計距離)。
    • f(A) = g(A) + h(A) = 0 + 7 = 7。
  2. 選擇相鄰節點 B 和 C
    選擇 C,因為 f(C) 最小。
    • 從 A 到 B:g(B) = g(A) + weight(A, B) = 0 + 1 = 1h(B) = 6(估計距離)。f(B) = g(B) + h(B) = 1 + 6 = 7。
    • 從 A 到 C:g(C) = g(A) + weight(A, C) = 0 + 4 = 4h(C) = 2(估計距離)。f(C) = g(C) + h(C) = 4 + 2 = 6。
  3. 探索 C 的相鄰節點
    • 從 C 到 D:g(D) = g(C) + weight(C, D) = 4 + 1 = 5h(D) = 1(估計距離)。f(D) = g(D) + h(D) = 5 + 1 = 6。
  4. 探索 B 的相鄰節點
    • 從 B 到 C:g(C) = g(B) + weight(B, C) = 1 + 2 = 3(比原來更短,因此更新)。
    • 從 B 到 D:g(D) = g(B) + weight(B, D) = 1 + 5 = 6(比目前的代價高,不更新)。
  5. 最終路徑 ['A', 'B', 'C', 'D']
    • 經過更新,選擇代價最低的路徑。

與 Dijkstra 演算法的區別

  1. Dijkstra 演算法
    • 僅考慮 g(n),即實際距離。
    • 不包含目標的估計距離,因此計算的範圍更大。
    • 結果是最短路徑,但效率相對較低。


  1. A* 演算法
    • 考慮了 g(n) 和 h(n),因此只探索目標附近的節點。
    • 計算效率更高,特別是在大範圍圖上效果更明顯。

應用場景

  • AGV 路徑規劃
    • 如果 AGV 需要從倉庫入口 A 搬運物品到工作站 D,A* 演算法會提供 最優路徑:A -> B -> C -> D,減少行駛距離和時間。
  • 遊戲中的導航
    • NPC(非玩家角色)可以使用 A* 找到從起始位置到目標點的最佳移動路徑。


其他相關文章


[Python] A*(A-Star) 演算法實作

[Python]Dijkstra 演算法實作

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.