读书使人充实,讨论使人机智,笔记使人准确…。凡有所学,皆成性格。
———— (英国)培根
文章目录
蚁群算法理论
蚁群算法是对自然界蚂蚁的寻径方式进行模拟而得出的一种仿生算法。蚂蚁在运动过程中,能够在它所经过的路径上留下信息素进行信息传递,而且蚂蚁在运动过程中能够感知这种物质,并以此来指导自己的运动方向。因此,由大量蚂蚁组成的蚁群的集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大
关键参数说明
参数 | 取值 |
---|---|
信息素启发式因子α | α取值范围一般为 [1,4] |
期望启发因子β | β取值范围一般为 [3,5] |
信息素蒸发系数ρ | ρ的取值范围是 [0,1] |
蚂蚁数目m | m一般取10~50 |
信息素强度Q | 对参数Q不必进行特别的考虑,可以任意选取 |
最大进化代数G | 一般G取100~500 |
[旅行商问题](TSP)。假设有一个旅行商人要拜访全国31个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。对路径选择的要求是:所选路径的路程为所有路径之中的最小值。全国31个省会城市的坐标为[1304 2312;3639 1315;4177 2244;37121399;3488 1535;3326 1556;3238 1229;4196 1004;4312 790;4386 570;3007 1970;2562 1756;2788 1491;2381 1676;1332695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2367;3394 2643;34393201;2935 3240;3140 3550;2545 2357;2778 2826;2370 2975]。
解:仿真过程如下:
(1)初始化蚂蚁个数m=50,信息素重要程度参数Alpha=1,启发式因子重要程度参数Beta=5,信息素蒸发系数 R h o R_{ho} Rho=0.1,最大迭代次数G=200,信息素增加强度系数Q=100。
(2)将m个蚂蚁置于n个城市上,计算待选城市的概率分布,m只蚂蚁按概率函数选择下一座城市,完成各自的周游。
(3)记录本次迭代最佳路线,更新信息素,禁忌表清零。
(4)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
优化后的路径如图所示

