資源簡介
本實驗利用蟻群算法,對TSP旅行商問題進行應(yīng)用和優(yōu)化。
隨機生成不同的城市序列。
選取不同的參數(shù),驗證蟻群算法的效率。
對蟻群算法進行改進,改造成精英螞蟻算法,并進行分析。
輸入:不同維度的城市序列
輸出:最優(yōu)路徑所經(jīng)過的城市序列以及最優(yōu)路徑長度。

代碼片段和文件信息
%%?旅行商問題(TSP)優(yōu)化
%%?清空環(huán)境變量
clear?all
clc
tic%計算運行事件
%%?導(dǎo)入數(shù)據(jù)
%load?citys_data.mat
load?data
citys=city30;
%%?計算城市間相互距離
fprintf(‘Computing?Distance?Matrix...?\n‘);
n?=?size(citys1);%一共多少個城市
D?=?zeros(nn);%鄰接矩陣
for?i?=?1:n
????for?j?=?1:n
????????if?i?~=?j?%判斷?i?的值是否等于j,若等于1,則返回0;否則,返回1
????????????D(ij)?=?sqrt(sum((citys(i:)?-?citys(j:)).^2));%存放第i點到第j點的距離(一次計算一個點)
????????else
????????????D(ij)?=?1e-4;?%i==j處,(1.0000e-04)對角線?(兩側(cè)對稱)
????????end
????end
end
%%?初始化參數(shù)
fprintf(‘Initializing?Parameters...?\n‘);
m?=?30;??????????????????????????????%?螞蟻數(shù)量
alpha?=?1;???????????????????????????%?信息素重要程度因子
beta?=?2;????????????????????????????%?啟發(fā)函數(shù)重要程度因子
rho?=?0.7;???????????????????????????%?信息素?fù)]發(fā)因子
Q?=?1;???????????????????????????????%?常系數(shù)
Eta?=?1./D;??????????????????????????%?啟發(fā)函數(shù)
Tau?=?ones(nn);?????????????????????%?信息素矩陣?%初始化為全1矩陣
Table?=?zeros(mn);??????????????????%?路徑記錄表
iter?=?1;????????????????????????????%?迭代次數(shù)初值
iter_max?=?150;??????????????????????%?最大迭代次數(shù)
Route_best?=?zeros(iter_maxn);??????%?各代最佳路徑
Length_best?=?zeros(iter_max1);?????%?各代最佳路徑的長度
Length_ave?=?zeros(iter_max1);??????%?各代路徑的平均長度
e=0.3;
%%?迭代尋找最佳路徑
figure;
while?iter?<=?iter_max
????%%
????flag=0;
????%%
????fprintf(‘迭代第%d次\n‘iter);
????%?隨機產(chǎn)生各個螞蟻的起點城市
????start?=?zeros(m1);?%m*1的全0矩陣
????for?i?=?1:m
????????temp?=?randperm(n);?%1*n矩陣?隨機打亂一個數(shù)字序列(1-n)
????????start(i)?=?temp(1);?%當(dāng)前隨機城市
????end
????Table(:1)?=?start;?%放入第一列
????%?構(gòu)建解空間
????citys_index?=?1:n;%1*n矩陣(1-n)
????for?i?=?1:m?%第i只螞蟻
????????%?逐個城市路徑選擇
????????for?j?=?2:n?%從第2個城市開始,第1個城市已經(jīng)隨機生成
????????????tabu?=?Table(i1:(j?-?1));???????????%?已訪問的城市集合(禁忌表)
????????????%~ismember(citys_indextabu)是看矩陣citys_index中的數(shù)是不是矩陣citys_index中的成員,是的話結(jié)果返回0,不是返回1
????????????allow_index?=?~ismember(citys_indextabu);%訪問過的地方未0
????????????allow?=?citys_index(allow_index);??%?待訪問的城市集合(訪問過的城市刪掉了,因為為0)
????????????P?=?allow;
????????????%?計算城市間轉(zhuǎn)移概率
????????????%剩下的城市
????????????for?k?=?1:length(allow)
????????????????P(k)?=?Tau(tabu(end)allow(k))^alpha?*?Eta(tabu(end)allow(k))^beta;%tabu(end)當(dāng)前城市
????????????end
????????????P?=?P/sum(P);
????????????%?輪盤賭法選擇下一個訪問城市
????????????Pc?=?cumsum(P);
????????????%Pc(1)為1.7665e-05?其實為0.0000,為了防止錯位變成一個很小的值?sum(P)=1
????????????target_index?=?find(Pc?>=?rand);?%備選城市(滿足條件的,不是剩下的所有城市)
????????????target?=?allow(target_index(1));%訪問備選城市中的第一個
????????????Table(ij)?=?target;%接下來要訪問的城市
????????end
????end
????%?計算各個螞蟻的路徑距離
????Length?=?zeros(m1);%m*1矩陣
????for?i?=?1:m?%第i只螞蟻
????????Route?=?Table(i:);?%保存當(dāng)前螞蟻的路徑
????????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));?%m*1矩陣,保存每只螞蟻的總路徑
????end
????%?計算最短路徑距離及平均距離
????%第iter代螞蟻
????if?iter?==?1
????????[min_Lengthmin_index]?=?min(Length);
????????Length_best(iter)?=?min_Length;
????????Length_ave(iter)?=?mean(Length);
????????Route_best(iter:)?=
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-12-13?10:09??sy_蟻群算法\
?????目錄???????????0??2018-12-13?10:09??sy_蟻群算法\ACO\
?????目錄???????????0??2018-12-19?22:54??sy_蟻群算法\ACO\ACO\
?????文件????????6364??2018-12-19?21:48??sy_蟻群算法\ACO\ACO\ACO.m
?????文件?????????309??2013-08-15?08:34??sy_蟻群算法\ACO\ACO\citys_data.mat
?????文件????????1024??2018-12-18?14:31??sy_蟻群算法\ACO\ACO\data.mat
?????文件?????????240??2018-12-18?14:31??sy_蟻群算法\ACO\ACO\testcity.m
評論
共有 條評論