%%清空环境变量
clear all
clc
%%导入数据
load citys_data.mat
%%计算城市间相互距离
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
%%初始化参数
m = 31;%蚂蚁
alpha =1;%信息素重要程度因子
beta = 5;%启发函数重要程度因子
rho = 0.1;%信息素挥发因子
Q=1;%常系数
Eta = 1./D;%启发函数
Tau = ones(n,n);%信息素矩阵
Table = zeros(m,n); %路径记录表
iter =1;
iter_max = 200; %最大迭代次数
route_best = zeros(iter_max,n);%各代最佳路径
length_best = zeros(iter_max,1);%各代最佳路径的长度
length_ave = 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
tabu = Table(i,1:(j-1));%已访问的城市集合(禁忌表)
allow_index = ~ismember(city_index,tabu);
allow = city_index(allow_index);%待访问的城市集合
P = allow;
%计算城市转移概率
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
%计算各个蚂蚁的路径距离
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
%计算最短路径与平均距离
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);
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
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;
%迭代次数加1,清空历史记录
iter = iter+1;
Table = zeros(m,n);
end
%% 结果显示
[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),‘起点‘)
text(citys(shortest_Route(end),1),citys(shortest_Route(end),2),‘起点‘)
xlabel(‘城市位置横坐标‘)
ylabel(‘城市位置纵坐标‘)
title([‘蚁群算法优化路径(最短距离:‘ num2str(shortest_length) ‘)‘])
figure(2)
plot(1:iter_max,Length_best,‘b‘,1:iter_max,Length_ave,‘r‘)
legend(‘最短距离‘,‘平均距离‘)
内容参考 matlab 智能计算30个案例分析
原文:https://www.cnblogs.com/wupenghao95/p/11472576.html