群蟻算法理論與實(shí)踐全攻略
若干年前讀研的時(shí)候,學(xué)院有一個(gè)教授,專門做群蟻算法的,很厲害,偶爾了解了一點(diǎn)點(diǎn)。感覺也是生物智能的一個(gè)體現(xiàn),和遺傳算法、神經(jīng)網(wǎng)絡(luò)有異曲同工之妙。只不過當(dāng)時(shí)沒有實(shí)際需求學(xué)習(xí),所以沒去研究。最近有一個(gè)這樣的任務(wù),所以就好好把基礎(chǔ)研究了一下,驅(qū)動(dòng)式學(xué)習(xí),目標(biāo)明確,所以還是比較快去接受和理解,然后寫代碼實(shí)現(xiàn)就好了。今天就帶領(lǐng)大家走近TSP問題以及群蟻算法。
1.關(guān)于旅行商(TSP)問題及衍化
旅行商問題(Traveling Saleman Problem,TSP)是車輛路徑調(diào)度問題(VRP)的特例,由于數(shù)學(xué)家已證明TSP問題是NP難題,因此,VRP也屬于NP難題。旅行商問題(TSP)又譯為旅行推銷員問題、貨郎擔(dān)問題,簡稱為TSP問題,是最基本的路線問題,該問題是在尋求單一旅行者由起點(diǎn)出發(fā),通過所有給定的需求點(diǎn)之后,***再回到原點(diǎn)的最小路徑成本。——旅行商問題百科
很明顯,當(dāng)節(jié)點(diǎn)數(shù)很少時(shí),大多數(shù)人都會(huì)想到,問題很簡單,直接窮舉就OK了,但實(shí)際問題中,節(jié)點(diǎn)數(shù)往往很大,變得不可能。例如:對(duì)于一個(gè)僅有16個(gè)城市的旅行商問題,如果用窮舉法來求問題的***解,需比較的可行解有:15!/2=653,837,184,000個(gè)。在1993年,使用當(dāng)時(shí)的工作站用窮舉法求解此問題需時(shí)92小時(shí)。即使現(xiàn)在計(jì)算機(jī)速度快,但是面對(duì)復(fù)雜的問題,仍然不夠。這就是所謂的“組合爆炸”,指數(shù)級(jí)的增長,所以科學(xué)家逐步尋找近似算法或者啟發(fā)式算法,目的是在合理的時(shí)間范圍內(nèi)找到可接受的***解。
TSP問題解決算法的發(fā)展可以分為3個(gè)部分:
1).經(jīng)典精確算法:窮舉法、線性規(guī)劃算法、動(dòng)態(tài)規(guī)劃算法、分支定界算法等運(yùn)籌學(xué)中的傳統(tǒng)算法,這些算法復(fù)雜度一般都很大,只適用于求解小規(guī)模問題。
2).近似算法:當(dāng)問題規(guī)模較大時(shí),其所需的時(shí)間成級(jí)數(shù)增長,這是我們無法接受的,算法求解問題的規(guī)模受到了很大的限制,一個(gè)很自然的想法就是犧牲精確解法中的***性,去尋找一個(gè)好的時(shí)間復(fù)雜度我們可以容忍的,同時(shí)解的質(zhì)量我們可以接受的算法.基于這一思想所設(shè)計(jì)出的算法統(tǒng)稱為近似算法。如插入算法,最鄰近算法等。
3).智能算法:隨著科學(xué)技術(shù)和生產(chǎn)的不斷發(fā)展,許多實(shí)際問題不可能在合理的時(shí)間范圍內(nèi)找到全局***解,這就促使了近代***化問題求解方法的產(chǎn)生。隨著各種不同搜索機(jī)制的啟發(fā)式算法相繼出現(xiàn),如禁忌搜索、遺傳算法、模擬退火算法、人工神經(jīng)網(wǎng)絡(luò)、進(jìn)化策略、進(jìn)化編程、粒子群優(yōu)化算法、蟻群優(yōu)化算法和免疫計(jì)算等,掀起了研究啟發(fā)式算法的高潮。
具體每一種算法不再詳細(xì)描述,大家可以針對(duì)性的尋找相應(yīng)資料進(jìn)行了解。
TSP問題在實(shí)際的生產(chǎn)生活中,更加實(shí)際環(huán)境不同,有很多衍生的經(jīng)典問題。車輛路徑調(diào)度(VRP)擴(kuò)展問題是經(jīng)典VRP加入各種約束條件后而形成的。例如需求約束形成的需求隨機(jī)的車輛路徑問題(SVRP);加入時(shí)間約束得到的帶時(shí)間窗的車輛路徑題(VRPTW);加入距離約束的距離約束車輛路徑問題(DVRP);根據(jù)其它條件的不同,還有多配送中心車輛路徑問題(MDVRP)、可切分的車輛路徑問題(SDVRP);先配送再收集車輛路徑問題(VRPB)、配送收集車輛路徑問題(VRPPD);信息不完全的模糊車輛路徑問題(FVRP)[3]。
2.群蟻算法基本原理
2.1 算法綜述
對(duì)于VRP問題,求解算法大致可分為精確算法和人工智能算法兩大類。精確性算法基于嚴(yán)格的數(shù)學(xué)手段,在可以求解的情況下,解的質(zhì)量較好。但是由于算法嚴(yán)格,運(yùn)算量大,特別是大規(guī)模的問題幾乎無法求解。所以其應(yīng)用只能是小規(guī)模的確定性問題,面對(duì)中小規(guī)模問題,人工智能算法在精度上不占優(yōu)勢。但規(guī)模變大時(shí),人工智能方法基本能在可接受時(shí)間里,找到可接受的滿意解,這是精確算法難以做到的。由于的實(shí)際問題,各種約束錯(cuò)綜復(fù)雜,人工智能算法顯示出了巨大的優(yōu)越性,也正因?yàn)槿绱?實(shí)際應(yīng)用中,人工智能算法要更廣泛。求解車輛路徑調(diào)度問題的精確算法有動(dòng)態(tài)規(guī)劃法、分枝定界法等。并開始尋求所得結(jié)果可接受的啟發(fā)式算法,以處理大規(guī)模實(shí)際問題,一些其他學(xué)科的新一代優(yōu)化算法相繼出現(xiàn),如禁忌搜索算法,遺傳算法,人工神經(jīng)網(wǎng)絡(luò)算法,以及現(xiàn)在研究較多的蟻群算法等。
2.2 群蟻算法的原理
蟻群算法是受到對(duì)真實(shí)螞蟻群覓食行為研究的啟發(fā)而提出。生物學(xué)研究表明:一群相互協(xié)作的螞蟻能夠找到食物和巢穴之間的最短路徑,而單只螞蟻則不能。生物學(xué)家經(jīng)過大量細(xì)致觀察研究發(fā)現(xiàn),螞蟻個(gè)體之間的行為是相互作用相互影響的。螞蟻在運(yùn)動(dòng)過程中,能夠在它所經(jīng)過的路徑上留下一種稱之為信息素的物質(zhì),而此物質(zhì)恰恰是螞蟻個(gè)體之間信息傳遞交流的載體。螞蟻在運(yùn)動(dòng)時(shí)能夠感知這種物質(zhì),并且習(xí)慣于追蹤此物質(zhì)爬行,當(dāng)然爬行過程中還會(huì)釋放信息素。一條路上的信息素蹤跡越濃,其它螞蟻將以越高的概率跟隨爬行此路徑,從而該路徑上的信息素蹤跡會(huì)被加強(qiáng),因此,由大量螞蟻組成的蟻群的集體行為便表現(xiàn)出一種信息正反饋現(xiàn)象。某一路徑上走過的螞蟻越多,則后來者選擇該路徑的可能性就越大。螞蟻個(gè)體之間就是通過這種間接的通信機(jī)制實(shí)現(xiàn)協(xié)同搜索最短路徑的目標(biāo)的。我們舉例簡單說明螞蟻覓食行為:

