- 起源于解决TSP问题。蚁群算法在解决规格较小的TSP问题上效果显著。
实质:(正反馈机制)通过“信息素”的多少来选择路径,算法的迭代过程就是“信息素”的积累过程。(最优路径上蚂蚁数量的增加→信息素强度增加→蚂蚁选择概率增大→最优路径上蚂蚁数量更大增加)
“信息素”的积累有三种方法(即蚂蚁系统包括三部分):蚁周算法,蚁密算法,蚁量算法。
缺点:收敛速度过慢(在大规模TSP问题中尤为突出)。
解决方法:
自适应蚁群算法:对蚁群算法的状态转移概率、信息素挥发因子、信息量等因素采用自适应调节策略为一种基本改进思路的蚁群算法。
自适应蚁群算法中两个最经典的方法:蚁群系统(AntColony System, ACS)和最大-最小蚁群系统(MAX-MINAnt System, MMAS)。
-
蚁周算法、
信息量的增加与本次搜索的整体线路有关,属于全局信息更新(所有蚂蚁都走完一次后才会更新
若蚂蚁经过(i,j)则:
- τ(ij)为城市i,j的信息素浓度
-
ρ是0-1之间的常数,(1-ρ)表示挥发因子
- derta t(ij)表示在一次旅行后所有经过(i,j)的蚂蚁留下的信息素总量。
- 表示第k只蚂蚁在本次迭代中在路径(i,j)上留下的信息素量。
- Q为常数,Lk表示蚂蚁k已经走过的路径总长度
在信息素的作用下,蚂蚁对每条路径的选择概率
否则第k只蚂蚁在(i,j)留下的信息素为0
- 是一个启发式因子
d(i,j)为城市(i,j)之间的距离
- alpha,信息素重要程度因子;beta启发函数重要程度因子
实现
-
变量初始化
-
计算城市间距离
-
迭代寻找最佳路径
- 随机产生个蚂蚁起点
- 遍历城市
- 记录迭代最佳城市
- 更新信息表
说明:
-
城市距离矩阵不能为零,后边需要取倒数(初始化时可直接eps
-
蚂蚁选择下一城市采用轮盘赌法,可以增大拓展其他路径选择的几率
使用轮盘赌法,使用cumsum的原因是,刚开始信息素未积累时,选择路径随机,在信息素积累到一定程度,所选择的下一个城市大概率是信息素最大的城市
-
初始时信息素浓度都为1,故哪条路径都相同
-
禁忌表的作用是,推出未访问过的城市在选择城市中用到。迭代过程中的最优路线记录在禁忌表中
-
所有蚂蚁都前进一个城市后禁忌表更新
matlab
clear
% city 城市
% alpha 信息素重要程度因子 【1,4】
% beta 启发式重要程度因子 【3,5】
% rho 信息素挥发系数
% eta 启发式因子
% NC 最大迭代次数
% m 蚂蚁个数
% n 城市个数
% Q 信息素增强系数
% L 蚂蚁已走路径长度
% d 两城市间的距离
% tau 信息素矩阵
% tabu 禁忌表
% 城市坐标
city = [1304 2312 ; 3639 1315; 4177 2244; 3712 1399; 3488 1535; 3326 1556; 3238 1229; 4196 1044; 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 1980; 3507 2376; 3394 2643; 3439 3201; 2935 3240; 3140 3550; 2545 2357; 2778 2826; 2370 2975];
n = size(city,1);
d = zeros(n,n);
%初始化城市距离矩阵
for i = 1:n
for j = 1:n
if i == j
d(i,j) = eps;
else
d(i,j) = sqrt(sum((city(i,:) - city(j,:)).^2));
end
end
end
%初始化参数
m = 50;
alpha = 1;
beta = 5;
eta = 1./d;
Q = 100;
rho = 0.25;
tau = ones(n,n);
tabu = zeros(m,n);
NC = 100;
iter = 1;%当前迭代次数
r_best = zeros(NC,n); %各代最佳路径
L_brst = inf.*ones(NC,1); %每一代最佳路径长度 初始无穷大
%迭代寻找最佳路径
while iter <= NC
%蚂蚁所在城市初始化
start = zeros(m,1);
for i = 1:m
start(i) = randperm(n,1);
end
tabu(:,1) = start;
for i = 2:n
for j = 1:m
visited = tabu(j,1:(i-1));%信息素
%city_vist = 1:N;
%unvisited = ~ismember(city_vist,visited); %这两句有点妙,作用和下边循环一样
unvisited = zeros(1,(n+1-i));%初始化待访问城市
P = unvisited;
pos = 1;
for k = 1:n
if isempty(find(visited == k)) %待访问城市
unvisited(pos) = k;
pos = pos +1;
end
end
%根据信息素计算待选择城市的概率 公式三
for k = 1:length(unvisited)
P(k) = ((tau(visited(end),unvisited(k))^alpha) * (eta(visited(end),unvisited(k))^beta));
end
P = P/sum(P);
%根据概率选择下一个要访问的城市(轮盘赌法
pc = cumsum(P);
slc_index = find(pc >= rand); %下一城市索引
slc = unvisited(slc_index(1));
tabu(j,i) = slc;
end
end
%当前最优路线记录在禁忌表中
if iter >= 2
tabu(1,:) = r_best(iter-1,:);
end
%记录m只蚂蚁迭代的最佳路线长度
L = zeros(1,m);
for i = 1:m
R = tabu(i,:);
L(i) = d(R(n),R(1));%加上最后回到初始城市的距离
for j = 1:(n-1)
L(i) = L(i) + d(R(j),R(j+1));
end
end
%记录每一代中最短距离
L_best(iter) = min(L);
%记录每一代最优路径
pos = find(L == L_best(iter));
r_best(iter,:) = tabu(pos(1),:);
% 更新信息素的值 公式二
Delta_tau = zeros(n,n);
for i = 1:m
for j = 1:(n-1)
Delta_tau(tabu(i,j),tabu(i,j+1)) = Delta_tau(tabu(i,j),tabu(i,j+1)) + Q/L(i);
end
end
%更新路径上的信息素含量 公式一
tau = (1 - rho).*tau + Delta_tau;
%禁忌表清零
tabu = zeros(m,n);
%每次迭代过程城市连接图
for i = 1:(n-1)
% 1 各次迭代最优路线的横坐标 2 各次迭代路线的纵坐标
plot([city(r_best(iter,i),1),city(r_best(iter,i+1),1)],[city(r_best(iter,i),2),city(r_best(iter,i+1),2)],'bo-');
hold on;
end
plot([city(r_best(iter,n),1),city(r_best(iter,1),1)],[city(r_best(iter,n),2),city(r_best(iter,1),2)],'ro-');
title(['最短路径:',num2str(L_best(iter))]);
hold off;
time = 0.05;
pause(time);
iter = iter+1;
end
figure(2);
plot(L_best);
title('路径长度变化曲线');
xlabel('迭代次数');
ylabel('路径长度数值');
应用:二次分配问题
二次分配问题
将n台设备分配到n个地点。
参考
https://blog.csdn.net/zj1131190425/article/details/89517223
1;
end
figure(2);
plot(L_best);
title(‘路径长度变化曲线’);
xlabel(‘迭代次数’);
ylabel(‘路径长度数值’);
应用:二次分配问题
###### 二次分配问题
将n台设备分配到n个地点。
参考
https://blog.csdn.net/zj1131190425/article/details/89517223