計(jì)算智能_蟻群算法

姓名:高潔

學(xué)號:19021210933

轉(zhuǎn)載自:https://blog.csdn.net/XYYHHH11/article/details/102917942

【嵌牛導(dǎo)讀】蟻群算法是對自然界螞蟻的尋徑方式進(jìn)行模似而得出的一種仿生算法:螞蟻在運(yùn)動過程中,能夠在它所經(jīng)過的路徑上留下信息素(pheromone)的物質(zhì)進(jìn)行信息傳遞,而螞蟻在運(yùn)動過程中能夠感知這種物質(zhì)澈蟆,并以此指導(dǎo)自己的運(yùn)動方向炸站。

【嵌牛鼻子】蟻群算法 信息素重要程度因子 啟發(fā)函數(shù)重要程度因子?信息素?fù)]發(fā)因子?

【嵌牛提問】蟻群算法的原理是什么?該算法如何實(shí)現(xiàn)?

【嵌牛正文】

1、基本原理

????蟻群算法是對自然界螞蟻的尋徑方式進(jìn)行模似而得出的 一種仿生算法:螞蟻在運(yùn)動過程中,能夠在它所經(jīng)過的路 徑上留下信息素(pheromone)的物質(zhì)進(jìn)行信息傳遞司致,而螞蟻在運(yùn)動過程中能夠感知這種物質(zhì),并以此指導(dǎo)自己的 運(yùn)動方向聋迎。由大量螞蟻組成的蟻群集體行為便表現(xiàn)出一種信息正反饋現(xiàn)象:某一路徑上走過的螞蟻越多脂矫,則后來者選擇該路徑的概率就越大。

2霉晕、基本概念和流程

????在ACO 算法中庭再,人工螞蟻實(shí)際上代表的是一個解的隨機(jī)構(gòu)建過程,從最初的空解開始娄昆,通過不斷地向部分解添加解的成分而構(gòu)建出一個完整的解佩微。

????? 解的構(gòu)建:每只螞蟻?zhàn)畛醵紡碾S機(jī)選擇出來的城市出發(fā),每經(jīng)過一次迭代螞蟻就向解中添加一個還沒有訪問過的城市萌焰。當(dāng)所有城市都被螞蟻訪問過之后哺眯,解的構(gòu)建就終止。對于每只螞蟻k扒俯,路徑記憶向量按照訪問順序記錄了所有k已經(jīng)經(jīng)過的城市序號奶卓。設(shè)螞蟻k當(dāng)前所在城市為i一疯, 則其選擇城市j作為下一個訪問對象的概率為:

圖1 訪問下一個對象的概率

????? 信息素更新:這里m是螞蟻個數(shù), ρ是信息素的蒸發(fā)率,規(guī)定0≤ρ≤1,在AS中通常設(shè)置為ρ=0.5夺姑,△ζij是第k只螞蟻在它經(jīng)過的邊上釋放的信息素量墩邀,它等于螞蟻k本輪構(gòu)建路徑長度的倒數(shù)。C表示路徑長度盏浙,它是Rk中所有邊的長度和眉睹。

圖2 信息素更新公式

3、流程圖和偽代碼

圖3 蟻群算法流程圖

4废膘、代碼實(shí)現(xiàn)

%% 導(dǎo)入數(shù)據(jù)

load citys_data.mat

%% 計(jì)算城市間相互距離

fprintf('Computing Distance Matrix... \n');

n = size(citys,1);

D = zeros(n,n);

for i = 1:n

? ? for j = 1:n

? ? ? ? if i ~= j

? ? ? ? ? ? D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));

? ? ? ? else

? ? ? ? ? ? D(i,j) = 1e-4;? ? ?

? ? ? ? end

? ? end? ?

end

%% 初始化參數(shù)

fprintf('Initializing Parameters... \n');

m = 75;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? % 螞蟻數(shù)量

alpha = 1;? ? ? ? ? ? ? ? ? ? ? ? ? % 信息素重要程度因子

beta = 5;? ? ? ? ? ? ? ? ? ? ? ? ? ? % 啟發(fā)函數(shù)重要程度因子