如上圖a,b,c的示意圖:
a圖是原始狀態(tài),螞蟻起始點(diǎn)為A,要到達(dá)E,中途有障礙物,要繞過才能到達(dá)。BC和BH是繞過障礙物的2條路徑(假設(shè)只有2條)。各個(gè)路徑的距離d已經(jīng)標(biāo)定。
b圖是t=0時(shí)刻螞蟻狀態(tài),各個(gè)邊上有相等的信息素濃度,假設(shè)為15;
c圖是t=1時(shí)刻螞蟻經(jīng)過后的狀態(tài),各個(gè)邊的信息素濃度,有變化;因?yàn)榇罅课浵伒倪x擇概率會(huì)不一樣,而選擇概率是和路徑長度相關(guān)的。所以越短路徑的濃度會(huì)越來越大,經(jīng)過此短路徑達(dá)到目的地的螞蟻也會(huì)比其他路徑多。這樣大量的螞蟻實(shí)踐之后就找到了最短路徑。所以這個(gè)過程本質(zhì)可以概括為以下幾點(diǎn):
1.路徑概率選擇機(jī)制信息素蹤跡越濃的路徑,被選中的概率越大
2.信息素更新機(jī)制路徑越短,路徑上的信息素蹤跡增長得越快
3.協(xié)同工作機(jī)制螞蟻個(gè)體通過信息素進(jìn)行信息交流。
從螞蟻覓食的原理可見,單個(gè)個(gè)體的行為非常簡單螞蟻只知道跟蹤信息素爬行并釋放信息素,但組合后的群體智能又非常高螞蟻群能在復(fù)雜的地理分布的清況下,輕松找到蟻穴與食物源之間的最短路徑。這種特點(diǎn)恰恰與元啟發(fā)算法的特點(diǎn)相一致,蟻群優(yōu)化算法正是受到這種生態(tài)學(xué)現(xiàn)象的啟發(fā)后加以模仿并改進(jìn)而來,覓食的螞蟻由人工蟻替代,螞蟻釋放的信息素變成了人工信息素,螞蟻爬行和信息素的蒸發(fā)不再是連續(xù)不斷的,而是在離散的時(shí)空中進(jìn)行。
上述例子如果不好理解,我在這里貼幾張PPT,個(gè)人感覺非常不錯(cuò),也是我找了很多資料覺得***理解的【來源是大連理工大學(xué)谷俊峰】,下載鏈接見***部。

