蚁群优化算法是Marco Dorigo 受到蚂蚁寻找食物发现路径的行为启发,在博士论文提出的算法,是一种用来寻找优化路径的概率型算法,刚开始是为了解决 TSP(旅行商问题) ,即旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。目前其应用扩展到了优化问题领域的各个方面,算法设计得到不断的改进,逐渐构筑起一套成熟的算法框架,成为组合优化领域最具有潜力的算法之一。组合优化问题:如旅行商问题、指派问题、Job—shop调度问题、车辆路由问题、图着色问题和网络路由问题等。
缺点:
情景:蚂蚁寻找食物源,蚂蚁到达食物源患有多条路径,蚂蚁在选择路径时回释放一种信息素,此信息素会随时间含量不断减少,如此路径较短的蚂蚁往复次数多,留下的信息素含量不断增多,而蚂蚁会做出选择走信息素多的路,随时间发展,路径短的蚂蚁会越来越多。
思想抽象:蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。由于路径较短的蚂蚁释放的信息素量较多,随着时间的推进,较短的路径上累积的信息素浓度逐渐增高,选择该路径的蚂蚁个数也愈来愈多。最终,整个蚂蚁会在正反馈的作用下集中到最佳的路径上,此时对应的便是待优化问题的最优解。
定义对照表:
蚁群觅食 | 蚁群优化算法 |
蚁群 | 种群规模(搜索空间的一组有效解) |
觅食空间 | 问题搜索空间(解的规模,维度) |
信息素 | 信息素浓度变量 |
所有的路径 | 有效解 |
最短路径 | 问题最优解 |
蚁群算法形式化:
核心是蚁群优化算法的两个公式,一个是路径构建(计算选择城市概率的),另一个是更新信息素的。
首先呢我们将m只蚂蚁随机放置在n个城市上,我们需要让蚂蚁去移动,那么就要计算蚂蚁选择移动的下一个城市的概率,位于城市 i 的第 k 只蚂蚁选择下一个城市 j 的概率为:
公式分析: 蚂蚁选择下一个城市的概率是与信息素成正比的,信息素浓度越大被选择的几率越大。城市之间的距离越短,被选择的几率越大。选择因素有权重,引入了次幂。
通过上面的式子可以观察到城市之间的距离事固定的,所以如果信息素也不变,则每只蚂蚁到达同一个城市后的选择都是一样的了,这不是我们目的,所以需要更新概率则只能更新(信息素)
当所有的蚂蚁都经过了所有的城市,则开始进行信息素的更新,按照以下公式:
公式分析:信息素更新理解为,这一刻 ij 路径上的信息素浓度等于上一刻的信息素浓度乘以挥发速度 ,再加上上一时间段内所有蚂蚁在该路径上释放的的信息素浓度之和。
测试代码
clc;clear;
t0=clock; %用于计时
%% 初始化城市信息
n=30; %定义城市个数
city=[(randperm(100,n))',(randperm(100,n))']; %获取城市坐标 产生n个1-100的随机数,不重复
figure('name','蚁群优化算法');
plot(city(:,1),city(:,2),'o'); %描点 city--(30,2)
for i=1:n
text(city(i,1)+0.5,city(i,2),num2str(i)); %标号
end
title('蚁群优化算法');
%设置横纵坐标范围
grid on %网格线
hold on %图像保持而不被刷新
%% 求出各个城市之间的距离
D=zeros(n,n); %新建一个n*n的矩阵存放距离
for i=1:n
for j=1:n
if i~=j
D(i,j)=sqrt(sum((city(i,:)-city(j,:)).^2));
else
D(i,j)=eps; %设置成一个很小的数,但不能为0,因为后面分母中会用到
end
end
end
%% 初始化参数
m=75; %蚂蚁数量
alpha = 1; %信息素重要程度因子
beta = 5; %启发函数重要程度因子
rho = 0.2; %信息素挥发因子
Q=10; %常系数
Eta = 1./D; %启发函数(距离的倒数)
Tau = ones(n,n); %信息素矩阵(初始时每条路上的信息素都设为1)
Table = zeros(m,n); %路径记录表,记录m个蚂蚁走过的路径
% iter = 1; %迭代次数初值
iter_max = 100; %最大迭代次数
Route_best = zeros(iter_max,n); %各代最佳路径
Length_best = zeros(iter_max,1); %各代最佳路径的长度
Length_ave = zeros(iter_max,1); %各代路径的平均长度
%% 迭代寻找最佳路径
for iter=1:iter_max
%随机产生蚂蚁的起点城市
for i=1:m
Table(i,1)=randperm(n,1); %产生一个0-n=30 的随机数 75*30
end
citys_index=1:n; %定义全部城市索引
for i=1:m %遍历所有蚂蚁
for j=2:n %遍历其他所有城市
tabu=Table(i,1:(j-1)); %已访问城市(禁止访问表)
allow=citys_index(~ismember(citys_index,tabu)); %除去已访问城市(待访问城市)
P=allow; %存放概率,定义成什么都可以,只要和allow长度一样
%计算城市间的选择概率
for k=1:length(allow)
%tabu(end)代表该蚂蚁此刻所在城市,allow(k)代表该蚂蚁即将去向的城市
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; %确定第i只蚂蚁去往的第j-1个城市
end
end
%每只蚂蚁周游一遍后计算每只蚂蚁的路径长度
Length=zeros(m,1);
for i=1:m
for j=1:(n-1)
Length(i)=Length(i)+D(Table(i,j),Table(i,j+1));
end
%最后加上最后一个点回到起点的距离
Length(i)=Length(i)+D(Table(i,n),Table(i,1));
end
%% 计算最短路径距离及平均距离
[min_length,min_index]=min(Length); %取出最短路径及其下标
if iter==1
Length_best(iter)=min_length; %保存此次最短路径距离
else
Length_best(iter)=min(Length_best(iter-1),min_length); %选择本次和上次中最短路径较小的
end
Route_best(iter,:)=Table(min_index,:); %保存此次最短路线路径
Length_ave(iter)=mean(Length); %保存此次路线距离平均值
%% 更新信息素
Tau_Ant=Q./Length; %每条蚂蚁在路径上留下的信息素浓度
Tau_Temp=zeros(n,n);
for i=1:m
for j=1:n-1
%更新信息素
Tau_Temp(Table(i,j),Table(i,j+1))=Tau_Temp(Table(i,j),Table(i,j+1))+Tau_Ant(i);
end
%最后更新最后一个节点到起点的信息素
Tau_Temp(Table(i,n),Table(i,1))=Tau_Temp(Table(i,n),Table(i,1))+Tau_Ant(i);
end
Tau=(1-rho)*Tau+Tau_Temp; %信息素挥发后再加上新增的信息素
Table = zeros(m,n); %清空路线,进行下一轮周游
end
%% 命令行窗口显示结果
[min_length,min_index]=min(Length_best); %取出最短路径及其下标
Finnly_Route=Route_best(min_index,:);
last_time=etime(clock,t0);
disp(['最短距离为:' num2str(min_length)]);
disp(['最短路径为:' num2str(Finnly_Route)]);
disp(['运行时间:' num2str(last_time) '秒']);
%% 绘图
plot([city(Finnly_Route,1);city(Finnly_Route,1)],...
[city(Finnly_Route,2);city(Finnly_Route,2)],'bo-'); %描点
text(city(Finnly_Route(1),1),city(Finnly_Route(1),2),' 起点');
text(city(Finnly_Route(end),1),city(Finnly_Route(end),2),' 终点');
figure(2);
subplot(1,2,1); %显示在一行两列图像中的第一列
plot(Length_best);
xlabel('迭代次数');
ylabel('最短距离');
title('最短距离收敛曲线');
subplot(1,2,2); %显示在一行两列图像中的第二列
plot(Length_ave);
xlabel('迭代次数');
ylabel('平均距离');
title('平均距离收敛曲线');
问题:当城市的规模较大时,问题的复杂度呈指数级增长,仅仅靠这样一个基础单一的信息素更新机制引导搜索偏向,搜索效率有瓶颈。
方法:
信息素更新公式:
特点:能快速的获得更好的解,如果选择的精英过多会较早收敛与局部最优解。
人们提出了在精英策略的基础上,对其余边的信息素更新机制加以改善
注:w为每次迭代后释放信息素的蚂蚁总数,一般设置为6
问题:
对于最大最小蚂蚁系统
之前的蚁群算法,包括AS、EAS以及ASrank,都属于“一次性探索”,即随着算法的执行,某些边上的信息素量越来越小,某些路径被选择的概率也越来越小,系统的探索范围不断减小直至陷入停滞状态。
上述EAS、ASrank 以及MMAS都是对AS进行了少量的修改而获得了更好的性能。1997年,蚁群算法的创始人Dorigo在Ant colony system:a cooperative learning approach to the traveling salesman problem一文中提出了一种新的具有全新机制的ACO 算法——蚁群系统,是蚁群算法发展史上的又一里程碑。
ACS与AS之间存在三方面的主要差异
状态转移规则
一只蚂蚁从节点 i 到下一个节点遵循以下规则(伪随机比例规则)
信息素全局更新规则
信息素局部更新规则
小白一个,参照多篇,自我总结,侵删(私聊我),勿喷!!!