rho = 0.5;? ? ? ? ? ? ? ? ? ? ? ? ? % 信息素?fù)]發(fā)因子

Q = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? % 常系數(shù)

Eta = 1./D;? ? ? ? ? ? ? ? ? ? ? ? ? % 啟發(fā)函數(shù)

Tau = ones(n,n);? ? ? ? ? ? ? ? ? ? % 信息素矩陣

Table = zeros(m,n);? ? ? ? ? ? ? ? ? % 路徑記錄表

iter = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? % 迭代次數(shù)初值

iter_max = 160;? ? ? ? ? ? ? ? ? ? ? % 最大迭代次數(shù)

Route_best = zeros(iter_max,n);? ? ? % 各代最佳路徑? ? ?

Length_best = zeros(iter_max,1);? ? % 各代最佳路徑的長度?

Length_ave = zeros(iter_max,1);? ? ? % 各代路徑的平均長度?

%% 迭代尋找最佳路徑

figure;

while iter <= iter_max

? ? fprintf('迭代第%d次\n',iter);

? ? % 隨機(jī)產(chǎn)生各個螞蟻的起點(diǎn)城市

? ? ? start = zeros(m,1);

? ? ? for i = 1:m

? ? ? ? ? temp = randperm(n);

? ? ? ? ? start(i) = temp(1);

? ? ? end

? ? ? Table(:,1) = start;

? ? ? % 構(gòu)建解空間

? ? ? citys_index = 1:n;

? ? ? % 逐個螞蟻路徑選擇

? ? ? for i = 1:m

? ? ? ? ? % 逐個城市路徑選擇

? ? ? ? for j = 2:n

? ? ? ? ? ? tabu = Table(i,1:(j - 1));? ? ? ? ? % 已訪問的城市集合(禁忌表)

? ? ? ? ? ? allow_index = ~ismember(citys_index,tabu);

? ? ? ? ? ? allow = citys_index(allow_index);? % 待訪問的城市集合

? ? ? ? ? ? P = allow;

? ? ? ? ? ? % 計(jì)算城市間轉(zhuǎn)移概率

? ? ? ? ? ? for k = 1:length(allow)

? ? ? ? ? ? ? ? P(k) = Tau(tabu(end),allow(k))^alpha * Eta(tabu(end),allow(k))^beta;

? ? ? ? ? ? end

? ? ? ? ? ? P = P/sum(P);

? ? ? ? ? ? % 輪盤賭法選擇下一個訪問城市

? ? ? ? ? ? Pc = cumsum(P);? ?

? ? ? ? ? ? target_index = find(Pc >= rand);

? ? ? ? ? ? target = allow(target_index(1));

? ? ? ? ? ? Table(i,j) = target;

? ? ? ? end

? ? ? end

? ? ? % 計(jì)算各個螞蟻的路徑距離

? ? ? Length = zeros(m,1);

? ? ? for i = 1:m

? ? ? ? ? Route = Table(i,:);

? ? ? ? ? for j = 1:(n - 1)

? ? ? ? ? ? ? Length(i) = Length(i) + D(Route(j),Route(j + 1));

? ? ? ? ? end

? ? ? ? ? Length(i) = Length(i) + D(Route(n),Route(1));

? ? ? end

? ? ? % 計(jì)算最短路徑距離及平均距離

? ? ? if iter == 1

? ? ? ? ? [min_Length,min_index] = min(Length);

? ? ? ? ? Length_best(iter) = min_Length;?

? ? ? ? ? Length_ave(iter) = mean(Length);

? ? ? ? ? Route_best(iter,:) = Table(min_index,:);

? ? ? else

? ? ? ? ? [min_Length,min_index] = min(Length);

? ? ? ? ? Length_best(iter) = min(Length_best(iter - 1),min_Length);

? ? ? ? ? Length_ave(iter) = mean(Length);

? ? ? ? ? if Length_best(iter) == min_Length

? ? ? ? ? ? ? Route_best(iter,:) = Table(min_index,:);

? ? ? ? ? else

? ? ? ? ? ? ? Route_best(iter,:) = Route_best((iter-1),:);

