clear;
close all;
clc;
n = 35; %城市的数量
x = rand(1,n)*10;
y = rand(1,n)*10;
D = zeros(n,n);
for i = 1:n
for j = 1:n
if i~= j
D(i,j) = sqrt(power(x(i)-x(j),2) + power(y(i)-y(j),2));
else
D(i,j) = eps;
end
end
end
m = 80; %蚂蚁的数量
alpha = 2;
beta = 6;
rho = 0.2; %挥发素
Q = 10;
Heu_F = 1./D; %先验效应
Tau = ones(n,n); % 初始化边的信息素
Table = zeros(m,n);
iter = 1;
iter_max = 500;
Route_best = zeros(iter_max,n); %最优路径
Length_best = zeros(iter_max,1); % 最优路径的长度
%% 迭代
while iter <= iter_max
%% 初始化蚂蚁出发点
start = zeros(m,1);
for i = 1:m
temp = randperm(n);
start(i) = temp(1);
end
%% 更新蚂蚁的运动轨迹
Table(:,1) = start;
city_index = 1:n;
for i = 1:m
for j = 2:n
has_visited = Table(i,1:(j-1));
allow_index = ~ismember(city_index,has_visited);
allow = city_index(allow_index);
%%计算蚂蚁转移概率
P = allow;
for k = 1:length(allow)
P(k) = Tau(has_visited(end),allow(k))^alpha * Heu_F(has_visited(end),allow(k))^ beta;
end
P = P / sum(P);
Pc = cumsum(P); % 轮盘,cumsum是依次求行和
target_index = find(Pc >= rand);
target = allow(target_index(1));
Table(i,j) = target;
end
end
%% 计算长度
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
%% 得到最佳路径和长度
[min_Length,min_index] = min(Length);
if iter >1
if min_Length > Length_best(iter-1)
Length_best(iter) = Length_best(iter-1);
Route_best(iter,:) = Route_best(iter-1,:);
else
Length_best(iter) = min_Length;
Route_best(iter,:) = Table(min_index,:);
end
else
Length_best(iter) = min_Length;
Route_best(iter,:) = Table(min_index,:);
end
%%更新代数和信息素
iter = iter+1;
Delta_Tau = zeros(n,n);
for i = 1:m
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
end
Tau = (1-rho)*Tau + Delta_Tau;
Table = zeros(m,n);
end
plot(Length_best);