其中,表示在t时刻蚂蚁k由元素(城市)i转移到元素(城市)j的状态转移概率。
allowedk = C − tabuk表示蚂蚁k下一步允许选择的城市。
α为启发式因子,表示轨迹的相对重要性,反映了蚂蚁在运动过程中所积累的信息在蚂蚁运动时所起的作用,其值越大,则该蚂蚁越倾向于选择其他蚂蚁经过的路径,蚂蚁之间的协作性越强。
β为期望启发式因子,表示能见度的相对重要性,反映了蚂蚁在运动过程中启发信息在蚂蚁选择路径中的受重视程度,其值越
大,则该状态转移概率越接近于贪心规则;ηij(t) 为启发函数,表达式为。
式中,dij表示相邻两个城市之间的距离。
(6)修改禁忌表指针,即选择好之后将蚂蚁移动到新的元素(城市),并把该元素(城市)移动到该蚂蚁个体的禁忌表中。
(7)若集合C中元素(城市)未遍历完,即k<m,则跳转到第(4)步,否则执行第(8)步。
(8)根据公式
更新每条路径上的信息量:τij(t + n) = (1 − ρ) * τij(t) + Δτij(t),
(9)若满足结束条件,即如果循环次数,则循环结束并输出程序计算结果,否则清空禁忌表并跳转到第(2)步。
蚁群算法的matlab源程序
1.蚁群算法主程序:main.m
%function [bestroute,routelength]=Ant
Clc
clear
tic
% 读入城市间距离矩阵数据文件
CooCity = load( 'CooCity.txt' ) ;% 城市网络图坐标数据文件,txt形式给出NC=length(CooCity); % 城市个数
for i=1:NC % 计算各城市间的距离
for j=1:NC
distance(i,j)=sqrt((CooCity(i,2)-CooCity(j,2))^2+(CooCity(i,3)-CooCity(j,3))^2);
end
end
MAXIT=10;%最大循环次数
Citystart=[]; % 起点城市编号
tau=ones(NC,NC); % 初始时刻各边上的信息痕迹为1
rho=0.5; % 挥发系数
alpha=1; % 残留信息相对重要度
beta=5; % 预见值的相对重要度
Q=10; % 蚁环常数
NumAnt=20; % 蚂蚁数量
routelength=inf; % 用来记录当前找到的最优路径长度
for n=1:MAXIT
for k=1:NumAnt %考查第K只蚂蚁
deltatau=zeros(NC,NC); % 第K只蚂蚁移动前各边上的信息增量为零
%[routek,lengthk]=path(distance,tau,alpha,beta,[]); % 不靠率起始点[routek,lengthk]=path(distance,tau,alpha,beta,Citystart); % 指定起始点if lengthk<routelength %找到一条更好的路径
:::routelength=lengthk;
:::bestroute=routek;
end
for i=1:NC-1 % 第K只蚂蚁在路径上释放的信息量
deltatau(routek(i),routek(i+1))=deltatau(routek(i),routek(i+1))+Q/lengthk; % 信息素更新
end
%deltatau(routek(NC),1)=deltatau(routek(NC),1)+Q/lengthk; %
end
length_n(n)=routelength; % 记录路径收敛
tau=(1-rho).*tau; % 信息素挥发
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
costtime=toc;
subplot(1,2,1),plot([CooCity(bestroute,2)],[CooCity(bestroute,3)],'-*')
subplot(1,2,2),plot([1:MAXIT],length_n,'-*')
[routelength,costtime]
2.蚁群算法寻找路径程序:path.m
% 某只蚂蚁找到的某条路径routek,lengthk
function [routek,lengthk]=path(distance,tau,alpha,beta,Citystart)
[m,n]=size(distance);
if isempty(Citystart) % 如果不确定起点
p=fix(m*rand)+1; % 随机方式初始化起点,均匀概率
else
p=Citystart; % 外部给定确定起点 end
lengthk=0; % 初始路径长度设为 0
routek=[p]; % 蚂蚁路径点序列,即该蚂蚁已经过的城市集合,路径初始起点for i=1:m-1
np=routek(end); % 蚂蚁路径城市序号,依次经过的城市编号
np_sum=0; % 路由长度初始为 0
for j=1:m
if inroute(j,routek) % 判断城市节点j是否属于tabuk,即是否已经过
continue;
else % j为还未经过的点
ada=1/distance(np,j); % 预见度
np_sum=np_sum+tau(np,j)^alpha*ada^beta; % 路由表:信息痕迹、预见度 end
end
cp=zeros(1,m); % 转移概率,基于路径长度及路由表
for j=1:m
ifinroute(j,routek)
continue;
else
ada=1/distance(np,j); % 预见度
cp(j)=tau(np,j)^alpha*ada^beta/np_sum; % np到j的转移概率end
end
NextCity=nextcitychoose2(cp); % 根据转移概率确定下一个城市,
% 直观地,取转移概率最大值方向方法,决策结果稳定且收敛快
routek=[routek,NextCity]; % 更新路径
lengthk=lengthk+distance(np,NextCity); % 更新路径长度
end
蚁群算法仿真结果:
其中左边是蚂蚁行走的最短路径,右边是最短路径的值的收敛情况。