蟻群算法是什么
蟻群算法是一種群智能算法,也是啟發(fā)式算法。基本原理來(lái)源于自然界螞蟻覓食的最短路徑原理。
(一)蟻群算法的由來(lái)
蟻群算法最早是由Marco Dorigo等人在1991年提出,他們?cè)谘芯啃滦退惴ǖ倪^(guò)程中,發(fā)現(xiàn)蟻群在尋找食物時(shí),通過(guò)分泌一種稱(chēng)為信息素的生物激素交流覓食信息從而能快速的找到目標(biāo),據(jù)此提出了基于信息正反饋原理的蟻群算法。
蟻群算法的基本思想來(lái)源于自然界螞蟻覓食的最短路徑原理,根據(jù)昆蟲(chóng)科學(xué)家的觀(guān)察,發(fā)現(xiàn)自然界的螞蟻雖然視覺(jué)不發(fā)達(dá),但它們可以在沒(méi)有任何提示的情況下找到從食物源到巢穴的最短路徑,并在周?chē)h(huán)境發(fā)生變化后,自適應(yīng)地搜索新的最佳路徑。
螞蟻在尋找食物源的時(shí)候,能在其走過(guò)的路徑上釋放一種叫信息素的激素,使一定范圍內(nèi)的其他螞蟻能夠察覺(jué)到。當(dāng)一些路徑上通過(guò)的螞蟻越來(lái)越多時(shí),信息素也就越來(lái)越多,螞蟻們選擇這條路徑的概率也就越高,結(jié)果導(dǎo)致這條路徑上的信息素又增多,螞蟻?zhàn)哌@條路的概率又增加,生生不息。這種選擇過(guò)程被稱(chēng)為螞蟻的自催化行為。對(duì)于單個(gè)螞蟻來(lái)說(shuō),它并沒(méi)有要尋找最短路徑,只是根據(jù)概率選擇;對(duì)于整個(gè)蟻群系統(tǒng)來(lái)說(shuō),它們卻達(dá)到了尋找到最優(yōu)路徑的客觀(guān)上的效果。這就是群體智能。
(二)蟻群算法能做什么
蟻群算法根據(jù)模擬螞蟻尋找食物的最短路徑行為來(lái)設(shè)計(jì)的仿生算法,因此一般而言,蟻群算法用來(lái)解決最短路徑問(wèn)題,并真的在旅行商問(wèn)題(TSP,一個(gè)尋找最短路徑的問(wèn)題)上取得了比較好的成效。目前,也已漸漸應(yīng)用到其他領(lǐng)域中去,在圖著色問(wèn)題、車(chē)輛調(diào)度問(wèn)題、集成電路設(shè)計(jì)、通訊網(wǎng)絡(luò)、數(shù)據(jù)聚類(lèi)分析等方面都有所應(yīng)用。
(三)蟻群算法的流程步驟
這里以TSP問(wèn)題為例,算法設(shè)計(jì)的流程如下:
步驟1:對(duì)相關(guān)參數(shù)進(jìn)行初始化,包括蟻群規(guī)模、信息素因子、啟發(fā)函數(shù)因子、信息素?fù)]發(fā)因子、信息素常數(shù)、最大迭代次數(shù)等,以及將數(shù)據(jù)讀入程序,并進(jìn)行預(yù)處理:比如將城市的坐標(biāo)信息轉(zhuǎn)換為城市間的距離矩陣。
步驟2:隨機(jī)將螞蟻放于不同出發(fā)點(diǎn),對(duì)每個(gè)螞蟻計(jì)算其下個(gè)訪(fǎng)問(wèn)城市,直到有螞蟻訪(fǎng)問(wèn)完所有城市。
步驟3:計(jì)算各螞蟻經(jīng)過(guò)的路徑長(zhǎng)度Lk,記錄當(dāng)前迭代次數(shù)最優(yōu)解,同時(shí)對(duì)路徑上的信息素濃度進(jìn)行更新。
步驟4:判斷是否達(dá)到最大迭代次數(shù),若否,返回步驟2;是,結(jié)束程序。
步驟5:輸出結(jié)果,并根據(jù)需要輸出尋優(yōu)過(guò)程中的相關(guān)指標(biāo),如運(yùn)行時(shí)間、收斂迭代次數(shù)等。
要用到的符號(hào)說(shuō)明:
?
初始時(shí)刻螞蟻被放在不同的城市,且各城市路徑上的信息素濃度為0。
由于蟻群算法涉及到的參數(shù)蠻多的,且這些參數(shù)的選擇對(duì)程序又都有一定的影響,所以選擇合適的參數(shù)組合很重要。蟻群算法有個(gè)特點(diǎn)就是在尋優(yōu)的過(guò)程中,帶有一定的隨機(jī)性,這種隨機(jī)性主要體現(xiàn)在出發(fā)點(diǎn)的選擇上。蟻群算法正是通過(guò)這個(gè)初始點(diǎn)的選擇將全局尋優(yōu)慢慢轉(zhuǎn)化為局部尋優(yōu)的。參數(shù)設(shè)定的關(guān)鍵就在于在“全局”和“局部”之間建立一個(gè)平衡點(diǎn)。
(四)蟻群算法的關(guān)鍵參數(shù)
在蟻群算法的發(fā)展中,關(guān)鍵參數(shù)的設(shè)定有一定的準(zhǔn)則,一般來(lái)講遵循以下幾條:
盡可能在全局上搜索最優(yōu)解,保證解的最優(yōu)性;
算法盡快收斂,以節(jié)省尋優(yōu)時(shí)間;
盡量反應(yīng)客觀(guān)存在的規(guī)律,以保證這類(lèi)仿生算法的真實(shí)性。
蟻群算法中主要有下面幾個(gè)參數(shù)需要設(shè)定:
(下面列的是一些書(shū)上的主要結(jié)論,實(shí)驗(yàn)過(guò)程就不舉例了,具體參考《MATLAB在數(shù)學(xué)建模中的應(yīng)用》)
螞蟻數(shù)量:
設(shè)M表示城市數(shù)量,m表示螞蟻數(shù)量。m的數(shù)量很重要,因?yàn)閙過(guò)大時(shí),會(huì)導(dǎo)致搜索過(guò)的路徑上信息素變化趨于平均,這樣就不好找出好的路徑了;m過(guò)小時(shí),易使未被搜索到的路徑信息素減小到0,這樣可能會(huì)出現(xiàn)早熟,沒(méi)找到全局最優(yōu)解。一般上,在時(shí)間等資源條件緊迫的情況下,螞蟻數(shù)設(shè)定為城市數(shù)的1.5倍較穩(wěn)妥。
信息素因子:
信息素因子反映了螞蟻在移動(dòng)過(guò)程中所積累的信息量在指導(dǎo)蟻群搜索中的相對(duì)重要程度,其值過(guò)大,螞蟻選擇以前走過(guò)的路徑概率大,搜索隨機(jī)性減弱;值過(guò)小,等同于貪婪算法,使搜索過(guò)早陷入局部最優(yōu)。實(shí)驗(yàn)發(fā)現(xiàn),信息素因子選擇[1,4]區(qū)間,性能較好。
啟發(fā)函數(shù)因子:
啟發(fā)函數(shù)因子反映了啟發(fā)式信息在指導(dǎo)蟻群搜索過(guò)程中的相對(duì)重要程度,其大小反映的是蟻群尋優(yōu)過(guò)程中先驗(yàn)性和確定性因素的作用強(qiáng)度。過(guò)大時(shí),雖然收斂速度會(huì)加快,但容易陷入局部最優(yōu);過(guò)小時(shí),容易陷入隨機(jī)搜索,找不到最優(yōu)解。實(shí)驗(yàn)研究發(fā)現(xiàn),當(dāng)啟發(fā)函數(shù)因子為[3,4.5]時(shí),綜合求解性能較好。
信息素?fù)]發(fā)因子:
信息素?fù)]發(fā)因子表示信息素的消失水平,它的大小直接關(guān)系到蟻群算法的全局搜索能力和收斂速度。實(shí)驗(yàn)發(fā)現(xiàn),當(dāng)屬于[0.2,0.5]時(shí),綜合性能較好。
信息素常數(shù):
這個(gè)參數(shù)為信息素強(qiáng)度,表示螞蟻循環(huán)一周時(shí)釋放在路徑上的信息素總量,其作用是為了充分利用有向圖上的全局信息反饋量,使算法在正反饋機(jī)制作用下以合理的演化速度搜索到全局最優(yōu)解。值越大,螞蟻在已遍歷路徑上的信息素積累越快,有助于快速收斂。實(shí)驗(yàn)發(fā)現(xiàn),當(dāng)值屬于[10,1000]時(shí),綜合性能較好。
最大迭代次數(shù):
最大迭代次數(shù)值過(guò)小,可能導(dǎo)致算法還沒(méi)收斂就已結(jié)束;過(guò)大則會(huì)導(dǎo)致資源浪費(fèi)。一般最大迭代次數(shù)可以取100到500次。一般來(lái)講,建議先取200,然后根據(jù)執(zhí)行程序查看算法收斂的軌跡來(lái)修改取值。
?
蟻群算法的優(yōu)勢(shì)在哪里?
圖論中很多問(wèn)題都是求某個(gè)規(guī)則下的最短路徑,但因?yàn)橐?guī)則不同,這些問(wèn)題也有著本質(zhì)上的不同,不能簡(jiǎn)單地都?xì)w于“最短路徑”問(wèn)題,某些問(wèn)題已有有效算法,有些問(wèn)題至今沒(méi)有有效算法。
Prime 算法和 Kruskal 算法都是用來(lái)求加權(quán)連通簡(jiǎn)單圖中權(quán)和最小的支撐樹(shù)(即最小樹(shù))的,Prime算法的時(shí)間復(fù)雜度為O(n^2) (n 為頂點(diǎn)數(shù)),Kruskal 算法的時(shí)間復(fù)雜度為 O(eln(e)) (e為邊數(shù)),這兩種算法都是多項(xiàng)式時(shí)間算法,也就是說(shuō),最小樹(shù)問(wèn)題已經(jīng)有了有效算法去求解,屬于P問(wèn)題。
Dijkstra 算法求解的是加權(quán)連通簡(jiǎn)單圖中一個(gè)頂點(diǎn)到其它每個(gè)頂點(diǎn)的具有最小權(quán)和的有向路,最簡(jiǎn)單版本的時(shí)間復(fù)雜度是O(n^2),也是多項(xiàng)式時(shí)間算法。
而蟻群算法是一種近似算法,它不是用來(lái)解決已存在精確有效算法的問(wèn)題的,而是用來(lái)解決至今沒(méi)有找到精確的有效算法的問(wèn)題的,比如旅行商問(wèn)題(TSP)。
旅行商問(wèn)題也可以說(shuō)是求“最短路徑”,但它是求一個(gè)完全圖的最小哈密頓圈,這個(gè)問(wèn)題至今未找到多項(xiàng)式時(shí)間算法,屬于NPC問(wèn)題,也就是說(shuō),當(dāng)問(wèn)題規(guī)模稍大一點(diǎn),現(xiàn)有的精確算法的運(yùn)算量就會(huì)急劇增加。
?
在上圖中,可以看到,當(dāng)問(wèn)題規(guī)模為10時(shí),復(fù)雜度為O(3.4n^3) 的算法運(yùn)行時(shí)間要0.0034s,復(fù)雜度為O(2^n) 的算法運(yùn)行時(shí)間要0.001s,此時(shí)相差還不大,但當(dāng)問(wèn)題規(guī)模增加到100時(shí),前者的運(yùn)行時(shí)間只是增加到了3.4s,而后者的運(yùn)行時(shí)間則增加到了4×10^16年!
因?yàn)閷?shí)際問(wèn)題的規(guī)模都比較大,100還是小數(shù)字,所以對(duì)一個(gè)問(wèn)題,都努力尋求多項(xiàng)式算法。但也有問(wèn)題目前還沒(méi)有找到多項(xiàng)式時(shí)間的精確算法,比如旅行商問(wèn)題,因此就產(chǎn)生了各種近似算法,以解的質(zhì)量來(lái)?yè)Q取效率,尋求滿(mǎn)意解而不是最優(yōu)解,蟻群算法就是其中一種。
所以,針對(duì)本問(wèn)題的提法,蟻群算法和Prime 算法或Kruskal 算法等是兩個(gè)不同層面上的算法,基本沒(méi)有比較的必要,但可以做辨析:
1、Prime 算法,Kruskal 算法,Dijkstra 算法都只是解決某一種問(wèn)題的,這些問(wèn)題有了這些算法,就沒(méi)有必要使用蟻群算法。
2、蟻群算法可以用來(lái)解決一些尚未找到有效算法的問(wèn)題,而且蟻群算法還是元啟發(fā)式算法(Metaheuristic),是一種算法框架,可以在其基本思想上針對(duì)不同問(wèn)題做改進(jìn)從而應(yīng)用到不同問(wèn)題上去。
3、蟻群算法可以和其它近似算法相比較,而這些算法本身也根據(jù)問(wèn)題的不同有較大的改進(jìn)彈性。
*圖片來(lái)源:Sara Baase, Allen Van Gelder,Computer Algorithms: Introduction to Design and Analysis,影印版第三版,高等教育出版社,2001 (第49頁(yè) 圖1.5)
評(píng)論