蟻群演算法python實現
A. 蟻群演算法求解TSP問題的源程序及簡要說明
簡單蟻群演算法求解TSP的源程序(我幫你找的)
蟻群演算法是新興的仿生演算法,最初是由義大利學者Dorigo M於1991年首次提出,由於具有較強的魯棒性,優良的分布式計算機制和易於與其它方法結合等優點,成為人工智慧領域的一個研究熱點。本程序是實現簡單的蟻群演算法,TSP問題取的是att48,可從http://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95獲取,程序運行時間可能會比較長,在我的這台CPU 1.6G+內存256M的機器上運行時間大概是13分鍾左右。我用的語言是MATLAB 7.1。此程序僅供學習所用,如有問題請反饋。謝謝。(註:程序沒有計算最後一個城市回來起點城市的距離)
function [y,val]=QACS
tic
load att48 att48;
MAXIT=300; % 最大循環次數
NC=48; % 城市個數
tao=ones(48,48);% 初始時刻各邊上的信息最為1
rho=0.2; % 揮發系數
alpha=1;
beta=2;
Q=100;
mant=20; % 螞蟻數量
iter=0; % 記錄迭代次數
for i=1:NC % 計算各城市間的距離
for j=1:NC
distance(i,j)=sqrt((att48(i,2)-att48(j,2))^2+(att48(i,3)-att48(j,3))^2);
end
end
bestroute=zeros(1,48); % 用來記錄最優路徑
routelength=inf; % 用來記錄當前找到的最優路徑長度
% for i=1:mant % 確定各螞蟻初始的位置
% end
for ite=1:MAXIT
for ka=1:mant %考查第K只螞蟻
deltatao=zeros(48,48); % 第K只螞蟻移動前各邊上的信息增量為零
[routek,lengthk]=travel(distance,tao,alpha,beta);
if lengthk<routelength % 找到一條更好的路徑
routelength=lengthk;
bestroute=routek;
end
for i=1:NC-1 % 第K只螞蟻在路徑上釋放的信息量
deltatao(routek(i),routek(i+1))=deltatao(routek(i),routek(i+1))+Q/lengthk;
end
deltatao(routek(48),1)=deltatao(routek(48),1)+Q/lengthk;
end
for i=1:NC-1
for j=i+1:NC
if deltatao(i,j)==0
deltatao(i,j)=deltatao(j,i);
end
end
end
tao=(1-rho).*tao+deltatao;
end
y=bestroute;
val=routelength;
toc
function [y,val]=travel(distance,tao,alpha,beta) % 某隻螞蟻找到的某條路徑
[m,n]=size(distance);
p=fix(m*rand)+1;
val=0; % 初始路徑長度設為 0
tabuk=[p]; % 假設該螞蟻都是從第 p 個城市出發的
for i=1:m-1
np=tabuk(length(tabuk)); % 螞蟻當前所在的城市號
p_sum=0;
for j=1:m
if isin(j,tabuk)
continue;
else
ada=1/distance(np,j);
p_sum=p_sum+tao(np,j)^alpha*ada^beta;
end
end
cp=zeros(1,m); % 轉移概率
for j=1:m
if isin(j,tabuk)
continue;
else
ada=1/distance(np,j);
cp(j)=tao(np,j)^alpha*ada^beta/p_sum;
end
end
NextCity=pchoice(cp);
tabuk=[tabuk,NextCity];
val=val+distance(np,NextCity);
end
y=tabuk;
function y=isin(x,A) % 判斷數 x 是否在向量 A 中,如在返回 1 ,否則返回 0
y=0;
for i=1:length(A)
if A(i)==x
y=1;
break;
end
end
function y=pchoice(A)
a=rand;
tempA=zeros(1,length(A)+1);
for i=1:length(A)
tempA(i+1)=tempA(i)+A(i);
end
for i=2:length(tempA)
if a<=tempA(i)
y=i-1;
break;
end
end
B. 在做用蟻群優化演算法在道路擁堵的情況下尋找最短路徑的項目,該如何在蟻群演算法的網路圖中刪去擁堵路段
蟻群演算法(ant colony optimization, ACO),又稱螞蟻演算法,是一種用來在圖中尋找優化路徑的機率型演算法。它由Marco Dorigo於1992年在他的博士論文中提出,其靈感來源於螞蟻在尋找食物過程中發現路徑的行為。蟻群演算法是一種模擬進化演算法,初步的研究表明該演算法具有許多優良的性質。針對PID控制器參數優化設計問題,將蟻群演算法設計的結果與遺傳演算法設計的結果進行了比較,數值模擬結果表明,蟻群演算法具有一種新的模擬進化優化方法的有效性和應用價值。
各個螞蟻在沒有事先告訴他們食物在什麼地方的前提下開始尋找食物。當一隻找到食物以後,它會向環境釋放一種揮發性分泌物pheromone (稱為信息素,該物質隨著時間的推移會逐漸揮發消失,信息素濃度的大小表徵路徑的遠近)來實現的,吸引其他的螞蟻過來,這樣越來越多的螞蟻會找到食物。有些螞蟻並沒有象其它螞蟻一樣總重復同樣的路,他們會另闢蹊徑,如果另開辟的道路比原來的其他道路更短,那麼,漸漸地,更多的螞蟻被吸引到這條較短的路上來。最後,經過一段時間運行,可能會出現一條最短的路徑被大多數螞蟻重復著。
原理
設想,如果我們要為螞蟻設計一個人工智慧的程序,那麼這個程序要多麼復雜呢?首先,你要讓螞蟻能夠避開障礙物,就必須根據適當的地形給它編進指令讓他們能夠巧妙的避開障礙物,其次,要讓螞蟻找到食物,就需要讓他們遍歷空間上的所有點;再次,如果要讓螞蟻找到最短的路徑,那麼需要計算所有可能的路徑並且比較它們的大小,而且更重要的是,你要小心翼翼地編程,因為程序的錯誤也許會讓你前功盡棄。這是多麼不可思議的程序!太復雜了,恐怕沒人能夠完成這樣繁瑣冗餘的程序。
然而,事實並沒有你想得那麼復雜,上面這個程序每個螞蟻的核心程序編碼不過100多行!為什麼這么簡單的程序會讓螞蟻干這樣復雜的事情?答案是:簡單規則的涌現。事實上,每隻螞蟻並不是像我們想像的需要知道整個世界的信息,他們其實只關心很小范圍內的眼前信息,而且根據這些局部信息利用幾條簡單的規則進行決策,這樣,在蟻群這個集體里,復雜性的行為就會凸現出來。這就是人工生命、復雜性科學解釋的規律!那麼,這些簡單規則是什麼呢?
C. 蟻群演算法的概念,最好能舉例說明一些蟻群演算法適用於哪些問題!
概念:蟻群演算法(ant colony optimization, ACO),又稱螞蟻演算法,是一種用來在圖中尋找優化路徑的機率型演算法。它由Marco Dorigo於1992年在他的博士論文中提出,其靈感來源於螞蟻在尋找食物過程中發現路徑的行為。蟻群演算法是一種模擬進化演算法,初步的研究表明該演算法具有許多優良的性質.針對PID控制器參數優化設計問題,將蟻群演算法設計的結果與遺傳演算法設計的結果進行了比較,數值模擬結果表明,蟻群演算法具有一種新的模擬進化優化方法的有效性和應用價值
其原理:為什麼小小的螞蟻能夠找到食物?他們具有智能么?設想,如果我們要為螞蟻設計一個人工智慧的程序,那麼這個程序要多麼復雜呢?首先,你要讓螞蟻能夠避開障礙物,就必須根據適當的地形給它編進指令讓他們能夠巧妙的避開障礙物,其次,要讓螞蟻找到食物,就需要讓他們遍歷空間上的所有點;再次,如果要讓螞蟻找到最短的路徑,那麼需要計算所有可能的路徑並且比較它們的大小,而且更重要的是,你要小心翼翼的編程,因為程序的錯誤也許會讓你前功盡棄。這是多麼不可思議的程序!太復雜了,恐怕沒人能夠完成這樣繁瑣冗餘的程序
應用范圍:螞蟻觀察到的范圍是一個方格世界,螞蟻有一個參數為速度半徑(一般是3),那麼它能觀察到的范圍就是3*3個方格世界,並且能移動的距離也在這個范圍之內
引申:跟著螞蟻的蹤跡,你找到了什麼?通過上面的原理敘述和實際操作,我們不難發現螞蟻之所以具有智能行為,完全歸功於它的簡單行為規則,而這些規則綜合起來具有下面兩個方面的特點: 1、多樣性 2、正反饋 多樣性保證了螞蟻在覓食的時候不置走進死胡同而無限循環,正反饋機制則保證了相對優良的信息能夠被保存下來。我們可以把多樣性看成是一種創造能力,而正反饋是一種學習強化能力。正反饋的力量也可以比喻成權威的意見,而多樣性是打破權威體現的創造性,正是這兩點小心翼翼的巧妙結合才使得智能行為涌現出來了。 引申來講,大自然的進化,社會的進步、人類的創新實際上都離不開這兩樣東西,多樣性保證了系統的創新能力,正反饋保證了優良特性能夠得到強化,兩者要恰到好處的結合。如果多樣性過剩,也就是系統過於活躍,這相當於螞蟻會過多的隨機運動,它就會陷入混沌狀態;而相反,多樣性不夠,正反饋機制過強,那麼系統就好比一潭死水。這在蟻群中來講就表現為,螞蟻的行為過於僵硬,當環境變化了,螞蟻群仍然不能適當的調整。 既然復雜性、智能行為是根據底層規則涌現的,既然底層規則具有多樣性和正反饋特點,那麼也許你會問這些規則是哪裡來的?多樣性和正反饋又是哪裡來的?我本人的意見:規則來源於大自然的進化。而大自然的進化根據剛才講的也體現為多樣性和正反饋的巧妙結合。而這樣的巧妙結合又是為什麼呢?為什麼在你眼前呈現的世界是如此栩栩如生呢?答案在於環境造就了這一切,之所以你看到栩栩如生的世界,是因為那些不能夠適應環境的多樣性與正反饋的結合都已經死掉了,被環境淘汰了! 蟻群演算法的實現 下面的程序開始運行之後,螞蟻們開始從窩里出動了,尋找食物;他們會順著屏幕爬滿整個畫面,直到找到食物再返回窩。 其中,『F』點表示食物,『H』表示窩,白色塊表示障礙物,『+』就是螞蟻了。
具體參考http://ke..com/view/539346.htm
希望對你有幫助,謝謝。
D. 如何用蟻群演算法來計算固定時間內走更多的城市且路程最短
概念:蟻群演算法(ant colony optimization,ACO),又稱螞蟻演算法,是一種用來在圖中尋找優化路徑的機率型演算法.它由Marco Dorigo於1992年在他的博士論文中提出,其靈感來源於螞蟻在尋找食物過程中發現路徑的行為.蟻群演算法是一種模擬進化演算法,初步的研究表明該演算法具有許多優良的性質.針對PID控制器參數優化設計問題,將蟻群演算法設計的結果與遺傳演算法設計的結果進行了比較,數值模擬結果表明,蟻群演算法具有一種新的模擬進化優化方法的有效性和應用價值
其原理:為什麼小小的螞蟻能夠找到食物?他們具有智能么?設想,如果我們要為螞蟻設計一個人工智慧的程序,那麼這個程序要多麼復雜呢?首先,你要讓螞蟻能夠避開障礙物,就必須根據適當的地形給它編進指令讓他們能夠巧妙的避開障礙物,其次,要讓螞蟻找到食物,就需要讓他們遍歷空間上的所有點;再次,如果要讓螞蟻找到最短的路徑,那麼需要計算所有可能的路徑並且比較它們的大小,而且更重要的是,你要小心翼翼的編程,因為程序的錯誤也許會讓你前功盡棄.這是多麼不可思議的程序!太復雜了,恐怕沒人能夠完成這樣繁瑣冗餘的程序
應用范圍:螞蟻觀察到的范圍是一個方格世界,螞蟻有一個參數為速度半徑(一般是3),那麼它能觀察到的范圍就是3*3個方格世界,並且能移動的距離也在這個范圍之內
引申:跟著螞蟻的蹤跡,你找到了什麼?通過上面的原理敘述和實際操作,我們不難發現螞蟻之所以具有智能行為,完全歸功於它的簡單行為規則,而這些規則綜合起來具有下面兩個方面的特點:1、多樣性 2、正反饋 多樣性保證了螞蟻在覓食的時候不置走進死胡同而無限循環,正反饋機制則保證了相對優良的信息能夠被保存下來.我們可以把多樣性看成是一種創造能力,而正反饋是一種學習強化能力.正反饋的力量也可以比喻成權威的意見,而多樣性是打破權威體現的創造性,正是這兩點小心翼翼的巧妙結合才使得智能行為涌現出來了.引申來講,大自然的進化,社會的進步、人類的創新實際上都離不開這兩樣東西,多樣性保證了系統的創新能力,正反饋保證了優良特性能夠得到強化,兩者要恰到好處的結合.如果多樣性過剩,也就是系統過於活躍,這相當於螞蟻會過多的隨機運動,它就會陷入混沌狀態;而相反,多樣性不夠,正反饋機制過強,那麼系統就好比一潭死水.這在蟻群中來講就表現為,螞蟻的行為過於僵硬,當環境變化了,螞蟻群仍然不能適當的調整.既然復雜性、智能行為是根據底層規則涌現的,既然底層規則具有多樣性和正反饋特點,那麼也許你會問這些規則是哪裡來的?多樣性和正反饋又是哪裡來的?我本人的意見:規則來源於大自然的進化.而大自然的進化根據剛才講的也體現為多樣性和正反饋的巧妙結合.而這樣的巧妙結合又是為什麼呢?為什麼在你眼前呈現的世界是如此栩栩如生呢?答案在於環境造就了這一切,之所以你看到栩栩如生的世界,是因為那些不能夠適應環境的多樣性與正反饋的結合都已經死掉了,被環境淘汰了!蟻群演算法的實現 下面的程序開始運行之後,螞蟻們開始從窩里出動了,尋找食物;他們會順著屏幕爬滿整個畫面,直到找到食物再返回窩.其中,『F』點表示食物,『H』表示窩,白色塊表示障礙物,『+』就是螞蟻了.
E. 蟻群演算法 如何更新信息素
學習蟻群演算法首先要搞清除蟻群演算法的原理,原理很簡單,就是模擬螞蟻尋找食物的行為,這個並不難理解。
其次要搞清楚怎麼把這個過程用代碼實現出來,這個才是關鍵。這只有一個辦法,那就是閱讀別人的代碼,
這需要具有一定的編程基礎,要是對編程一竅不通或者是初學,那閱讀和理解起來會費勁一些。
其實基本蟻群演算法的實現代碼並不多,全部代碼加起來也就200多行,這其中還包括注釋行和空行,
真正的代碼部分少於200行,如果看一遍不懂就看兩遍。我想只要用心看上10遍,肯定可以看明白。
不要覺得蟻群演算法的代碼很復雜,其實很簡單,看的時候動腦筋想一下就可以了。
F. 蟻群演算法車輛路徑優化問題信息素如何選擇
述了。
目前蟻群演算法主要用在組合優化方面,基本蟻群演算法的思路是這樣的:
1. 在初始狀態下,一群螞蟻外出,此時沒有信息素,那麼各自會隨機的選擇一條路徑。
2. 在下一個狀態,每隻螞蟻到達了不同的點,從初始點到這些點之間留下了信息素,螞蟻繼續走,已經到達目標的螞蟻開始返回,與此同時,下一批螞蟻出動,它們都會按照各條路徑上信息素的多少選擇路線(selection),更傾向於選擇信息素多的路徑走(當然也有隨機性)。
3. 又到了再下一個狀態,剛剛沒有螞蟻經過的路線上的信息素不同程度的揮發掉了(evaporation),而剛剛經過了螞蟻的路線信息素增強(reinforcement)。然後又出動一批螞蟻,重復第2個步驟。
每個狀態到下一個狀態的變化稱為一次迭代,在迭代多次過後,就會有某一條路徑上的信息素明顯多於其它路徑,這通常就是一條最優路徑。
關鍵的部分在於步驟2和3:
步驟2中,每隻螞蟻都要作出選擇,怎樣選擇呢?
selection過程用一個簡單的函數實現:
螞蟻選擇某條路線的概率=該路線上的信息素÷所有可選擇路線的信息素之和
假設螞蟻在i點,p(i,j)表示下一次到達j點的概率,而τ(i,j)表示ij兩點間的信息素,則:
p(i,j)=τ(i,j)/∑τ(i)
(如果所有可選路線的信息素之和∑τ(i)=0,即前面還沒有螞蟻來過,概率就是一個[0,1]上的隨機值,即隨機選擇一條路線)
步驟3中,揮發和增強是演算法的關鍵所在(也就是如何數學定義信息素的)
evaporation過程和reinforcement過程定義了一個揮發因子,是迭代次數k的一個函數
ρ(k)=1-lnk/ln(k+1)
最初設定每條路徑的信息素τ(i,j,0)為相同的值
然後,第k+1次迭代時,信息素的多少
對於沒有螞蟻經過的路線:τ(i,j,k+1)=(1-ρ(k))τ(i,j,k),顯然信息素減少了
有螞蟻經過的路線:τ(i,j,k+1)=(1-ρ(k))τ(i,j,k)+ρ(k)/|W|,W為所有點的集合
為什麼各個函數要如此定義,這個問題很難解釋清楚,這也是演算法的精妙所在。如此定義信息素的揮發和增強,以及路徑選擇,根據馬爾可夫過程(隨機過程之一)能夠推導出,在迭代了足夠多次以後,演算法能夠收斂到最佳路徑。
組合優化很有意思的,像禁忌搜索、模擬退火、蟻群演算法、遺傳演算法、神經網路這些演算法能夠解決很多生活中的實際問題,樓主有空可以招本書看看。
G. 蟻群演算法,退火演算法這些東西究竟屬於什麼,這些東西要從哪裡才能系統學習
第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章蟻群演算法在優化問題中的應用
附錄
參考文獻
H. 求帶注釋的蟻群演算法
Sorry,沒有注釋!
放不下,網站上有!
下面就是實現如此復雜性的七條簡單規則:
1、范圍:
螞蟻觀察到的范圍是一個方格世界,螞蟻有一個參數為速度半徑(一般是3),那麼它能觀察到的范圍就是33個方格世界,並且能移動的距離也在這個范圍之內。
2、環境:
螞蟻所在的環境是一個虛擬的世界,其中有障礙物,有別的螞蟻,還有信息素,信息素有兩種,一種是找到食物的螞蟻灑下的食物信息素,一種是找到窩的螞蟻灑下的窩的信息素。每個螞蟻都僅僅能感知它范圍內的環境信息。環境以一定的速率讓信息素消失。
3、覓食規則:
在每隻螞蟻能感知的范圍內尋找是否有食物,如果有就直接過去。否則看是否有信息素,並且比較在能感知的范圍內哪一點的信息素最多,這樣,它就朝信息素多的地方走,並且每隻螞蟻多會以小概率犯錯誤,從而並不是往信息素最多的點移動。螞蟻找窩的規則和上面一樣,只不過它對窩的信息素做出反應,而對食物信息素沒反應。
4、移動規則:
每隻螞蟻都朝向信息素最多的方向移,並且,當周圍沒有信息素指引的時候,螞蟻會按照自己原來運動的方向慣性的運動下去,並且,在運動的方向有一個隨機的小的擾動。為了防止螞蟻原地轉圈,它會記住最近剛走過了哪些點,如果發現要走的下一點已經在最近走過了,它就會盡量避開。
5、避障規則:
如果螞蟻要移動的方向有障礙物擋住,它會隨機的選擇另一個方向,並且有信息素指引的話,它會按照覓食的規則行為。
7、播撒信息素規則:
每隻螞蟻在剛找到食物或者窩的時候撒發的信息素最多,並隨著它走遠的距離,播撒的信息素越來越少。
下面的程序開始運行之後,螞蟻們開始從窩里出動了,尋找食物;他們會順著屏幕爬滿整個畫面,直到找到食物再返回窩。
其中,『F』點表示食物,『H』表示窩,白色塊表示障礙物,『+』就是螞蟻了。
參數說明:
最大信息素:螞蟻在一開始擁有的信息素總量,越大表示程序在較長一段時間能夠存在信息素。信息素消減的速度:隨著時間的流逝,已經存在於世界上的信息素會消減,這個數值越大,那麼消減的越快。
錯誤概率表示這個螞蟻不往信息素最大的區域走的概率,越大則表示這個螞蟻越有創新性。
速度半徑表示螞蟻一次能走的最大長度,也表示這個螞蟻的感知范圍。
記憶能力表示螞蟻能記住多少個剛剛走過點的坐標,這個值避免了螞蟻在本地打轉,停滯不前。而這個值越大那麼整個系統運行速度就慢,越小則螞蟻越容易原地轉圈。
源代碼如下:
ant.c
#define SPACE 0×20
#define ESC 0×1b
#define ANT_CHAR_EMPTY 『+』
#define ANT_CHAR_FOOD 153
#define HOME_CHAR 『H』
#define FOOD_CHAR 『F』
#define FOOD_CHAR2 『f』
#define FOOD_HOME_COLOR 12
#define BLOCK_CHAR 177
#define MAX_ANT 50
#define INI_SPEED 3
#define MAXX 80
#define MAXY 23
#define MAX_FOOD 10000
#define TARGET_FOOD 200
#define MAX_SMELL 5000
#define SMELL_DROP_RATE 0.05
#define ANT_ERROR_RATE 0.02
#define ANT_EYESHOT 3
#define SMELL_GONE_SPEED 50
#define SMELL_GONE_RATE 0.05
#define TRACE_REMEMBER 50
#define MAX_BLOCK 100
#define NULL 0
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
#define SMELL_TYPE_FOOD 0
#define SMELL_TYPE_HOME 1
#include 「stdio.h」
#include 「conio.h」
#include 「dos.h」
#include 「stdlib.h」
#include 「dos.h」
#include 「process.h」
#include 「ctype.h」
#include 「math.h」
void WorldInitial(void);
void BlockInitial(void);
void CreatBlock(void);
void SaveBlock(void);
void LoadBlock(void);
void HomeFoodInitial(void);
void AntInitial(void);
void WorldChange(void);
void AntMove(void);
void AntOneStep(void);
void DealKey(char key);
void ClearSmellDisp(void);
void DispSmell(int type);
int AntNextDir(int xxx,int yyy,int ddir);
int GetMaxSmell(int type,int xxx,int yyy,int ddir);
int IsTrace(int xxx,int yyy);
int MaxLocation(int num1,int num2,int num3);
int CanGo(int xxx,int yyy,int ddir);
int JudgeCanGo(int xxx,int yyy);
int TurnLeft(int ddir);
int TurnRight(int ddir);
int TurnBack(int ddir);
int MainTimer(void);
char WaitForKey(int secnum);
void DispPlayTime(void);
int TimeUse(void);
void HideCur(void);
void ResetCur(void);
—————
struct HomeStruct
{
int xxx,yyy;
int amount;
int TargetFood;
}home;
struct FoodStruct
{
int xxx,yyy;
int amount;
}food;
struct AntStruct
{
int xxx,yyy;
int dir;
int speed;
int SpeedTimer;
int food;
int SmellAmount[2];
int tracex[TRACE_REMEMBER];
int tracey[TRACE_REMEMBER];
int TracePtr;
int IQ;
}ant[MAX_ANT];
int AntNow;
int timer10ms;
struct time starttime,endtime;
int Smell[2][MAXX+1][MAXY+1];
int block[MAXX+1][MAXY+1];
int SmellGoneTimer;
int SmellDispFlag;
int CanFindFood;
int HardtoFindPath;
—– Main ——–
void main(void)
{
char KeyPress;
int tu;
clrscr();
HideCur();
WorldInitial();
do
{
timer10ms = MainTimer();
if(timer10ms) AntMove();
if(timer10ms) WorldChange();
tu = TimeUse();
if(tu=60&&!CanFindFood)
{
gotoxy(1,MAXY+1);
printf(「Can not find food, maybe a block world.」);
WaitForKey(10);
WorldInitial();
}
if(tu=180&&home.amount100&&!HardtoFindPath)
{
gotoxy(1,MAXY+1);
printf(「God! it is so difficult to find a path.」);
if(WaitForKey(10)==0×0d) WorldInitial();
else
{
HardtoFindPath = 1;
gotoxy(1,MAXY+1);
printf(」 「);
}
}
if(home.amount=home.TargetFood)
{
gettime(&endtime);
KeyPress = WaitForKey(60);
DispPlayTime();
WaitForKey(10);
WorldInitial();
}
else if(kbhit())
{
KeyPress = getch();
DealKey(KeyPress);
}
else KeyPress = NULL;
}
while(KeyPress!=ESC);
gettime(&endtime);
DispPlayTime();
WaitForKey(10);
clrscr();
ResetCur();
}
I. 什麼是蟻群演算法,神經網路演算法,遺傳演算法
蟻群演算法又稱螞蟻演算法,是一種用來在圖中尋找優化路徑的機率型演算法。它由Marco Dorigo於1992年在他的博士論文中提出,其靈感來源於螞蟻在尋找食物過程中發現路徑的行為。蟻群演算法是一種模擬進化演算法,初步的研究表明該演算法具有許多優良的性質.針對PID控制器參數優化設計問題,將蟻群演算法設計的結果與遺傳演算法設計的結果進行了比較,數值模擬結果表明,蟻群演算法具有一種新的模擬進化優化方法的有效性和應用價值。
神經網路
思維學普遍認為,人類大腦的思維分為抽象(邏輯)思維、形象(直觀)思維和靈感(頓悟)思維三種基本方式。
邏輯性的思維是指根據邏輯規則進行推理的過程;它先將信息化成概念,並用符號表示,然後,根據符號運算按串列模式進行邏輯推理;這一過程可以寫成串列的指令,讓計算機執行。然而,直觀性的思維是將分布式存儲的信息綜合起來,結果是忽然間產生想法或解決問題的辦法。這種思維方式的根本之點在於以下兩點:1.信息是通過神經元上的興奮模式分布儲在網路上;2.信息處理是通過神經元之間同時相互作用的動態過程來完成的。
人工神經網路就是模擬人思維的第二種方式。這是一個非線性動力學系統,其特色在於信息的分布式存儲和並行協同處理。雖然單個神經元的結構極其簡單,功能有限,但大量神經元構成的網路系統所能實現的行為卻是極其豐富多彩的。
神經網路的研究內容相當廣泛,反映了多學科交叉技術領域的特點。目前,主要的研究工作集中在以下幾個方面:
(1)生物原型研究。從生理學、心理學、解剖學、腦科學、病理學等生物科學方面研究神經細胞、神經網路、神經系統的生物原型結構及其功能機理。
(2)建立理論模型。根據生物原型的研究,建立神經元、神經網路的理論模型。其中包括概念模型、知識模型、物理化學模型、數學模型等。
(3)網路模型與演算法研究。在理論模型研究的基礎上構作具體的神經網路模型,以實現計算機饃擬或准備製作硬體,包括網路學習演算法的研究。這方面的工作也稱為技術模型研究。
(4)人工神經網路應用系統。在網路模型與演算法研究的基礎上,利用人工神經網路組成實際的應用系統,例如,完成某種信號處理或模式識別的功能、構作專家系統、製成機器人等等。
縱觀當代新興科學技術的發展歷史,人類在征服宇宙空間、基本粒子,生命起源等科學技術領域的進程中歷經了崎嶇不平的道路。我們也會看到,探索人腦功能和神經網路的研究將伴隨著重重困難的克服而日新月異。
遺傳演算法,是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法,它最初由美國Michigan大學J.Holland教授於1975年首先提出來的,並出版了頗有影響的專著《Adaptation in Natural and Artificial Systems》,GA這個名稱才逐漸為人所知,J.Holland教授所提出的GA通常為簡單遺傳演算法(SGA)。
J. 哪本python書立有蟻群演算法
簡介
蟻群演算法(ant colony optimization, ACO),又稱螞蟻演算法,是一種用來在圖中尋找優化路徑的機率型演算法。它由Marco Dorigo於1992年在他的博士論文中提出,其靈感來源於螞蟻在尋找食物過程中發現路徑的行為。蟻群演算法是一種模擬進化演算法,初步的研究表明該演算法具有許多優良的性質。針對PID控制器參數優化設計問題,將蟻群演算法設計的結果與遺傳演算法設計的結果進行了比較,數值模擬結果表明,蟻群演算法具有一種新的模擬進化優化方法的有效性和應用價值。
定義
各個螞蟻在沒有事先告訴他們食物在什麼地方的前提下開始尋找食物。當一隻找到食物以後,它會向環境釋放一種揮發性分泌物pheromone (稱為信息素,該物質隨著時間的推移會逐漸揮發消失,信息素濃度的大小表徵路徑的遠近)來實現的,吸引其他的螞蟻過來,這樣越來越多的螞蟻會找到食物。有些螞蟻並沒有像其它螞蟻一樣總重復同樣的路,他們會另闢蹊徑,如果另開辟的道路比原來的其他道路更短,那麼,漸漸地,更多的螞蟻被吸引到這條較短的路上來。最後,經過一段時間運行,可能會出現一條最短的路徑被大多數螞蟻重復著。
解決的問題
三維地形中,給出起點和重點,找到其最優路徑。
程序代碼:
numpy as npimport matplotlib.pyplot as plt%pylabcoordinates = np.array([[565.0,575.0],[25.0,185.0],[345.0,750.0],[945.0,685.0],[845.0,655.0],[880.0,660.0],[25.0,230.0],[525.0,1000.0],[580.0,1175.0],[650.0,1130.0],[1605.0,620.0],[1220.0,580.0],[1465.0,200.0],[1530.0, 5.0],[845.0,680.0],[725.0,370.0],[145.0,665.0],[415.0,635.0],[510.0,875.0],[560.0,365.0],[300.0,465.0],[520.0,585.0],[480.0,415.0],[835.0,625.0],[975.0,580.0],[1215.0,245.0],[1320.0,315.0],[1250.0,400.0],[660.0,180.0],[410.0,250.0],[420.0,555.0],[575.0,665.0],[1150.0,1160.0],[700.0,580.0],[685.0,595.0],[685.0,610.0],[770.0,610.0],[795.0,645.0],[720.0,635.0],[760.0,650.0],[475.0,960.0],[95.0,260.0],[875.0,920.0],[700.0,500.0],[555.0,815.0],[830.0,485.0],[1170.0, 65.0],[830.0,610.0],[605.0,625.0],[595.0,360.0],[1340.0,725.0],[1740.0,245.0]])def getdistmat(coordinates):num = coordinates.shape[0]distmat = np.zeros((52,52))for i in range(num):for j in range(i,num):distmat[i][j] = distmat[j][i]=np.linalg.norm(coordinates[i]-coordinates[j])return distmatdistmat = getdistmat(coordinates)numant = 40 #螞蟻個數numcity = coordinates.shape[0] #城市個數alpha = 1 #信息素重要程度因子beta = 5 #啟發函數重要程度因子rho = 0.1 #信息素的揮發速度Q = 1iter = 0itermax = 250etatable = 1.0/(distmat+np.diag([1e10]*numcity)) #啟發函數矩陣,表示螞蟻從城市i轉移到矩陣j的期望程度pheromonetable = np.ones((numcity,numcity)) # 信息素矩陣pathtable = np.zeros((numant,numcity)).astype(int) #路徑記錄表distmat = getdistmat(coordinates) #城市的距離矩陣lengthaver = np.zeros(itermax) #各代路徑的平均長度lengthbest = np.zeros(itermax) #各代及其之前遇到的最佳路徑長度pathbest = np.zeros((itermax,numcity)) # 各代及其之前遇到的最佳路徑長度while iter < itermax:# 隨機產生各個螞蟻的起點城市if numant <= numcity:#城市數比螞蟻數多pathtable[:,0] = np.random.permutation(range(0,numcity))[:numant]else: #螞蟻數比城市數多,需要補足pathtable[:numcity,0] = np.random.permutation(range(0,numcity))[:]pathtable[numcity:,0] = np.random.permutation(range(0,numcity))[:numant-numcity]length = np.zeros(numant) #計算各個螞蟻的路徑距離for i in range(numant):visiting = pathtable[i,0] # 當前所在的城市#visited = set() #已訪問過的城市,防止重復#visited.add(visiting) #增加元素unvisited = set(range(numcity))#未訪問的城市unvisited.remove(visiting) #刪除元素for j in range(1,numcity):#循環numcity-1次,訪問剩餘的numcity-1個城市#每次用輪盤法選擇下一個要訪問的城市listunvisited = list(unvisited)probtrans = np.zeros(len(listunvisited))for k in range(len(listunvisited)):probtrans[k] = np.power(pheromonetable[visiting][listunvisited[k]],alpha)*np.power(etatable[visiting][listunvisited[k]],alpha)cumsumprobtrans = (probtrans/sum(probtrans)).cumsum()cumsumprobtrans -= np.random.rand()k = listunvisited[find(cumsumprobtrans>0)[0]] #下一個要訪問的城市pathtable[i,j] = kunvisited.remove(k)#visited.add(k)length[i] += distmat[visiting][k]visiting = klength[i] += distmat[visiting][pathtable[i,0]] #螞蟻的路徑距離包括最後一個城市和第一個城市的距離#print length# 包含所有螞蟻的一個迭代結束後,統計本次迭代的若干統計參數lengthaver[iter] = length.mean()if iter == 0:lengthbest[iter] = length.min()pathbest[iter] = pathtable[length.argmin()].()else:if length.min() > lengthbest[iter-1]:lengthbest[iter] = lengthbest[iter-1]pathbest[iter] = pathbest[iter-1].()else:lengthbest[iter] = length.min()pathbest[iter] = pathtable[length.argmin()].()# 更新信息素changepheromonetable = np.zeros((numcity,numcity))for i in range(numant):for j in range(numcity-1):changepheromonetable[pathtable[i,j]][pathtable[i,j+1]] += Q/distmat[pathtable[i,j]][pathtable[i,j+1]]changepheromonetable[pathtable[i,j+1]][pathtable[i,0]] += Q/distmat[pathtable[i,j+1]][pathtable[i,0]]pheromonetable = (1-rho)*pheromonetable + changepheromonetableiter += 1 #迭代次數指示器+1#觀察程序執行進度,該功能是非必須的if (iter-1)%20==0:print iter-1# 做出平均路徑長度和最優路徑長度fig,axes = plt.subplots(nrows=2,ncols=1,figsize=(12,10))axes[0].plot(lengthaver,'k',marker = u'')axes[0].set_title('Average Length')axes[0].set_xlabel(u'iteration')axes[1].plot(lengthbest,'k',marker = u'')axes[1].set_title('Best Length')axes[1].set_xlabel(u'iteration')fig.savefig('Average_Best.png',dpi=500,bbox_inches='tight')plt.close()#作出找到的最優路徑圖bestpath = pathbest[-1]plt.plot(coordinates[:,0],coordinates[:,1],'r.',marker=u'$cdot$')plt.xlim([-100,2000])plt.ylim([-100,1500])for i in range(numcity-1):#m,n = bestpath[i],bestpath[i+1]print m,nplt.plot([coordinates[m][0],coordinates[n][0]],[coordinates[m][1],coordinates[n][1]],'k')plt.plot([coordinates[bestpath[0]][0],coordinates[n][0]],[coordinates[bestpath[0]][1],coordinates[n][1]],'b')ax=plt.gca()ax.set_title("Best Path")ax.set_xlabel('X axis')ax.set_ylabel('Y_axis')plt.savefig('Best Path.png',dpi=500,bbox_inches='tight')plt.close()