代码如下:
citys = [18.4700 95.1000
16.4700 94.6400
20.0900 94.5400
14.3900 93.3700
25.2300 97.2400
22.0000 93.0500
23.4700 92.0200
16.2000 96.2900
17.3000 97.3800
13.0500 98.1200
15.5300 97.3800
24.5200 95.5900
16.4100 97.1300
15.0900 92.5500
18.0000 98.0000];
%% 3、计算距离矩阵
D = Distance(citys); % 计算距离矩阵
n = size(D, 1); % 获取所有城市的个数
m = 50; % 蚂蚁对数,每对蚂蚁分为蚂蚁1与蚂蚁2、3、4、5
alpha = 1; % 信息素重要程度因子
beta = 5; % 启发函数重要程度因子
rho = 0.1; % 信息素挥发因子
Q = 1; % 常系数(信息素释放量)
Eta = 1./D; % 启发函数
Tau = ones(n,n); % 信息素矩阵
Table1 = zeros(m,n); % 蚂蚁1路径记录表
Table2 = zeros(m,n); % 蚂蚁2路径记录表
Table3 = zeros(m, n); % 路径记录表
Table4 = zeros(m, n); % 路径记录表
Table5= zeros(m, n); % 路径记录表
iter = 1; % 迭代次数初值
iter_max = 200; % 最大迭代次数
Route_best1 = zeros(iter_max,n); % 蚂蚁1各代最佳路径
Route_best2 = zeros(iter_max,n); % 蚂蚁2各代最佳路径
Route_best3 = zeros(iter_max,n); % 蚂蚁3各代最佳路径
Route_best4 = zeros(iter_max,n); % 蚂蚁4各代最佳路径
Route_best5 = zeros(iter_max,n); % 蚂蚁5各代最佳路径
Length_best = zeros(iter_max,1); % 各代最佳路径的长度
Length_ave = zeros(iter_max,1); % 各代路径的平均长度
while iter <= iter_max
start = ones(m,1)+1; %初始出发城市为2
Table1(:,1) = start;
Table2(:,1) = start;
Table3(:,1) = start;
Table4(:,1) = start;
Table5(:,1) = start;
citys_index = 1:n;
% 逐个蚂蚁路径选择
for i = 1:m
% 逐个城市路径选择
for j = 2:n
tabu1 = Table1(i,1:(j - 1)); %蚂蚁1已访问的城市集合
tabu1(tabu1==0) = []; %把表中的0元素舍去,因为无意义
tabu2 = Table2(i,1:(j - 1)); %蚂蚁2已访问的城市集合
tabu2(tabu2==0) = []; %把表中的0元素舍去,因为无意义
tabu3 = Table3(i,1:(j - 1)); %蚂蚁3已访问的城市集合
tabu3(tabu3==0) = []; %把表中的0元素舍去,因为无意义
tabu4 = Table4(i,1:(j - 1)); %蚂蚁4已访问的城市集合
tabu4(tabu4==0) = []; %把表中的0元素舍去,因为无意义
tabu5 = Table5(i,1:(j - 1)); %蚂蚁5已访问的城市集合
tabu5(tabu5==0) = []; %把表中的0元素舍去,因为无意义
tabu = [tabu1 tabu2 tabu3 tabu4 tabu5];
allow_index = ~ismember(citys_index,tabu);
allow = citys_index(allow_index); %待访问的城市集合
P1 = allow;
P2 = allow;
P3 = allow;
P4 = allow;
P5 = allow;
% 计算城市间转移概率
for k = 1:length(allow)
P1(k) = Tau(tabu1(end),allow(k))^alpha * Eta(tabu1(end),allow(k))^beta;
P2(k) = Tau(tabu2(end),allow(k))^alpha * Eta(tabu2(end),allow(k))^beta;
P3(k) = Tau(tabu3(end),allow(k))^alpha * Eta(tabu3(end),allow(k))^beta;
P4(k) = Tau(tabu4(end),allow(k))^alpha * Eta(tabu4(end),allow(k))^beta;
P5(k) = Tau(tabu4(end),allow(k))^alpha * Eta(tabu5(end),allow(k))^beta;
end
P1 = P1/sum(P1);
P2 = P2/sum(P2);
P3 = P3/sum(P3);
P4 = P4/sum(P4);
P5 = P5/sum(P5);
% 轮盘赌法选择下一个访问城市
Pc1 = cumsum(P1);
Pc2 = cumsum(P2);
Pc3 = cumsum(P3);
Pc4 = cumsum(P4);
Pc5=cumsum(P5);
target_index1 = find(Pc1 >= rand);
target_index2 = find(Pc2 >= rand);
target_index3 = find(Pc3 >= rand);
target_index4 = find(Pc4 >= rand);
target_index5 = find(Pc5 >= rand);
target1 = allow(target_index1(1));
target2 = allow(target_index2(1));
target3 = allow(target_index3(1));
target4 = allow(target_index4(1));
target5 = allow(target_index5(1));
% 计算蚂蚁1与蚂蚁2到下一个城市的路径长度,选择路径长度较少的蚂蚁进行行走
% 假设蚂蚁1行走,则蚂蚁1的路径表将添加下一个城市的标号,而蚂蚁2的路径表将添加0
lengthant1 = D(tabu1(end), target1);
lengthant2 = D(tabu2(end), target2);
lengthant3 = D(tabu3(end), target3);
lengthant4 = D(tabu4(end), target4);
lengthant5 = D(tabu5(end), target5);
if( lengthant1 <= lengthant2&& lengthant1<=lengthant3 && lengthant1<= lengthant4 && lengthant1 <= lengthant5 )
Table1(i,j) = target1;
end
if(lengthant2 <= lengthant1 && lengthant2 <=lengthant3 &&lengthant2 <=lengthant4 && lengthant2 <= lengthant5 )
Table2(i,j) = target2;
end
if(lengthant3 <= lengthant1 && lengthant3 <= lengthant2 && lengthant3 <= lengthant4 && lengthant3 <= lengthant5)
Table3(i,j)=target3;
end
if (lengthant4 <= lengthant1 && lengthant4 <= lengthant2 && lengthant4 <= lengthant3 && lengthant4 <=lengthant5)
Table4(i,j)=target4;
end
if (lengthant5<= lengthant1 && lengthant5 <= lengthant2 && lengthant5 <= lengthant3 && lengthant5 <= lengthant4 )
Table5(i, j) = target5;
end
end
end
% 计算各个蚂蚁对的路径距离
Length1 = zeros(m,1); % 蚂蚁1路径距离之和
Length2 = zeros(m,1); % 蚂蚁2路径距离之和
Length3 = zeros(m,1); % 蚂蚁3路径距离之和
Length4 = zeros(m,1); % 蚂蚁4路径距离之和
Length5 = zeros(m,1); % 蚂蚁5路径距离之和
for i = 1:m
Route1 = Table1(i,:);
Route1(Route1 == 0) = []; %舍去表中0元素
Route2 = Table2(i,:);
Route2(Route2 == 0) = []; %舍去表中0元素
Route3 = Table3(i,:);
Route3(Route3 == 0) = []; %舍去表中0元素
Route4 = Table4(i,:);
Route4(Route4 == 0) = []; %舍去表中0元素
Route5 = Table5(i,:);
Route5(Route5 == 0) = []; %舍去表中0元素
for j = 1:length(Route1)-1
Length1(i) = Length1(i) + D(Route1(j),Route1(j + 1));
end
for j = 1:length(Route2)-1
Length2(i) = Length2(i) + D(Route2(j),Route2(j + 1));
end
for j = 1:length(Route3)-1
Length3(i) = Length3(i) + D(Route3(j),Route3(j + 1));
end
for j = 1:length(Route4)-1
Length4(i) = Length4(i) + D(Route4(j),Route4(j + 1));
end
for j = 1:length(Route5)-1
Length5(i) = Length5(i) + D(Route5(j),Route5(j + 1));
end
end
length = Length1 + Length2+Length3+Length4+Length5;
% 计算最短路径距离及平均距离
if iter == 1
[min_Length,min_index] = min(Length);
Length_best(iter) = min_Length;
Length_ave(iter) = mean(Length);
Route_best1(iter,:) = Table1(min_index,:);
Route_best2(iter,:) = Table2(min_index,:);
Route_best3(iter,:) = Table3(min_index,:);
Route_best4(iter,:) = Table4(min_index,:);
Route_best5(iter,:) = Table5(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_best1(iter,:) = Table1(min_index,:);
Route_best2(iter,:) = Table2(min_index,:);
Route_best3(iter,:) = Table3(min_index,:);
Route_best4(iter,:) = Table4(min_index,:);
Route_best5(iter,:) = Table5(min_index,:);
else
Route_best1(iter,:) = Route_best1((iter-1),:);
Route_best2(iter,:) = Route_best2((iter-1),:);
Route_best3(iter,:) = Route_best3((iter-1),:);
Route_best4(iter,:) = Route_best4((iter-1),:);
Route_best5(iter,:) = Route_best5((iter-1),:);
end
end
% 更新信息素
Delta_Tau = zeros(n,n);
% 逐个蚂蚁计算
for i = 1:m
Route1 = Table1(i,:);Route1(Route1 == 0) = []; %舍去表中0元素
Route2 = Table2(i,:); Route2(Route2 == 0) = []; %舍去表中0元素
Route3 = Table3(i,:);Route3(Route3 == 0) = [];
Route4 = Table4(i,:);Route4(Route4 == 0) = [];
Route5 = Table5(i,:);Route5(Route5 == 0) = [];
% 逐个城市计算
for j = 1:length(Route1)-1
Delta_Tau(Route1(j),Route1(j+1)) = Delta_Tau(Route1(j),Route1(j+1)) + Q/Length1(i);%Delta_tau(Route1( j), Route1( j + 1)) = Delta_tau(Route1(j), Route1(j + 1)) + Q / length1(i);%蚁周模型
end
for j = 1:length(Route2)-1
Delta_Tau(Route2(j),Route2(j+1)) = Delta_Tau(Route2(j),Route2(j+1)) + Q/Length2(i);
end
for j = 1:length(Route3)-1
Delta_Tau(Route3(j),Route3(j+1)) = Delta_Tau(Route3(j),Route3(j+1)) + Q/Length3(i);
end
for j = 1:length(Route4)-1
Delta_Tau(Route4(j),Route4(j+1)) = Delta_Tau(Route4(j),Route4(j+1)) + Q/Length4(i);
end
for j = 1:length(Route5)-1
Delta_Tau(Route5(j),Route5(j+1)) = Delta_Tau(Route5(j),Route5(j+1)) + Q/Length5(i);
end
Delta_Tau(Route1(end),Route1(1)) = Delta_Tau(Route1(end),Route1(1)) + Q/Length1(i);
Delta_Tau(Route2(end),Route1(1)) = Delta_Tau(Route2(end),Route1(1)) + Q/Length2(i);
Delta_Tau(Route3(end),Route1(1)) = Delta_Tau(Route3(end),Route1(1)) + Q/Length3(i);
Delta_Tau(Route4(end),Route1(1)) = Delta_Tau(Route4(end),Route1(1)) + Q/Length4(i);
Delta_Tau(Route5(end),Route1(1)) = Delta_Tau(Route5(end),Route1(1)) + Q/Length5(i);
end
Tau = (1-rho) * Tau + Delta_Tau;
% 迭代次数加1,清空路径记录表
iter = iter + 1;
Table1 = zeros(m,n);
Table2 = zeros(m,n);
Table3 = zeros(m,n);
Table4 = zeros(m,n);
Table5 = zeros(m,n);
end
[Shortest_Length,index] = min(Length_best);
Shortest_Route1 = Route_best1(index,:);Shortest_Route1(Shortest_Route1 == 0) = [];
Shortest_Route2 = Route_best2(index,:);Shortest_Route2(Shortest_Route2 == 0) = [];
Shortest_Route3 = Route_best3(index,:);Shortest_Route3(Shortest_Route3 == 0) = [];
Shortest_Route4 = Route_best4(index,:);Shortest_Route4(Shortest_Route4 == 0) = [];
Shortest_Route5 = Route_best5(index,:);Shortest_Route5(Shortest_Route5 == 0) = [];
disp(['最短距离: ' num2str(Shortest_Length)]);
disp(['最短路径1: ' num2str([Shortest_Route1 Shortest_Route1(1)])]);
disp(['最短路径2: ' num2str([Shortest_Route2 Shortest_Route2(1)])]);
disp(['最短路径3:' num2str([shortest Route3])]);
disp(['最短路径4:' num2str([shortest Route4])]);
disp(['最短路径5:' num2str([shortest Route5])]);
%% 7、绘图
figure(2)
plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:')
legend('最短距离','平均距离')
xlabel('迭代次数')
ylabel('距离')
title('各代最短距离与平均距离对比')
function D = Distance(citys)
%% 计算两两城市之间的距离
% 输入:各城市的位置坐标(citys)
% 输出:两两城市之间的距离(D)
n = size(citys, 1);
D = zeros(n, n);
for i = 1: n %i从1到n
for j = i + 1: n
D(i, j) = sqrt((citys(i, 1) - citys(j, 1))^2 + (citys(i, 2) - citys(j, 2))^2); %计算距离,勾股定理
D(j, i) = D(i, j);
end
D(i, i) = 1e-4; %对角线的值为0,但由于后面的启发因子要取倒数,因此用一个很小数代替0
end