問題描述
該問題來源於參加某知名外企的校招面試。根據面試官描述,一塊木板有數百個小孔(坐標已知),現在需要通過機械臂在木板上鑽孔,要求對打孔路徑進行規划,力求使打孔總路徑最短,這對於提高機械臂打孔的生產效能、降低生產成本具有重要的意義。
數學模型建立
問題分析
機械臂打孔生產效能主要取決於以下三個方面:
- 單個孔的鑽孔作業時間,這是由生產工藝所決定的,不在優化范圍內,本文假定對於同一孔型鑽孔的作業時間是相同的。
- 打孔機在加工作業時,鑽頭的行進時間。
- 針對不同孔型加工作業時間,刀具的轉換時間。
在機械臂打孔生產效能的三個重要因素中,單孔作業時間因生產工藝無法優化,刀具切換時間因生產流程無法優化,所以可優化的主要是機械臂行進時間,這直接受到打孔路徑規划的影響,並與路徑長度正相關,所以設計出合理的較短的打孔路徑,對於提高機械臂打孔的生成效能具有重要意義。
打孔的路徑規划問題,可以轉換為旅行商問題TSP(一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最后回到原來出發的城市)來分析求解。
在實際應用中,因為機械臂連續作業,那么一塊木板打孔完畢后,機械臂是否回到起始點需要對TSP進行改造。
最佳規划路徑
采用0-1變量來確定規划路徑上兩點的情況,即
那么刀具行進時間為
其中,n為所有的打孔數目,(xi,xj)和(yi,yj) 為任意兩孔,v為刀具行進的速度,假設兩點距離采用歐氏距離公式。
算法選型
TSP問題是非常典型的NP(Nondeterministic Polynomial)難問題,對於大規模的TSP問題,目前沒有完美的解法,所有的智能算法只能在一定程度上近似逼近最優結果。其中常用的算法有遺傳算法、模擬退火算法、蟻群算法等。
由文獻可以得到,蟻群算法適用於緩慢地精確的求解場合;模擬退火算法適用於快速較精確地求解;遺傳算法適用於快速地求解,但是准確度不高。所以,本文在保證精確度的要求下,以蟻群算法為基礎,探討打孔路徑規划的問題。
蟻群算法(Ant Colony Algorithm,ACA),最初是由意大利學者Dorigo M.博士於1991年首次提出,其本質是一個復雜的智能系統,且具有較強的魯棒性,優良的分布式計算機制等優點。該算法經過十多年的發展,已被廣大的科學研究人員應用於各種問題的研究,如旅行商問題,二次規划問題,生產調度問題等。
針對多孔的全局路徑規划問題,改進的蟻群算法可以描述為:
信息素更新:為了避免殘留信息素過多引起殘留信息淹沒啟發信息,在每只螞蟻走完一步或者完成對所有 n個任務點的遍歷后,要對殘留信息進行更新處理。
算法設計
結合實際應用場景,本文主要在蟻群算法的基礎上,考慮傳統旅行商問題,不回起始點的遍歷路徑,融入高度信息的三維情形等三種情形考慮。
二維路徑計算
考慮到機械臂的運動狀態,如機械臂可能任意角度的斜線,或者只可以走固定角度的路線(比如3D打印機),所以本文定義兩種計算兩點之間距離的方法。
- 曼哈頓距離:即兩點在南北方向上的距離加上在東西方向上的距離。
H(n) = D * (abs(n.x – goal.x ) + abs(n.y – goal.y ) ) - 歐幾里得距離:
H(n) = D * sqrt((n.x-goal.x)^2 + (n.y-goal.y)^2)
三維路徑計算
為適應應用場景的復雜性,本文簡單討論在凹凸不平的木板上打孔的路徑規划問題,木板網格化后每一個網格的高度已知且不同,那么設計可以不碰撞模板的安全路徑。
針對多個3D任務孔,首先設計啟發函數,利用A*算法得到單孔與單孔之間的無碰撞最短路徑作為兩點之間的路徑,然后應用蟻群算法,得到遍歷所有孔的最短無碰撞路徑。
三維多任務孔的路徑規划可以抽象為網絡最短路徑問題,從抽象的數學觀點來看,網絡實質上是一個有權值的有向圖,它由節點和連接這些節點的弧及其方向組成。如下圖所示,在復雜任務應用場景下,節點是指起始點、目標點和任務點,節點之間的弧是指節點之間的路徑,兩點之間的路徑長度可以作為弧的權值,因為節點與節點之間可以互相抵達,方向是雙向的,所以求多任務孔間的最短路徑就是在網絡圖中尋求航行代價和最小的路徑。
求遍歷所有節點的最短路徑
根據應用場景,假設對多個木板執行一樣的打孔操作,那么當對一塊模板完成任務后不需要再返回起始點,可以逆着規划航路直接打孔,回到起始點后可以再完成下一木板的打孔操作,提高應用效率。這種應用情形和TSP問題不一樣的地方是路徑不閉環,最后不需要直接回到起始點。
基本蟻群算法最早是用來求網絡中的最短回路的,因此可以通過增加一個連接網絡輸入節點與輸出節點的虛邊,在搜索過程中規定必須經過虛邊,變遍歷所有節點的最短路徑問題為最短回路問題。根據蟻群算法的搜索原理,設虛邊的權小於或等於網絡所有邊權的最小值即可符合上述要求。
本文引入出發點和目標點間的虛邊,在搜索過程中要求必須經過虛邊,變遍歷所有節點的最短路徑問題為最短回路問題,設虛邊的權小於或等於網絡所有邊權的最小值。
算法實現流程
可行性分析
為客觀地驗證多任務孔的路徑規划系統的有效性,評價路徑規划系統中算法的性能和優缺點,本文針對路徑規划系統的環境模型、兩孔之間的路徑規划和多任務孔間的路徑規划算法進行驗證。
本文主要使用Python語言對算法進行快速實現,Python語言開發效率優於C++語言,可以快速實現和驗證算法的優缺點,但是Python是解釋型語言,運行效率慢。C++語言一般是Python運行效率的5~10倍,所以Python語言的運行時間除以5,一般不小於C++語言的實現時間。
傳統旅行商問題仿真結果
遍歷所有節點的最短路徑仿真結果
3維的最短路徑仿真結果
本文提供上述仿真的源代碼,因為目前實現的代碼是一種比較理想的場景,和實際應用場景仍有比較大的差距,希望提出建議,共同完善!附github上的源代碼
下一步優化
在路徑規划問題抽象模型基礎上,本文利用蟻群算法求解遍歷所有任務孔的最短路徑。基本蟻群算法在處理該類問題時會出現收斂速度慢且容易陷入局部最優解的缺陷,下一步可以對信息素和信息素揮發系數進行了改進,采用一種動態自適應調整信息素和揮發因子的蟻群算法,以求在路徑規划方面獲得更好的效果。
在“改進的智能蟻群算法在TSP問題中的應用”文獻中,動態自適應調整信息素和揮發因子的策略可以描述為:傳統蟻群算法中,往往會出現信息素分布過度集中在某一條路徑,使得大多數螞蟻僅通過此一條路徑,導致早熟的現象;或者是信息素分布過度分散到各個路徑中,使得螞蟻搜索最優路徑耗時相對較長而減緩收斂速度。本文采用自適應的信息素調節機制,使得信息素分布相對均勻,從而使算法跳離局部最優解。另外,信息素揮發系數直接關系到蟻群算法的全局搜索能力及其收斂速度,動態調整信息素揮發系數具有很明顯優勢,不僅可以加快收斂速度,而且能夠提高搜索質量。
在三維路徑規划中,點與點之間的最短路徑實現效率相對較低,可以優化啟發式函數,采用C++語言實現,提高運算速度。