? ? ? ? ? end

? ? ? end

? ? ? % 更新信息素

? ? ? Delta_Tau = zeros(n,n);

? ? ? % 逐個螞蟻計(jì)算

? ? ? for i = 1:m

? ? ? ? ? % 逐個城市計(jì)算

? ? ? ? ? for j = 1:(n - 1)

? ? ? ? ? ? ? Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1)) + Q/Length(i);

? ? ? ? ? end

? ? ? ? ? Delta_Tau(Table(i,n),Table(i,1)) = Delta_Tau(Table(i,n),Table(i,1)) + Q/Length(i);

? ? ? end

? ? ? Tau = (1-rho) * Tau + Delta_Tau;

? ? % 迭代次數(shù)加1竹海,清空路徑記錄表

%? figure;

%最佳路徑的迭代變化過程

? ? [Shortest_Length,index] = min(Length_best(1:iter));

? ? Shortest_Route = Route_best(index,:);

? ? plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...

? ? [citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-');

? ? pause(0.3);

? ? iter = iter + 1;

? ? Table = zeros(m,n);

% end

end

%% 結(jié)果顯示

[Shortest_Length,index] = min(Length_best);

Shortest_Route = Route_best(index,:);

disp(['最短距離:' num2str(Shortest_Length)]);

disp(['最短路徑:' num2str([Shortest_Route Shortest_Route(1)])]);

%% 繪圖

figure(1)

plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...

? ? [citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-');

grid on

for i = 1:size(citys,1)

? ? text(citys(i,1),citys(i,2),['? ' num2str(i)]);

end

text(citys(Shortest_Route(1),1),citys(Shortest_Route(1),2),'? ? ? 起點(diǎn)');

text(citys(Shortest_Route(end),1),citys(Shortest_Route(end),2),'? ? ? 終點(diǎn)');

xlabel('城市位置橫坐標(biāo)')

ylabel('城市位置縱坐標(biāo)')

title(['蟻群算法優(yōu)化路徑(最短距離:' num2str(Shortest_Length) ')'])

figure(2)

plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:')

legend('最短距離','平均距離')

xlabel('迭代次數(shù)')

ylabel('距離')

title('各代最短距離與平均距離對比')

5、參數(shù)調(diào)試記錄

? ??蟻群算法主要有5個參數(shù)

????alpha:信息素重要程度因子

????beta:啟發(fā)函數(shù)重要程度因子

????rho :信息素?fù)]發(fā)因子

????m :螞蟻數(shù)量

????iter_max:迭代次數(shù)

????這次主要研究alpha丐黄,beta斋配,rho對結(jié)果的影響,因此螞蟻數(shù)量m固定為75灌闺,迭代次數(shù)iter_max固定為200次艰争。

????用C語言寫的簡單生成隨機(jī)數(shù)程序,生成了40個點(diǎn)坐標(biāo)(X∈[0,6000],Y∈[0,5000])桂对,代表40個城市甩卓。

圖4 前20個隨機(jī)數(shù)
圖5 后20個隨機(jī)數(shù)

控制啟發(fā)函數(shù)重要程度因子beta和信息素?fù)]發(fā)因子rho不變(beta=5,rho=0.5),改變信息素重要程度因子alpha蕉斜。

????alpha=1:

圖6 alpha為1

????最短距離:28558.1822

????alpha=2:

圖7 alpha為2

????最短距離:28898.1839

????alpha=3:

圖8 alpha為3

????最短距離:29094.3054

????alpha=4:

圖9 alpha為4

????最短距離:29094.3054

分析

????alpha在1的時候最短距離最小猛频,但是當(dāng)alpha小于1的時候沒有試。隨著alpha增加蛛勉,最短距離越來越小,平均距離收斂得越快睦柴,但最后都穩(wěn)定在3.4左右诽凌。

控制信息素重要程度因子alpha和信息素?fù)]發(fā)因子rho不變(alpha=3,rho=0.5)坦敌,改變啟發(fā)函數(shù)重要程度因子beta

????beta=1:

圖10 beta為1

????最短距離:30344.8553

????beta=2:

