A. 蟻群演算法,退火演算法這些東西究竟屬於什麼,這些東西要從哪裡才能系統學習
第1章緒論
1.1螞蟻的基本習性
1.1.1螞蟻的信息系統
1.1.2蟻群社會的遺傳與進化
1.2蟻群覓食行為與覓食策略
1.2.1螞蟻的覓食行為
1.2.2螞蟻的覓食策略
1.3人工蟻群演算法的基本思想
1.3.1人工蟻與真實螞蟻的異同
1.3.2人工蟻群演算法的實現過程
1.4蟻群優化演算法的意義及應用
1.4.1蟻群優化演算法的意義
l.4.2蟻群演算法的應用
1.5蟻群演算法的展望
第2章螞蟻系統——蟻群演算法的原型
2.1螞蟻系統模型的建立
2.2蟻量系統和蟻密系統的模型
2.3蟻周系統模型
第3章改進的蟻群優化演算法
3.1帶精英策略的螞蟻系統
3.2基於優化排序的螞蟻系統
3.3蟻群系統
3.3.1蟻群系統狀態轉移規則
3.3.2蟻群系統全局更新規則
3.3.3蟻群系統局部更新規則
3.3.4候選集合策略
3.4最大一最小螞蟻系統
3.4.1信息素軌跡更新
3.4.2信息素軌跡的限制
3.4.3信息素軌跡的初始化
3.4.4信息素軌跡的平滑化
3.5最優一最差螞蟻系統
3.5.1最優一最差螞蟻系統的基本思想
3.5.2最優一最差螞蟻系統的工作過程
第4章蟻群優化演算法的模擬研究
4.1螞蟻系統三類模型的模擬研究
4.1.1三類模型性能的比較
4.2.2基於統計的參數優化
4.2基於蟻群系統模型的模擬研究
4.2.1局部優化演算法的有效性
4.2.2蟻群系統與其他啟發演算法的比較
4.3最大一最小螞蟻系統的模擬研究
4.3.1信息素軌跡初始化研究
4.3.2信息素軌跡量下限的作用
4.3.3蟻群演算法的對比
4.4最優一最差螞蟻系統的模擬研究
4.4.1參數ε的設置
4.4.2幾種改進的蟻群演算法比較
第5章蟻群演算法與遺傳、模擬退火演算法的對比
5.1遺傳演算法
5.1.1遺傳演算法與自然選擇
5.1.2遺傳演算法的基本步驟
5.1.3旅行商問題的遺傳演算法實現
5.2模擬退火演算法
5.2.1物理退火過程和Metroplis准則
5.2.2模擬退火法的基本原理
5.3蟻群演算法與遺傳演算法、模擬退火演算法的比較
5.3.1三種演算法的優化質量比較
5.3.2三種演算法收斂速度比較
5.3.3三種演算法的特點與比較分析
第6章蟻群演算法與遺傳、免疫演算法的融合
6.1遺傳演算法與螞蟻演算法融合的GAAA演算法
6.1.1遺傳演算法與螞蟻演算法融合的基本思想
……
第7章自適應蟻群演算法
第8章並行蟻群演算法
第9章蟻群演算法的收斂性與蟻群行為模型
第10章蟻群演算法在優化問題中的應用
附錄
參考文獻
B. 蟻群演算法的介紹
蟻群演算法(ant colony optimization, ACO),又稱螞蟻演算法,是一種用來在圖中尋找優化路徑的機率型演算法。它由Marco Dorigo於1992年在他的博士論文中提出,其靈感來源於螞蟻在尋找食物過程中發現路徑的行為。蟻群演算法是一種模擬進化演算法,初步的研究表明該演算法具有許多優良的性質。針對PID控制器參數優化設計問題,將蟻群演算法設計的結果與遺傳演算法設計的結果進行了比較,數值模擬結果表明,蟻群演算法具有一種新的模擬進化優化方法的有效性和應用價值。
C. 什麼是蟻群演算法
蟻群演算法(ant colony optimization, ACO),又稱螞蟻演算法,是一種用來在圖中尋找優化路徑的機率型技術。它由Marco Dorigo於1992年在他的博士論文中引入,其靈感來源於螞蟻在尋找食物過程中發現路徑的行為。
蟻群演算法是一種模擬進化演算法,初步的研究表明該演算法具有許多優良的性質.針對PID控制器參數優化設計問題,將蟻群演算法設計的結果與遺傳演算法設計的結果進行了比較,數值模擬結果表明,蟻群演算法具有一種新的模擬進化優化方法的有效性和應用價值.
蟻群演算法是一種求解組合最優化問題的新型通用啟發式方法,該方法具有正反饋、分布式計算和富於建設性的貪婪啟發式搜索的特點。通過建立適當的數學模型,基於故障過電流的配電網故障定位變為一種非線性全局尋優問題。由柳洪平創建。
預期的結果:
各個螞蟻在沒有事先告訴他們食物在什麼地方的前提下開始尋找食物。當一隻找到食物以後,它會向環境釋放一種信息素,吸引其他的螞蟻過來,這樣越來越多的螞蟻會找到食物!有些螞蟻並沒有象其它螞蟻一樣總重復同樣的路,他們會另闢蹊徑,如果令開辟的道路比原來的其他道路更短,那麼,漸漸,更多的螞蟻被吸引到這條較短的路上來。最後,經過一段時間運行,可能會出現一條最短的路徑被大多數螞蟻重復著。
原理:
為什麼小小的螞蟻能夠找到食物?他們具有智能么?設想,如果我們要為螞蟻設計一個人工智慧的程序,那麼這個程序要多麼復雜呢?首先,你要讓螞蟻能夠避開障礙物,就必須根據適當的地形給它編進指令讓他們能夠巧妙的避開障礙物,其次,要讓螞蟻找到食物,就需要讓他們遍歷空間上的所有點;再次,如果要讓螞蟻找到最短的路徑,那麼需要計算所有可能的路徑並且比較它們的大小,而且更重要的是,你要小心翼翼的編程,因為程序的錯誤也許會讓你前功盡棄。這是多麼不可思議的程序!太復雜了,恐怕沒人能夠完成這樣繁瑣冗餘的程序。
然而,事實並沒有你想得那麼復雜,上面這個程序每個螞蟻的核心程序編碼不過100多行!為什麼這么簡單的程序會讓螞蟻干這樣復雜的事情?答案是:簡單規則的涌現。事實上,每隻螞蟻並不是像我們想像的需要知道整個世界的信息,他們其實只關心很小范圍內的眼前信息,而且根據這些局部信息利用幾條簡單的規則進行決策,這樣,在蟻群這個集體里,復雜性的行為就會凸現出來。這就是人工生命、復雜性科學解釋的規律!那麼,這些簡單規則是什麼呢?下面詳細說明:
1、范圍:
螞蟻觀察到的范圍是一個方格世界,螞蟻有一個參數為速度半徑(一般是3),那麼它能觀察到的范圍就是3*3個方格世界,並且能移動的距離也在這個范圍之內。
2、環境:
螞蟻所在的環境是一個虛擬的世界,其中有障礙物,有別的螞蟻,還有信息素,信息素有兩種,一種是找到食物的螞蟻灑下的食物信息素,一種是找到窩的螞蟻灑下的窩的信息素。每個螞蟻都僅僅能感知它范圍內的環境信息。環境以一定的速率讓信息素消失。
3、覓食規則:
在每隻螞蟻能感知的范圍內尋找是否有食物,如果有就直接過去。否則看是否有信息素,並且比較在能感知的范圍內哪一點的信息素最多,這樣,它就朝信息素多的地方走,並且每隻螞蟻多會以小概率犯錯誤,從而並不是往信息素最多的點移動。螞蟻找窩的規則和上面一樣,只不過它對窩的信息素做出反應,而對食物信息素沒反應。
4、移動規則:
每隻螞蟻都朝向信息素最多的方向移,並且,當周圍沒有信息素指引的時候,螞蟻會按照自己原來運動的方向慣性的運動下去,並且,在運動的方向有一個隨機的小的擾動。為了防止螞蟻原地轉圈,它會記住最近剛走過了哪些點,如果發現要走的下一點已經在最近走過了,它就會盡量避開。
5、避障規則:
如果螞蟻要移動的方向有障礙物擋住,它會隨機的選擇另一個方向,並且有信息素指引的話,它會按照覓食的規則行為。
7、播撒信息素規則:
每隻螞蟻在剛找到食物或者窩的時候撒發的信息素最多,並隨著它走遠的距離,播撒的信息素越來越少。
根據這幾條規則,螞蟻之間並沒有直接的關系,但是每隻螞蟻都和環境發生交互,而通過信息素這個紐帶,實際上把各個螞蟻之間關聯起來了。比如,當一隻螞蟻找到了食物,它並沒有直接告訴其它螞蟻這兒有食物,而是向環境播撒信息素,當其它的螞蟻經過它附近的時候,就會感覺到信息素的存在,進而根據信息素的指引找到了食物。
問題:
說了這么多,螞蟻究竟是怎麼找到食物的呢?
在沒有螞蟻找到食物的時候,環境沒有有用的信息素,那麼螞蟻為什麼會相對有效的找到食物呢?這要歸功於螞蟻的移動規則,尤其是在沒有信息素時候的移動規則。首先,它要能盡量保持某種慣性,這樣使得螞蟻盡量向前方移動(開始,這個前方是隨機固定的一個方向),而不是原地無謂的打轉或者震動;其次,螞蟻要有一定的隨機性,雖然有了固定的方向,但它也不能像粒子一樣直線運動下去,而是有一個隨機的干擾。這樣就使得螞蟻運動起來具有了一定的目的性,盡量保持原來的方向,但又有新的試探,尤其當碰到障礙物的時候它會立即改變方向,這可以看成一種選擇的過程,也就是環境的障礙物讓螞蟻的某個方向正確,而其他方向則不對。這就解釋了為什麼單個螞蟻在復雜的諸如迷宮的地圖中仍然能找到隱蔽得很好的食物。
當然,在有一隻螞蟻找到了食物的時候,其他螞蟻會沿著信息素很快找到食物的。
螞蟻如何找到最短路徑的?這一是要歸功於信息素,另外要歸功於環境,具體說是計算機時鍾。信息素多的地方顯然經過這里的螞蟻會多,因而會有更多的螞蟻聚集過來。假設有兩條路從窩通向食物,開始的時候,走這兩條路的螞蟻數量同樣多(或者較長的路上螞蟻多,這也無關緊要)。當螞蟻沿著一條路到達終點以後會馬上返回來,這樣,短的路螞蟻來回一次的時間就短,這也意味著重復的頻率就快,因而在單位時間里走過的螞蟻數目就多,灑下的信息素自然也會多,自然會有更多的螞蟻被吸引過來,從而灑下更多的信息素……;而長的路正相反,因此,越來越多地螞蟻聚集到較短的路徑上來,最短的路徑就近似找到了。也許有人會問局部最短路徑和全局最短路的問題,實際上螞蟻逐漸接近全局最短路的,為什麼呢?這源於螞蟻會犯錯誤,也就是它會按照一定的概率不往信息素高的地方走而另闢蹊徑,這可以理解為一種創新,這種創新如果能縮短路途,那麼根據剛才敘述的原理,更多的螞蟻會被吸引過來。
引申
跟著螞蟻的蹤跡,你找到了什麼?通過上面的原理敘述和實際操作,我們不難發現螞蟻之所以具有智能行為,完全歸功於它的簡單行為規則,而這些規則綜合起來具有下面兩個方面的特點:
1、多樣性
2、正反饋
多樣性保證了螞蟻在覓食的時候不置走進死胡同而無限循環,正反饋機制則保證了相對優良的信息能夠被保存下來。我們可以把多樣性看成是一種創造能力,而正反饋是一種學習強化能力。正反饋的力量也可以比喻成權威的意見,而多樣性是打破權威體現的創造性,正是這兩點小心翼翼的巧妙結合才使得智能行為涌現出來了。
引申來講,大自然的進化,社會的進步、人類的創新實際上都離不開這兩樣東西,多樣性保證了系統的創新能力,正反饋保證了優良特性能夠得到強化,兩者要恰到好處的結合。如果多樣性過剩,也就是系統過於活躍,這相當於螞蟻會過多的隨機運動,它就會陷入混沌狀態;而相反,多樣性不夠,正反饋機制過強,那麼系統就好比一潭死水。這在蟻群中來講就表現為,螞蟻的行為過於僵硬,當環境變化了,螞蟻群仍然不能適當的調整。
既然復雜性、智能行為是根據底層規則涌現的,既然底層規則具有多樣性和正反饋特點,那麼也許你會問這些規則是哪裡來的?多樣性和正反饋又是哪裡來的?我本人的意見:規則來源於大自然的進化。而大自然的進化根據剛才講的也體現為多樣性和正反饋的巧妙結合。而這樣的巧妙結合又是為什麼呢?為什麼在你眼前呈現的世界是如此栩栩如生呢?答案在於環境造就了這一切,之所以你看到栩栩如生的世界,是因為那些不能夠適應環境的多樣性與正反饋的結合都已經死掉了,被環境淘汰了!
參數說明:
最大信息素:螞蟻在一開始擁有的信息素總量,越大表示程序在較長一段時間能夠存在信息素。信息素消減的速度:隨著時間的流逝,已經存在於世界上的信息素會消減,這個數值越大,那麼消減的越快。
錯誤概率表示這個螞蟻不往信息素最大的區域走的概率,越大則表示這個螞蟻越有創新性。
速度半徑表示螞蟻一次能走的最大長度,也表示這個螞蟻的感知范圍。
記憶能力表示螞蟻能記住多少個剛剛走過點的坐標,這個值避免了螞蟻在本地打轉,停滯不前。而這個值越大那麼整個系統運行速度就慢,越小則螞蟻越容易原地轉圈。
蟻群演算法的實現
下面的程序開始運行之後,螞蟻們開始從窩里出動了,尋找食物;他們會順著屏幕爬滿整個畫面,直到找到食物再返回窩。
其中,『F』點表示食物,『H』表示窩,白色塊表示障礙物,『+』就是螞蟻了。
參數說明:
最大信息素:螞蟻在一開始擁有的信息素總量,越大表示程序在較長一段時間能夠存在信息素。信息素消減的速度:隨著時間的流逝,已經存在於世界上的信息素會消減,這個數值越大,那麼消減的越快。
錯誤概率表示這個螞蟻不往信息素最大的區域走的概率,越大則表示這個螞蟻越有創新性。
速度半徑表示螞蟻一次能走的最大長度,也表示這個螞蟻的感知范圍。
記憶能力表示螞蟻能記住多少個剛剛走過點的坐標,這個值避免了螞蟻在本地打轉,停滯不前。而這個值越大那麼整個系統運行速度就慢,越小則螞蟻越容易原地轉圈。
D. 現在模擬退火演算法、粒子群優化演算法、遺傳演算法和蟻群優化演算法現在用的還多嗎
我是人工智慧的小白,不能告訴你這幾個演算法是否是人工智慧,不過碰巧多年前學習優化演算法時,接觸過這些演算法。在這里分享幾個關於演算法的故事吧。
貨郎擔問題
有個快遞小哥要跑遍全城送貨,您打算幫他規劃一條最短的路線。該怎麼做呢,最直接的辦法是窮舉法。羅列出所有可能的線路,計算出每條線路的距離,尋求最短的路徑。看起來很簡單吧。可是在實際的路網上,路線組合是非常多的。如果有15個目的地,組合的數量至少是15的階乘。更何況還要考慮路況,收費免費,時間段等各種條件的組合,這樣的計算量恐怕是量子計算機也不能在可接受的時間里完成。這象是對條件不足多元方程組求解,要從無窮多的解中找出最接近期望值的解。於是,人們想出了許多快速逼近最優解的辦法。
螞蟻演算法
螞蟻出來覓食時,先是向四面八方出動,發現食物的螞蟻會掉頭回來通知其它的螞蟻。接到通知的螞蟻就會向食物的方向移動。螞蟻移動時會在路線上留下氣味。這樣在通向食物的路線上氣味就越來越濃,後面的螞蟻不用直接接到信息,只要追著最濃的氣味就可以找到食物。人們受到這個現象的啟發,設立出來先按隨機條件計算,在小范圍內找到局部最優解之後,就為這些條件加分。一定時間後就圍繞著分數高的條件計算,不斷反復後得到的解被當作近似最優解。這就是螞蟻演算法的原理。
神經網路
和螞蟻演算法類似,人的記憶是通過神經元的突出建立起聯系實現的。類似的刺激會使聯系增強。達到一定刺激量之後,就可以形成長久的記憶。模仿這一過程,人們把各種約束條件當作神經元,隨機選取路線,輸入各種條件,當路徑傾向於縮短時,就按照權重給各條件加分,反之就給條件減分,然後,根據分數,以最有利於優化的條件為主重新選擇路線,反復該過程直到達到邊界條件時,就認為得到了近似最優解。遺傳演算法,模擬退火演算法,也都是用一定的方法,縮小計算范圍,通過求局部最優解逼近最優解的。就不啰嗦了。
人工智慧和優化演算法
優化演算法實際上是從早期人工智慧的研究發展起來的,從這個意義上說,這些演算法也可以說是人工智慧吧。
E. 蟻群演算法的概念是怎樣的
蟻群演算法是由義大利學者M.Doring、V.Maniezzo、A.Colorini等人首先提出的[59]。蟻群演算法通過信息素來表示一個解所包含的關於被優化函數的最優解的信息
F. 蟻群演算法java版
說明:信息素權重,路徑權重和信息素蒸發率對最後的結果影響很大,需要微調。
目前發現2 / 5 / 0.5 能達到稍微讓人滿意的效果。本程序離完美的ACO還差很遠,僅供參考。
本蟻群演算法為AS演算法。
用法:
1.new一個對象
ACOforTSP tsp = new ACPforTSP(tsp數據文件名,迭代次數,螞蟻數量,信息素權重,路徑權重,信息素蒸發率);
2.用go()方法運行
tsp.go();
ACOforTSP.java
___________________________________________________________________
import java.io.File;
import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
import static java.lang.Math.random;
import java.util.HashMap;
import java.io.FileReader;
import java.io.BufferedReader;
/**
*
* @author dvdface
*/
public class ACOforTSP {
//城市的距離表
private double[][] distance;
//距離的倒數表
private double[][] heuristic;
//啟發信息表
private double[][] pheromone;
//權重
private int alpha, beta;
//迭代的次數
private int iterationTimes;
//螞蟻的數量
private int numbersOfAnt;
//蒸發率
private double rate;
ACOforTSP (String file, int iterationTimes, int numbersOfAnt, int alpha, int beta, double rate) {
//載入文件
this.initializeData(file);
//初始化參數
this.iterationTimes = iterationTimes;
//設置螞蟻數量
this.numbersOfAnt = numbersOfAnt;
//設置權重
this.alpha = alpha;
this.beta = beta;
//設置蒸發率
this.rate = rate;
}
private void initializeData(String filename) {
//定義內部類
class City {
int no;
double x;
double y;
City(int no, double x, double y) {
this.no = no;
this.x = x;
this.y = y;
}
private double getDistance(City city) {
return sqrt(pow((x - city.x), 2) + pow((y - city.y), 2));
}
}
try {
//定義HashMap保存讀取的坐標信息
HashMap<Integer, City> map = new HashMap<Integer, City>();
//讀取文件
BufferedReader reader = new BufferedReader(new FileReader(new File(filename)));
for (String str = reader.readLine(); str != null; str = reader.readLine()) {
//將讀到的信息保存入HashMap
if (str.matches("([0-9]+)(\\s*)([0-9]+)(.?)([0-9]*)(\\s*)([0-9]+)(.?)([0-9]*)")) {
String[] data = str.split("(\\s+)");
City city = new City(Integer.parseInt(data[0]),
Double.parseDouble(data[1]),
Double.parseDouble(data[2]));
map.put(city.no, city);
}
}
//分配距離矩陣存儲空間
distance = new double[map.size() + 1][map.size() + 1];
//分配距離倒數矩陣存儲空間
heuristic = new double[map.size() + 1][map.size() + 1];
//分配信息素矩陣存儲空間
pheromone = new double[map.size() + 1][map.size() + 1];
for (int i = 1; i < map.size() + 1; i++) {
for (int j = 1; j < map.size() + 1; j++) {
//計算城市間的距離,並存入距離矩陣
distance[i][j] = map.get(i).getDistance(map.get(j));
//計算距離倒數,並存入距離倒數矩陣
heuristic[i][j] = 1 / distance[i][j];
//初始化信息素矩陣
pheromone[i][j] = 1;
}
}
} catch (Exception exception) {
System.out.println("初始化數據失敗!");
}
}
class Ant {
//已訪問城市列表
private boolean[] visited;
//訪問順序表
private int[] tour;
//已訪問城市的個數
private int n;
//總的距離
private double total;
Ant() {
//給訪問順序表分配空間
tour = new int[distance.length+1];
//已存入城市數量為n,剛開始為0
n = 0;
//將起始城市1,放入訪問結點順序表第一項
tour[++n] = 1;
//給已訪問城市結點分配空間
visited = new boolean[distance.length];
//第一個城市為出發城市,設置為已訪問
visited[tour[n]] = true;
}
private int chooseCity() {
//用來random的隨機數
double m = 0;
//獲得當前所在的城市號放入j,如果和j相鄰的城市沒有被訪問,那麼加入m
for (int i = 1, j = tour[n]; i < pheromone.length; i++) {
if (!visited[i]) {
m += pow(pheromone[j][i], alpha) * pow(heuristic[j][i], beta);
}
}
//保存隨機到的數
double p = m * random();
//尋找被隨機到的城市
double k = 0;
//保存找到的城市
int q = 0;
for (int i = 1, j = tour[n]; k < p; i++) {
if (!visited[i]) {
k += pow(pheromone[j][i], alpha) * pow(heuristic[j][i], beta);
q = i;
}
}
return q;
}
private void constructSolution () {
while (n != (distance.length-1) ) {
//選取下一個城市
int p = chooseCity();
//計算總的距離
total += distance[tour[n]][p];
//將選取到的城市放入已訪問列表
tour[++n] = p;
//將選取到的城市標記為已訪問
visited[p] = true;
}
//回到起點
total += distance[tour[1]][tour[n]];
//將起點加入訪問順序表的最後
tour[++n] = tour[1];
}
private void releasePheromone() {
//釋放信息素的大小
double t = 1/total;
//釋放信息素
for (int i=1;i<tour.length-1;i++) {
pheromone[tour[i]][tour[i+1]] += t;
pheromone[tour[i+1]][tour[i]] += t;
}
}
}
public void go() {
//保存最好的路徑和路徑長度
double bestTotal = Double.MAX_VALUE;
int[] bestTour = new int[distance.length+1];
//新建螞蟻數組,用來引用所創建的螞蟻
Ant[] ant = new Ant[numbersOfAnt];
//進行iterationTimes次迭代
while (iterationTimes != 0) {
//初始化新的一批螞蟻(這里用構造新的螞蟻代替重置螞蟻狀態)
for (int i=0; i<numbersOfAnt; i++) {
ant[i] = new Ant();
}
//進行一次迭代(即讓所有的螞蟻構建一條路徑)
for (int i=0; i<numbersOfAnt; i++) {
ant[i].constructSolution();
//如果螞蟻構建的路徑長度比上次最好的還好,那麼保存這個長度和它所走的路徑
if (ant[i].total<bestTotal) {
bestTotal = ant[i].total;
System.array(ant[i].tour, 1, bestTour, 1, bestTour.length-1);
}
}
//蒸發信息素
evaporatePheromone();
//釋放信息素
for (int i=0; i<numbersOfAnt; i++) {
ant[i].releasePheromone();
}
//報告本次迭代的信息
System.out.format("本次為倒數第%d次迭代,當前最優路徑長度為%10.2f\n",iterationTimes,bestTotal);
//迭代總數減去1,進行下次迭代
iterationTimes--;
}
//輸出最好的路徑長度
System.out.format("得到的最優的路徑長度為:%10.2f\n",bestTotal);
//輸出最好的路徑
System.out.println("最優路徑如下:");
for (int i=1; i<bestTour.length; i++) {
System.out.print("→"+bestTour[i]);
}
}
private void evaporatePheromone() {
for (int i = 1; i < pheromone.length; i++)
for (int j = 1; j < pheromone.length; j++) {
pheromone[i][j] *= 1-rate;
}
}
}
G. 在做用蟻群優化演算法在道路擁堵的情況下尋找最短路徑的項目,該如何在蟻群演算法的網路圖中刪去擁堵路段
蟻群演算法(ant colony optimization, ACO),又稱螞蟻演算法,是一種用來在圖中尋找優化路徑的機率型演算法。它由Marco Dorigo於1992年在他的博士論文中提出,其靈感來源於螞蟻在尋找食物過程中發現路徑的行為。蟻群演算法是一種模擬進化演算法,初步的研究表明該演算法具有許多優良的性質。針對PID控制器參數優化設計問題,將蟻群演算法設計的結果與遺傳演算法設計的結果進行了比較,數值模擬結果表明,蟻群演算法具有一種新的模擬進化優化方法的有效性和應用價值。
各個螞蟻在沒有事先告訴他們食物在什麼地方的前提下開始尋找食物。當一隻找到食物以後,它會向環境釋放一種揮發性分泌物pheromone (稱為信息素,該物質隨著時間的推移會逐漸揮發消失,信息素濃度的大小表徵路徑的遠近)來實現的,吸引其他的螞蟻過來,這樣越來越多的螞蟻會找到食物。有些螞蟻並沒有象其它螞蟻一樣總重復同樣的路,他們會另闢蹊徑,如果另開辟的道路比原來的其他道路更短,那麼,漸漸地,更多的螞蟻被吸引到這條較短的路上來。最後,經過一段時間運行,可能會出現一條最短的路徑被大多數螞蟻重復著。
原理
設想,如果我們要為螞蟻設計一個人工智慧的程序,那麼這個程序要多麼復雜呢?首先,你要讓螞蟻能夠避開障礙物,就必須根據適當的地形給它編進指令讓他們能夠巧妙的避開障礙物,其次,要讓螞蟻找到食物,就需要讓他們遍歷空間上的所有點;再次,如果要讓螞蟻找到最短的路徑,那麼需要計算所有可能的路徑並且比較它們的大小,而且更重要的是,你要小心翼翼地編程,因為程序的錯誤也許會讓你前功盡棄。這是多麼不可思議的程序!太復雜了,恐怕沒人能夠完成這樣繁瑣冗餘的程序。
然而,事實並沒有你想得那麼復雜,上面這個程序每個螞蟻的核心程序編碼不過100多行!為什麼這么簡單的程序會讓螞蟻干這樣復雜的事情?答案是:簡單規則的涌現。事實上,每隻螞蟻並不是像我們想像的需要知道整個世界的信息,他們其實只關心很小范圍內的眼前信息,而且根據這些局部信息利用幾條簡單的規則進行決策,這樣,在蟻群這個集體里,復雜性的行為就會凸現出來。這就是人工生命、復雜性科學解釋的規律!那麼,這些簡單規則是什麼呢?