适应度进化曲线如图所示
MATLAB源程序如下:
%%%%%%%%%%%%%%%%%%%%蚁群算法解决TSP问题%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
m=50; %蚂蚁个数
Alpha=1; %信息素重要程度参数
Beta=5; %启发式因子重要程度参数
Rho=0.1; %信息素蒸发系数
G_max=200; %最大迭代次数
Q=100; %信息素增加强度系数
C=[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 1908;3507 2376;...
3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...
2370 2975]; %31个省会城市坐标
%%%%%%%%%%%%%%%%%%%%%%%%第一步:变量初始化%%%%%%%%%%%%%%%%%%%%%%%%
n=size(C,1); %n表示问题的规模(城市个数)
D=zeros(n,n); %D表示两个城市距离间隔矩阵
for i=1:n
for j=1:n
if i~=j
D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
else
D(i,j)=eps;
end
D(j,i)=D(i,j);
end
end
Eta=1./D; %Eta为启发因子,这里设为距离的倒数
Tau=ones(n,n); %Tau为信息素矩阵
Tabu=zeros(m,n); %存储并记录路径的生成
NC=1; %迭代计数器
R_best=zeros(G_max,n); %各代最佳路线
L_best=inf.*ones(G_max,1); %各代最佳路线的长度
figure(1);%优化解
while NC<=G_max
%%%%%%%%%%%%%%%%%%第二步:将m只蚂蚁放到n个城市上%%%%%%%%%%%%%%%%
Randpos=[];
for i=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';
%%%%%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游%%%%%%
for j=2:n
for i=1:m
visited=Tabu(i,1:(j-1)); %已访问的城市
J=zeros(1,(n-j+1)); %待访问的城市
P=J; %待访问城市的选择概率分布
Jc=1;
for k=1:n
if length(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1;
end
end
%%%%%%%%%%%%%%%%%%计算待选城市的概率分布%%%%%%%%%%%%%%%%
for k=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)...
*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
%%%%%%%%%%%%%%%%按概率原则选取下一个城市%%%%%%%%%%%%%%%%
Pcum=cumsum(P);
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(i,j)=to_visit;
end
end
if NC>=2
Tabu(1,:)=R_best(NC-1,:);
end
%%%%%%%%%%%%%%%%%%%第四步:记录本次迭代最佳路线%%%%%%%%%%%%%%%%%%
L=zeros(m,1);
for i=1:m
R=Tabu(i,:);
for j=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1));
end
L(i)=L(i)+D(R(1),R(n));
end
L_best(NC)=min(L);
pos=find(L==L_best(NC));
R_best(NC,:)=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
Delta_Tau(Tabu(i,n),Tabu(i,1))=...
Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;
%%%%%%%%%%%%%%%%%%%%%%%第六步:禁忌表清零%%%%%%%%%%%%%%%%%%%%%%
Tabu=zeros(m,n);
%%%%%%%%%%%%%%%%%%%%%%%%%历代最优路线%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n-1
plot([ C(R_best(NC,i),1), C(R_best(NC,i+1),1)],...
[C(R_best(NC,i),2), C(R_best(NC,i+1),2)],'bo-');
hold on;
end
plot([C(R_best(NC,n),1), C(R_best(NC,1),1)],...
[C(R_best(NC,n),2), C(R_best(NC,1),2)],'ro-');
title(['优化最短距离:',num2str(L_best(NC))]);
hold off;
pause(0.005);
NC=NC+1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%第七步:输出结果%%%%%%%%%%%%%%%%%%%%%%%%%%
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:); %最佳路线
Shortest_Length=L_best(Pos(1)); %最佳路线长度
figure(2),
plot(L_best)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
[求最小值]函数
f
(
x
,
y
)
=
20
(
x
2
−
y
2
)
2
−
(
1
−
y
)
2
−
3
(
1
+
y
)
2
+
0.3
f(x,y)=20(x^2-y^2)^2-(1-y)^2-3(1+y)^2+0.3
f(x,y)=20(x2−y2)2−(1−y)2−3(1+y)2+0.3的最小值,其中x的取值范围为[-5,5],y的取值范围为[-5,5]。这是一个有多个局部极值的函数,其函数值图形如图所示,其MATLAB实现程序如下
MATLAB源程序如下:
%%%%%%%f(x,y)=20*(x^2-y^2)^2-(1-y)^2-3*(1+y)^2+0.3%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
x=-5:0.01:5;
y=-5:0.01:5;
N=size(x,2);
for i=1:N
for j=1:N
z(i,j)=20*(x(i)^2-y(j)^2)^2-(1-y(j))^2-3*(1+y(j))^2+0.3;
end
end
mesh(x,y,z)
xlabel('x')
ylabel('y')
解:仿真过程如下:
(1)初始化蚂蚁个数m=20,最大迭代次数G=200,信息素蒸发系数 R h o R_{ho} Rho=0.9,转移概率常数 P 0 P_{0} P0=0.2,局部搜索步长step=0.1。
(2)随机产生蚂蚁初始位置,计算适应度函数值,设为初始信息素,计算状态转移概率。
(3)进行位置更新:当状态转移概率小于转移概率常数时,进行局部搜索;当状态转移概率大于转移概率常数时,进行全局搜索,产生新的蚂蚁位置,并利用边界吸收方式进行边界条件处理,将蚂蚁位置界定在取值范围内。
(4)计算新的蚂蚁位置的适应度值,判断蚂蚁是否移动,更新信息素。
(5)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。适应度值进化曲线如图所示,优化后的结果为x=-5,y=5,函数 f ( x , y ) f(x,y) f(x,y)的最小值为-123.7。
MATLAB源程序如下:
%%%%%%%%%%%%%%%%%%%%蚁群算法求函数极值%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
m=20; %蚂蚁个数
G_max=200; %最大迭代次数
Rho=0.9; %信息素蒸发系数
P0=0.2; %转移概率常数
XMAX= 5; %搜索变量x最大值
XMIN= -5; %搜索变量x最小值
YMAX= 5; %搜索变量y最大值
YMIN= -5; %搜索变量y最小值
%%%%%%%%%%%%%%%%%随机设置蚂蚁初始位置%%%%%%%%%%%%%%%%%%%%%%
for i=1:m
X(i,1)=(XMIN+(XMAX-XMIN)*rand);
X(i,2)=(YMIN+(YMAX-YMIN)*rand);
Tau(i)=func(X(i,1),X(i,2));
end
step=0.1; %局部搜索步长
for NC=1:G_max
lamda=1/NC;
[Tau_best,BestIndex]=min(Tau);
%%%%%%%%%%%%%%%%%%计算状态转移概率%%%%%%%%%%%%%%%%%%%%
for i=1:m
P(NC,i)=(Tau(BestIndex)-Tau(i))/Tau(BestIndex);
end
%%%%%%%%%%%%%%%%%%%%%%位置更新%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:m
%%%%%%%%%%%%%%%%%局部搜索%%%%%%%%%%%%%%%%%%%%%%
if P(NC,i)<P0
temp1=X(i,1)+(2*rand-1)*step*lamda;
temp2=X(i,2)+(2*rand-1)*step*lamda;
else
%%%%%%%%%%%%%%%%全局搜索%%%%%%%%%%%%%%%%%%%%%%%
temp1=X(i,1)+(XMAX-XMIN)*(rand-0.5);
temp2=X(i,2)+(YMAX-YMIN)*(rand-0.5);
end
%%%%%%%%%%%%%%%%%%%%%边界处理%%%%%%%%%%%%%%%%%%%%%%%
if temp1<XMIN
temp1=XMIN;
end
if temp1>XMAX
temp1=XMAX;
end
if temp2<YMIN
temp2=YMIN;
end
if temp2>YMAX
temp2=YMAX;
end
%%%%%%%%%%%%%%%%%%蚂蚁判断是否移动%%%%%%%%%%%%%%%%%%
if func(temp1,temp2)<func(X(i,1),X(i,2))
X(i,1)=temp1;
X(i,2)=temp2;
end
end
%%%%%%%%%%%%%%%%%%%%%%%更新信息素%%%%%%%%%%%%%%%%%%%%%%%
for i=1:m
Tau(i)=(1-Rho)*Tau(i)+func(X(i,1),X(i,2));
end
[value,index]=min(Tau);
trace(NC)=func(X(index,1),X(index,2));
end
[min_value,min_index]=min(Tau);
minX=X(min_index,1); %最优变量
minY=X(min_index,2); %最优变量
minValue=func(X(min_index,1),X(min_index,2)); %最优值
figure
plot(trace)
xlabel('搜索次数');
ylabel('适应度值');
title('适应度进化曲线')
%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%
function value=func(x,y)
value =20*(x^2-y^2)^2-(1-y)^2-3*(1+y)^2+0.3;
end