圖11 beta為2

????最短距離:29145.7761

????beta=4:

圖12 beta為4

????最短距離:28978.882

????beta=6:

圖13 beta為6

????最短距離:29094.3054

分析

????當(dāng)beta為4的時候侣诵,最短距離最小,當(dāng)beta為6時狱窘,平均距離最小杜顺,在3.4以下.

控制信息素重要程度因子alpha和啟發(fā)函數(shù)重要程度因子beta(alpha=1,beta=5)蘸炸,改變信息素?fù)]發(fā)因子rho

????rho=0.1:

圖14 rho為0.1

????最短距離:28898.1839

????rho=0.3:

圖15 rho為0.3

?????最短距離:29047.2567

?????rho=0.7:

圖16 rho為0.7

????最短距離:28542.8334

分析

????當(dāng)rho為0.7左右時躬络,最短距離最短,并且rho越大時搭儒,平均距離收斂得越快穷当。

6提茁、結(jié)論

????1、alpha信息素重要程度因子馁菜,alpha越大茴扁,最短距離越大,但收斂速度越快

????2汪疮、beta啟發(fā)函數(shù)重要程度因子峭火,除了beta特別小以外,beta對最短距離影響不大智嚷,在一定區(qū)間里面浮動

????3卖丸、rho信息素?fù)]發(fā)因子,隨著rho增加纤勒,收斂速度變快坯苹,并且最短距離變短,但是如果當(dāng)?shù)螖?shù)夠多的話摇天,最短距離會穩(wěn)定下來粹湃。

????4、因?yàn)檫@次實(shí)驗(yàn)有40個城市泉坐,但是只迭代了200次为鳄,并且對alpha和beta取值范圍不是很懂,所以導(dǎo)致結(jié)果基本沒有出現(xiàn)最優(yōu)解腕让,只是都卡在了局部最優(yōu)孤钦,迭代次數(shù)我覺得應(yīng)該要500次左右,才能得出完整的結(jié)論纯丸。

????5偏形、TSP問題是一類經(jīng)典的組合優(yōu)化問題,即在給定城市個數(shù)和各城市之間距離的條件下觉鼻,找到一條遍歷所有城市且每個城市只能訪問一次的總路程最短的路線俊扭。蟻群算法在TSP問題應(yīng)用中取得了良好的效果,但是也存在一些不足:

????①比如alpha和beta設(shè)置不當(dāng)坠陈,導(dǎo)致求解質(zhì)量很差萨惑。

????②基本蟻群算法計(jì)算量大,求解所需時間較長仇矾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庸蔼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贮匕,更是在濱河造成了極大的恐慌姐仅,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萍嬉,居然都是意外死亡乌昔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門壤追,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磕道,“玉大人,你說我怎么就攤上這事行冰∧缃叮” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵悼做,是天一觀的道長疯特。 經(jīng)常有香客問我,道長肛走,這世上最難降的妖魔是什么漓雅? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮朽色,結(jié)果婚禮上邻吞,老公的妹妹穿的比我還像新娘。我一直安慰自己葫男,他們只是感情好抱冷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梢褐,像睡著了一般旺遮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盈咳,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天耿眉,我揣著相機(jī)與錄音,去河邊找鬼鱼响。 笑死跷敬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的热押。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斤寇,長吁一口氣:“原來是場噩夢啊……” “哼桶癣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娘锁,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤牙寞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體间雀,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悔详,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惹挟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茄螃。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖连锯,靈堂內(nèi)的尸體忽然破棺而出归苍,到底是詐尸還是另有隱情,我是刑警寧澤运怖,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布拼弃,位于F島的核電站,受9級特大地震影響摇展,放射性物質(zhì)發(fā)生泄漏吻氧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一咏连、第九天 我趴在偏房一處隱蔽的房頂上張望盯孙。 院中可真熱鬧,春花似錦捻勉、人聲如沸镀梭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽报账。三九已至,卻和暖如春埠偿,著一層夾襖步出監(jiān)牢的瞬間透罢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工冠蒋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羽圃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像飒筑,于是被迫代替她去往敵國和親黎比。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353