clear all
clc
Alpha = 1;
Beta = 5;
C=[
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;
60.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;
];
city_len = length(C);
Tau = ones(city_len,city_len);%信息素矩阵
D = zeros(city_len,city_len,'double');
antnum = 50;
Q = 100;%信息素的增强强度
tic
for i = 1:city_len
D(i,i) = eps('double');
D(i,i+1:city_len) = sqrt((C(i,1)-C(i+1:city_len,1)).^2+(C(i,2) - C(i+1:city_len,2)).^2);
D(i+1:city_len,i) = D(i,i+1:city_len);
end
Eta = 1./D;
Maxiter = 180;
iter = 1;
antpop(antnum,city_len) = 0;
waitcity = meshgrid(1:city_len,1:antnum);
Rho = 0.1;%信息素的蒸发系数
while iter <= Maxiter
antpop = zeros(antnum,city_len);%假定每只蚂蚁放的城市各不相同
%第一步随机将m只蚂蚁放到n个城市
antpop(:,1) = (propos(antnum))';
waitcity = meshgrid(1:city_len,1:antnum);
for i = 2:city_len
visited = antpop(:,i-1);
waitcity_probability = zeros(antnum,city_len-i+1);
logical_matrix = (bsxfun(@eq,waitcity,visited(:)));
waitcity = waitcity';
waitcity = (reshape(waitcity(~logical_matrix'),city_len-i+1,antnum))';
for j = 1:city_len-i+1
varnum = (visited(:)-1).*city_len+waitcity(1:antnum,j);%元素的位置
waitcity_probability(:,j) = (Tau(varnum).^Alpha).*(Eta(varnum).^Beta);
end
waitcity_probability = bsxfun(@rdivide,waitcity_probability,sum(waitcity_probability,2));
waitcity_probability = cumsum(waitcity_probability,2);
ant_randnum = rand(1,antnum);
all_pos = bsxfun(@ge,waitcity_probability,ant_randnum(:));
all_pos = sum(cumsum(all_pos,2) == 0,2)+1;%找到逻辑矩阵中第一个不为零的元素的位置
antpop(:,i) = waitcity((all_pos-1).*antnum+(1:antnum)');%矩阵中的元素是按列进行索引的
end
% %更新信息素增量还有记录本次迭代完成之后的最佳路线
infor_matrix = zeros(city_len,city_len);
all_distance = zeros(1,antnum,'double');
for i = 1:antnum
for j = 1:city_len-1
all_distance(i) = all_distance(i)+sqrt((C(antpop(i,j),1)-C(antpop(i,j+1),1))^2 + (C(antpop(i,j),2)-C(antpop(i,j+1),2))^2);
end
for j = 1:city_len-1
infor_matrix(antpop(i,j),antpop(i,j+1)) = infor_matrix(antpop(i,j),antpop(i,j+1)) + Q/all_distance(i);
infor_matrix(antpop(i,1),antpop(i,antnum)) = infor_matrix(antpop(i,1),antpop(i,antnum)) + Q/all_distance(i);
end
end
Tau = (1-Rho).*Tau + infor_matrix;
[lia,loc] = min(all_distance);%迭代之后的最佳路线及其路线名
%求所有路线的平均值
mean_distance = mean(all_distance);
iter = iter + 1;
end
lia;
antpop(loc,:);