理论基础
MATLAB代码
function [minLuJing,minLen] = yiQun(C)
%蚁群算法求解TSP问题
%输入城市间的横纵坐标C
%输出蚁群算法得到的较优值minLen及其遍历路径minLuJing
%测试环境:MATLAB2018b
%% 参数定义
n = size(C,1); %城市个数
m = floor(1.5*n); %蚂蚁个数
arfa = 1; %信息素的加权值
beta = 2; %能见度的加权值
rou = 0.5; %信息素的挥发率
dieDai = 200; %迭代次数
%% 城市之间距离
dC = zeros(n,n);
for i = 1:n
for j = i+1:n
dC(i,j) = ((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^(1/2);
end
end
dC = dC'+ dC + diag(diag(eps*ones(1,n)));
%% 初始化能见度矩阵
yita = 1 ./ dC; %能见度为两地距离的倒数
yita2 = yita.^beta; %加权之后
%% 初始化信息素矩阵
tao = 0;
for i = 1:n
tao = tao + dC(i,n-i+1); %原文中是用贪心算法求初始值,这里偷懒随意找的一条简单路径
end
tao0 = m/tao; %初始信息素浓度太小:算法容易早熟,太大:信息素对路径指导作用会降低
tao = ones(n,n)*tao0;
tao = tao - diag(diag(tao));
tao2 = tao.^arfa; %加权之后
%% 迭代
for i = 1:dieDai
%% 为每只蚂蚁随机分配出发城市
chuFa = zeros(m,1);
for k = 1:m
chuFa(k) = floor(n * rand()) + 1;
end
%% 根据信息素浓度遍历
bianLi = zeros(m,n); %遍历矩阵
bianLi(:,1) = chuFa;
for k = 1:m %m只蚂蚁
visited = zeros(n,1); %访问向量,若访问过,为1
v = chuFa(k);
visited(v) = 1;
for r = 2:n %一只蚂蚁走过的路径
Pab = zeros(n,1); %计算前往下个城市的概率
for j = [1:v-1,v+1:n]
if visited(j) == 1
Pab(j) = 0;
else
Pab(j) = tao2(v,j) * yita2(v,j);
end
end
Pab = Pab ./ sum(Pab);
v = randsample(1:n,1,true,Pab');
bianLi(k,r) = v;
visited(v) = 1;
end
end
%% 计算每只蚂蚁走过的路径长度
bianLiLen = zeros(m,1);
bianLi2 = [bianLi,chuFa]; %终点回到出发点
for i = 1:m
for j = 1:n
bianLiLen(i) = bianLiLen(i) + dC(bianLi2(i,j),bianLi2(i,j+1));
end
end
%% 信息素更新
tao = (1-rou) .* tao;
for i = 1:m
for j = 1:n
x = bianLi2(i,j);
y = bianLi2(i,j+1);
tao(x,y) = tao(x,y) + 1/bianLiLen(i);
end
end
tao2 = tao .^arfa;
end
%% 取最小值为求得的最优解
[minLen,index] = sort(bianLiLen);
minLuJing = bianLi2(index(1),:);
minLen = minLen(1);
%yiQunTest.m
%调用蚁群算法
%测试环境:MATLAB2018b
%clear;
%C = [0,0;0,1;1,0;1,1]; %正方形
%[minLuJing,minLen] = yiQun(C);
clear;
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;
4196 1004;4312 790;4386 570;3007 1970;2562 1756;2788 1491;2381 1676;
1332 695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;
4263 2931;3429 1908;3507 2367;3394 2643;3439 3201;2935 3240;3140 3550;
2545 2357;2778 2826;2370 2975];%31个省会坐标
[minLuJing,minLen] = yiQun(C);
参考理论
https://blog.csdn.net/qizijuesha/article/details/62055108blog.csdn.net