從深層意義上來講,蟻群算法作為優(yōu)化的方法之一,屬于人工群集智能領(lǐng)域。人工群集智能,大都受自然群集智能如昆蟲群和動(dòng)物群等的啟發(fā)而來。除了具有獨(dú)特的強(qiáng)有力的合作搜索能力外,還可以利用一系列的計(jì)算代理對(duì)問題進(jìn)行分布式處理,從而大大提高搜索效率。
3.群蟻算法的基本流程
我們還是采用大連理工大學(xué)谷俊峰的PPT來說明問題,重要公式進(jìn)行截圖計(jì)算和解釋,對(duì)PPT難以理解的地方進(jìn)行單獨(dú)解釋:
3.1 基本數(shù)學(xué)模型
首先看看基本TSP問題的基本數(shù)學(xué)模型:

問題其實(shí)很簡單,目標(biāo)函數(shù)就是各個(gè)走過路徑的總長度,注意的就是距離矩陣根據(jù)實(shí)際的問題不一樣,長度是不一樣的。
3.2 群蟻算法說明
在說明群蟻算法流程之前,我們對(duì)算法原理和幾個(gè)注意點(diǎn)進(jìn)行描述:
1.TSP問題的人工蟻群算法中,假設(shè)m只螞蟻在圖的相鄰節(jié)點(diǎn)間移動(dòng),從而協(xié)作異步地得到問題的解。每只螞蟻的一步轉(zhuǎn)移概率由圖中的每條邊上的兩類參數(shù)決定:1. 信息素值也稱信息素痕跡。2.可見度,即先驗(yàn)值。
2.信息素的更新方式有2種,一是揮發(fā),也就是所有路徑上的信息素以一定的比率進(jìn)行減少,模擬自然蟻群的信息素隨時(shí)間揮發(fā)的過程;二是增強(qiáng),給評(píng)價(jià)值“好”(有螞蟻?zhàn)哌^)的邊增加信息素。
3.螞蟻向下一個(gè)目標(biāo)的運(yùn)動(dòng)是通過一個(gè)隨機(jī)原則來實(shí)現(xiàn)的,也就是運(yùn)用當(dāng)前所在節(jié)點(diǎn)存儲(chǔ)的信息,計(jì)算出下一步可達(dá)節(jié)點(diǎn)的概率,并按此概率實(shí)現(xiàn)一步移動(dòng),逐此往復(fù),越來越接近***解。
4.螞蟻在尋找過程中,或者找到一個(gè)解后,會(huì)評(píng)估該解或解的一部分的優(yōu)化程度,并把評(píng)價(jià)信息保存在相關(guān)連接的信息素中。
3.3 群蟻算法核心步驟
更加我們前面的原理和上述說明,群蟻算法的2個(gè)核心步驟是 路徑構(gòu)建 和 信息素更新。我們將重點(diǎn)對(duì)這2個(gè)步驟進(jìn)行說明。
3.3.1 路徑構(gòu)建
每個(gè)螞蟻都隨機(jī)選擇一個(gè)城市作為其出發(fā)城市,并維護(hù)一個(gè)路徑記憶向量,用來存放該螞蟻依次經(jīng)過的城市。螞蟻在構(gòu)建路徑的每一步中,按照一個(gè)隨機(jī)比例規(guī)則選 擇下一個(gè)要到達(dá)的城市。隨機(jī)概率是按照下列公式來進(jìn)行計(jì)算的:

上述公式就是計(jì)算 當(dāng)前點(diǎn) 到 每一個(gè)可能的下一個(gè)節(jié)點(diǎn) 的概率。分子是 信息素強(qiáng)度 和 能見度 的冪乘積,而分母則是所有 分子的和值。這個(gè)剛開始是很不容易理解的,我們?cè)?**實(shí)例計(jì)算的時(shí)候,可以看得很清楚,再反過來理解公式。注意每次選擇好節(jié)點(diǎn)后,就要從可用節(jié)點(diǎn)中移除選擇的節(jié)點(diǎn)。
3.3.2 信息素更新
信息素更新是群蟻算法的核心。也是整個(gè)算法的核心所在。算法在初始期間有一個(gè)固定的濃度值,在每一次迭代完成之后,所有出去的螞蟻回來后,會(huì)對(duì)所走過的路線進(jìn)行計(jì)算,然后更新相應(yīng)的邊的信息素濃度。很明顯,這個(gè)數(shù)值肯定是和螞蟻所走的長度有關(guān)系的,經(jīng)過一次次的迭代, 近距離的線路的濃度會(huì)很高,從而得到近似***解。那我們看看信息素更新的過程。
初始化信息素濃度C(0),如果太小,算法容易早熟,螞蟻會(huì)很快集中到一條局部***路徑上來,因?yàn)榭梢韵胂?,太小C值,使得和每次揮發(fā)和增強(qiáng)的值都差不多,那么 隨機(jī)情況下,一些小概率的事件發(fā)生就會(huì)增加非***路徑的信息素濃度;如果C太大,信息素對(duì)搜索方向的指導(dǎo)性作用減低,影響算法性能。一般情況下,我們可以使用貪婪算法獲取一個(gè)路徑值Cnn,然后根據(jù)螞蟻個(gè)數(shù)來計(jì)算C(0) = m/Cnn ,m為螞蟻個(gè)數(shù)
每一輪過后,問題空間中的所有路徑上的信息素都會(huì)發(fā)生蒸發(fā),然后,所有的螞蟻根據(jù)自己構(gòu)建的路徑長度在它們本輪經(jīng)過的邊上釋放信息素,公式如下:

信息素更新的作用:
1.信息素?fù)]發(fā)(evaporation)信息素痕跡的揮發(fā)過程是每個(gè)連接上的 信息素痕跡的濃度自動(dòng)逐漸減弱的過程,這個(gè)揮發(fā)過程主要用于避 免算法過快地向局部***區(qū)域集中,有助于搜索區(qū)域的擴(kuò)展。
2.信息素增強(qiáng)(reinforcement)增強(qiáng)過程是蟻群優(yōu)化算法中可選的部 分,稱為離線更新方式(還有在線更新方式)。這種方式可以實(shí)現(xiàn) 由單個(gè)螞蟻無法實(shí)現(xiàn)的集中行動(dòng)。基本蟻群算法的離線更新方式是 在蟻群中的m只螞蟻全部完成n城市的訪問后,統(tǒng)一對(duì)殘留信息進(jìn)行 更新處理。
3.3.3 迭代與停止 迭代停止的條件可以選擇合適的迭代次數(shù)后停止,輸出***路徑,也可以看是否滿足指定***條件,找到滿足的解后停止。最重要的是,我剛開始理解這個(gè)算法的時(shí)候,以為每一只螞蟻?zhàn)咭粭l邊就是一次迭代,其實(shí)是錯(cuò)的。這里算法每一次迭代的意義是:每次迭代的m只螞蟻都完成了自己的路徑過程,回到原點(diǎn)后的整個(gè)過程。
4.群蟻算法計(jì)算實(shí)例
使用PPT中的一個(gè)案例,非常直觀,對(duì)幾個(gè)符號(hào)錯(cuò)誤進(jìn)行了修改,主要是計(jì)算概率的乘號(hào),結(jié)果沒有錯(cuò)誤:


過程總體還是比較簡單的,注意理解公式,然后把公式和實(shí)例結(jié)合起來看,***是拿筆自己手動(dòng)畫一畫,容易理解。下面我們來看看如何編程實(shí)現(xiàn)TSP問題的群蟻算法代碼。
5.TSP問題的群蟻算法C#代碼實(shí)現(xiàn)
百度搜索相關(guān)群蟻算法的代碼,基本都是matlab的,在CSDN有一個(gè)asp.net + C#版本的實(shí)現(xiàn),不過我看了之后果斷決定重寫,封裝不夠完善,同時(shí)思路也不清楚。所以自己寫的過程,理解也更清楚了。經(jīng)過我的簡單更改,目前還說得過去吧,當(dāng)然后續(xù)我還打算繼續(xù)進(jìn)行研究,所以先把基本程序的過程寫下來,當(dāng)然是利用了C# 的面向?qū)ο筇匦?,看了別人寫的 完全面向過程,理解真的很費(fèi)勁。簡單說說實(shí)現(xiàn)過程和代碼吧。
5.1 群蟻算法系統(tǒng)基類
我們封裝了一個(gè)基礎(chǔ)的BaseTspAntSystem類,包括了一些基本屬性和計(jì)算過程,后續(xù)相關(guān)改進(jìn)版本可以進(jìn)行直接繼承。當(dāng)然設(shè)計(jì)可能有缺陷,先這樣進(jìn)行,碰到需求再改吧。 BaseTspAntSystem類的主要屬性如下:

基類有一個(gè)構(gòu)造函數(shù),對(duì)系統(tǒng)的初始化就是傳入基本的參數(shù),并對(duì)相關(guān)列表進(jìn)行初始化,代碼如下:

核心的是求解過程,完全按照迭代次數(shù)要求進(jìn)行迭代進(jìn)行,過程就是概率選擇和信息素更新,我們輔助的用到了Ant螞蟻類,目的就是讓程序更加獨(dú)立和容易理解。Ant類里面有螞蟻路徑尋找過程的所有信息。下一節(jié)將進(jìn)行介紹。求解過程代碼如下面,看看注釋和對(duì)比算法進(jìn)行:

5.2 螞蟻功能類
根據(jù)算法的描述,m只螞蟻同時(shí)進(jìn)行自己的工作和尋找路程,是一個(gè)并行的過程,因此也在單次過程中,螞蟻都是獨(dú)立的。螞蟻的每一次迭代,過程都比較清楚,尋找路徑過程,注意維護(hù)一些可用的節(jié)點(diǎn)列表,以及***一條路徑的處理??纯次浵侇惖闹饕獙傩院蜆?gòu)造函數(shù):
Ant類的核心是尋找下一個(gè)城市節(jié)點(diǎn)的過程,以及循環(huán)直到所有路徑都完成。如下面代碼,是一個(gè)循環(huán)過程:

后面的GetNextCityByRandValue是一個(gè)輔助函數(shù),進(jìn)行隨機(jī)概率值的選擇,確定是否選擇哪一個(gè)節(jié)點(diǎn)。
6.資源與參考文獻(xiàn)
[1].什么是NP問題.http://blog.csdn.net/yangtrees/article/details/8107563
[2].文永軍.旅行商問題的兩種智能算法[M].西安電子科技大學(xué),2010年
[3].楊瑞臣.有時(shí)間窗和在前約束車輛路徑問題的蟻群優(yōu)化[M].西安建筑科技大學(xué),2005.
[4].谷俊峰.智能算法-第七章:蟻群算法 PPT,大連理工大學(xué),下載地址:http://files.cnblogs.com/files/asxinyu/%E8%9A%81%E7%BE%A4%E7%AE%97%E6%B3%95%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86.rar