問(wèn)題描述
??該問(wèn)題來(lái)源于參加某知名外企的校招面試。根據(jù)面試官描述,一塊木板有數(shù)百個(gè)小孔(坐標(biāo)已知)稠通,現(xiàn)在需要通過(guò)機(jī)械臂在木板上鉆孔,要求對(duì)打孔路徑進(jìn)行規(guī)劃买猖,力求使打孔總路徑最短改橘,這對(duì)于提高機(jī)械臂打孔的生產(chǎn)效能、降低生產(chǎn)成本具有重要的意義玉控。
數(shù)學(xué)模型建立
問(wèn)題分析
??機(jī)械臂打孔生產(chǎn)效能主要取決于以下三個(gè)方面:
- 單個(gè)孔的鉆孔作業(yè)時(shí)間飞主,這是由生產(chǎn)工藝所決定的,不在優(yōu)化范圍內(nèi)高诺,本文假定對(duì)于同一孔型鉆孔的作業(yè)時(shí)間是相同的碌识。
- 打孔機(jī)在加工作業(yè)時(shí),鉆頭的行進(jìn)時(shí)間虱而。
- 針對(duì)不同孔型加工作業(yè)時(shí)間筏餐,刀具的轉(zhuǎn)換時(shí)間。
??在機(jī)械臂打孔生產(chǎn)效能的三個(gè)重要因素中牡拇,單孔作業(yè)時(shí)間因生產(chǎn)工藝無(wú)法優(yōu)化魁瞪,刀具切換時(shí)間因生產(chǎn)流程無(wú)法優(yōu)化穆律,所以可優(yōu)化的主要是機(jī)械臂行進(jìn)時(shí)間,這直接受到打孔路徑規(guī)劃的影響导俘,并與路徑長(zhǎng)度正相關(guān)峦耘,所以設(shè)計(jì)出合理的較短的打孔路徑,對(duì)于提高機(jī)械臂打孔的生成效能具有重要意義旅薄。
??打孔的路徑規(guī)劃問(wèn)題辅髓,可以轉(zhuǎn)換為旅行商問(wèn)題TSP(一個(gè)旅行商人要拜訪n個(gè)城市,他必須選擇所要走的路徑赋秀,路徑的限制是每個(gè)城市只能拜訪一次利朵,而且最后回到原來(lái)出發(fā)的城市)來(lái)分析求解律想。
??在實(shí)際應(yīng)用中猎莲,因?yàn)闄C(jī)械臂連續(xù)作業(yè),那么一塊木板打孔完畢后技即,機(jī)械臂是否回到起始點(diǎn)需要對(duì)TSP進(jìn)行改造著洼。
最佳規(guī)劃路徑
??采用0-1變量來(lái)確定規(guī)劃路徑上兩點(diǎn)的情況,即
??那么刀具行進(jìn)時(shí)間為
??其中而叼,n為所有的打孔數(shù)目身笤,(xi,xj)和(yi,yj) 為任意兩孔,v為刀具行進(jìn)的速度,假設(shè)兩點(diǎn)距離采用歐氏距離公式葵陵。
算法選型
??TSP問(wèn)題是非常典型的NP(Nondeterministic Polynomial)難問(wèn)題液荸,對(duì)于大規(guī)模的TSP問(wèn)題,目前沒(méi)有完美的解法脱篙,所有的智能算法只能在一定程度上近似逼近最優(yōu)結(jié)果娇钱。其中常用的算法有遺傳算法、模擬退火算法绊困、蟻群算法等文搂。
??由文獻(xiàn)可以得到,==蟻群算法適用于緩慢地精確的求解場(chǎng)合秤朗;模擬退火算法適用于快速較精確地求解煤蹭;遺傳算法適用于快速地求解,但是準(zhǔn)確度不高==取视。所以硝皂,本文在保證精確度的要求下,以蟻群算法為基礎(chǔ)作谭,探討打孔路徑規(guī)劃的問(wèn)題吧彪。
??蟻群算法(Ant Colony Algorithm,ACA)丢早,最初是由意大利學(xué)者Dorigo M.博士于1991年首次提出姨裸,其本質(zhì)是一個(gè)復(fù)雜的智能系統(tǒng)秧倾,且具有較強(qiáng)的魯棒性,優(yōu)良的分布式計(jì)算機(jī)制等優(yōu)點(diǎn)傀缩。該算法經(jīng)過(guò)十多年的發(fā)展那先,已被廣大的科學(xué)研究人員應(yīng)用于各種問(wèn)題的研究,如旅行商問(wèn)題赡艰,二次規(guī)劃問(wèn)題售淡,生產(chǎn)調(diào)度問(wèn)題等。
??針對(duì)多孔的全局路徑規(guī)劃問(wèn)題慷垮,改進(jìn)的蟻群算法可以描述為:
??信息素更新:為了避免殘留信息素過(guò)多引起殘留信息淹沒(méi)啟發(fā)信息揖闸,在每只螞蟻?zhàn)咄暌徊交蛘咄瓿蓪?duì)所有 n個(gè)任務(wù)點(diǎn)的遍歷后,要對(duì)殘留信息進(jìn)行更新處理料身。
算法設(shè)計(jì)
??結(jié)合實(shí)際應(yīng)用場(chǎng)景汤纸,本文主要在蟻群算法的基礎(chǔ)上,考慮傳統(tǒng)旅行商問(wèn)題芹血,不回起始點(diǎn)的遍歷路徑贮泞,融入高度信息的三維情形等三種情形考慮。
二維路徑計(jì)算
??考慮到機(jī)械臂的運(yùn)動(dòng)狀態(tài)幔烛,如機(jī)械臂可能任意角度的斜線啃擦,或者只可以走固定角度的路線(比如3D打印機(jī)),所以本文定義兩種計(jì)算兩點(diǎn)之間距離的方法饿悬。
- 曼哈頓距離:即兩點(diǎn)在南北方向上的距離加上在東西方向上的距離令蛉。
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)
??補(bǔ)充知識(shí):曼哈頓距離,歐式距離狡恬,明式距離珠叔,切比雪夫距離區(qū)別
三維路徑計(jì)算
??為適應(yīng)應(yīng)用場(chǎng)景的復(fù)雜性,本文簡(jiǎn)單討論在凹凸不平的木板上打孔的路徑規(guī)劃問(wèn)題傲宜,木板網(wǎng)格化后每一個(gè)網(wǎng)格的高度已知且不同运杭,那么設(shè)計(jì)可以不碰撞模板的安全路徑。
??針對(duì)多個(gè)3D任務(wù)孔函卒,首先設(shè)計(jì)啟發(fā)函數(shù)辆憔,利用A*算法得到單孔與單孔之間的無(wú)碰撞最短路徑作為兩點(diǎn)之間的路徑,然后應(yīng)用蟻群算法报嵌,得到遍歷所有孔的最短無(wú)碰撞路徑虱咧。
??三維多任務(wù)孔的路徑規(guī)劃可以抽象為網(wǎng)絡(luò)最短路徑問(wèn)題,從抽象的數(shù)學(xué)觀點(diǎn)來(lái)看锚国,網(wǎng)絡(luò)實(shí)質(zhì)上是一個(gè)有權(quán)值的有向圖腕巡,它由節(jié)點(diǎn)和連接這些節(jié)點(diǎn)的弧及其方向組成。如下圖所示血筑,在復(fù)雜任務(wù)應(yīng)用場(chǎng)景下绘沉,節(jié)點(diǎn)是指起始點(diǎn)煎楣、目標(biāo)點(diǎn)和任務(wù)點(diǎn),節(jié)點(diǎn)之間的弧是指節(jié)點(diǎn)之間的路徑车伞,兩點(diǎn)之間的路徑長(zhǎng)度可以作為弧的權(quán)值择懂,因?yàn)楣?jié)點(diǎn)與節(jié)點(diǎn)之間可以互相抵達(dá),方向是雙向的另玖,所以求多任務(wù)孔間的最短路徑就是在網(wǎng)絡(luò)圖中尋求航行代價(jià)和最小的路徑困曙。
求遍歷所有節(jié)點(diǎn)的最短路徑
??根據(jù)應(yīng)用場(chǎng)景,假設(shè)對(duì)多個(gè)木板執(zhí)行一樣的打孔操作谦去,那么當(dāng)對(duì)一塊模板完成任務(wù)后不需要再返回起始點(diǎn)慷丽,可以逆著規(guī)劃航路直接打孔,回到起始點(diǎn)后可以再完成下一木板的打孔操作鳄哭,提高應(yīng)用效率要糊。這種應(yīng)用情形和TSP問(wèn)題不一樣的地方是路徑不閉環(huán),最后不需要直接回到起始點(diǎn)窃诉。
??基本蟻群算法最早是用來(lái)求網(wǎng)絡(luò)中的最短回路的杨耙,因此可以通過(guò)增加一個(gè)連接網(wǎng)絡(luò)輸入節(jié)點(diǎn)與輸出節(jié)點(diǎn)的虛邊赤套,在搜索過(guò)程中規(guī)定必須經(jīng)過(guò)虛邊飘痛,變遍歷所有節(jié)點(diǎn)的最短路徑問(wèn)題為最短回路問(wèn)題。根據(jù)蟻群算法的搜索原理容握,設(shè)虛邊的權(quán)小于或等于網(wǎng)絡(luò)所有邊權(quán)的最小值即可符合上述要求宣脉。
??本文引入出發(fā)點(diǎn)和目標(biāo)點(diǎn)間的虛邊,在搜索過(guò)程中要求必須經(jīng)過(guò)虛邊剔氏,變遍歷所有節(jié)點(diǎn)的最短路徑問(wèn)題為最短回路問(wèn)題塑猖,設(shè)虛邊的權(quán)小于或等于網(wǎng)絡(luò)所有邊權(quán)的最小值。
算法實(shí)現(xiàn)流程
可行性分析
??為客觀地驗(yàn)證多任務(wù)孔的路徑規(guī)劃系統(tǒng)的有效性谈跛,評(píng)價(jià)路徑規(guī)劃系統(tǒng)中算法的性能和優(yōu)缺點(diǎn)羊苟,本文針對(duì)路徑規(guī)劃系統(tǒng)的環(huán)境模型、兩孔之間的路徑規(guī)劃和多任務(wù)孔間的路徑規(guī)劃算法進(jìn)行驗(yàn)證感憾。
??本文主要使用Python語(yǔ)言對(duì)算法進(jìn)行快速實(shí)現(xiàn)蜡励,Python語(yǔ)言開發(fā)效率優(yōu)于C++語(yǔ)言,可以快速實(shí)現(xiàn)和驗(yàn)證算法的優(yōu)缺點(diǎn)阻桅,但是Python是解釋型語(yǔ)言凉倚,運(yùn)行效率慢。C++語(yǔ)言一般是Python運(yùn)行效率的5~10倍嫂沉,所以Python語(yǔ)言的運(yùn)行時(shí)間除以5稽寒,一般不小于C++語(yǔ)言的實(shí)現(xiàn)時(shí)間。
傳統(tǒng)旅行商問(wèn)題仿真結(jié)果
遍歷所有節(jié)點(diǎn)的最短路徑仿真結(jié)果
3維的最短路徑仿真結(jié)果
??本文提供上述仿真的源代碼趟章,因?yàn)槟壳皩?shí)現(xiàn)的代碼是一種比較理想的場(chǎng)景杏糙,和實(shí)際應(yīng)用場(chǎng)景仍有比較大的差距慎王,希望提出建議,共同完善宏侍!附github上的源代碼
下一步優(yōu)化
??在路徑規(guī)劃問(wèn)題抽象模型基礎(chǔ)上柬祠,本文利用蟻群算法求解遍歷所有任務(wù)孔的最短路徑「河螅基本蟻群算法在處理該類問(wèn)題時(shí)會(huì)出現(xiàn)收斂速度慢且容易陷入局部最優(yōu)解的缺陷,下一步可以對(duì)信息素和信息素?fù)]發(fā)系數(shù)進(jìn)行了改進(jìn),采用一種動(dòng)態(tài)自適應(yīng)調(diào)整信息素和揮發(fā)因子的蟻群算法,以求在路徑規(guī)劃方面獲得更好的效果漫蛔。
??在“改進(jìn)的智能蟻群算法在TSP問(wèn)題中的應(yīng)用”文獻(xiàn)中,動(dòng)態(tài)自適應(yīng)調(diào)整信息素和揮發(fā)因子的策略可以描述為:傳統(tǒng)蟻群算法中旧蛾,往往會(huì)出現(xiàn)信息素分布過(guò)度集中在某一條路徑莽龟,使得大多數(shù)螞蟻僅通過(guò)此一條路徑,導(dǎo)致早熟的現(xiàn)象;或者是信息素分布過(guò)度分散到各個(gè)路徑中锨天,使得螞蟻搜索最優(yōu)路徑耗時(shí)相對(duì)較長(zhǎng)而減緩收斂速度毯盈。本文采用自適應(yīng)的信息素調(diào)節(jié)機(jī)制,使得信息素分布相對(duì)均勻病袄,從而使算法跳離局部最優(yōu)解搂赋。另外,信息素?fù)]發(fā)系數(shù)直接關(guān)系到蟻群算法的全局搜索能力及其收斂速度益缠,動(dòng)態(tài)調(diào)整它具有很明顯優(yōu)勢(shì)脑奠,不僅可以加快收斂速度,而且能夠提高搜索質(zhì)量幅慌。
??在三維路徑規(guī)劃中宋欺,點(diǎn)與點(diǎn)之間的最短路徑實(shí)現(xiàn)效率相對(duì)較低,可以優(yōu)化啟發(fā)式函數(shù)胰伍,采用C++語(yǔ)言實(shí)現(xiàn)齿诞,提高運(yùn)算速度。
??寫作不易骂租,若有幫助祷杈,感謝贊賞!