蚁群优化神经网络.docx
- 文档编号:28561129
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:20
- 大小:21.89KB
蚁群优化神经网络.docx
《蚁群优化神经网络.docx》由会员分享,可在线阅读,更多相关《蚁群优化神经网络.docx(20页珍藏版)》请在冰豆网上搜索。
蚁群优化神经网络
二、
function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
%%===============================================================
%% ACATSP.m
%% AntColonyAlgorithmforTravelingSalesmanProblem
%%-------------------------------------------------------------------------
%% 主要符号说明
%% C n个城市的坐标,n×2的矩阵
%% NC_max 最大迭代次数
%% m 蚂蚁个数
%% Alpha 表征信息素重要程度的参数
%% Beta 表征启发式因子重要程度的参数
%% Rho 信息素蒸发系数
%% Q 信息素增加强度系数
%% R_best 各代最佳路线
%% L_best 各代最佳路线的长度
%%================================================================
C=[1304,2312;3639,1315;4177,2244;3712,1399;3488,1535;3326,1556;
32381229;41961004;4312790;4386570;30071970;25621756;
27881491;23811676;1332695;37151678;39182179;40612370;
37802212;36762578;40292838;42632931;34291908;35072367;
33942643;34393201;29353240;31403550;25452357;27782826;
23702975];
m=31;
Alpha=1;
Beta=5;
Rho=.1;
NC_max=30;
Q=100;
%%第一步:
变量初始化
n=size(C,1);%*表示问题的规模(城市个数)
D=zeros(n,n);%D表示完全图的赋权邻接矩阵
fori=1:
n
forj=1:
n
ifi~=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(NC_max,n);%各代最佳路线
L_best=inf.*ones(NC_max,1);%各代最佳路线的长度
L_ave=zeros(NC_max,1);%各代路线的平均长度
whileNC<=NC_max %停止条件之一:
达到最大迭代次数
%%第二步:
将m只蚂蚁放到n个城市上
Randpos=[];
fori=1:
(ceil(m/n))%ceil为朝正无穷方向舍入%
Randpos=[Randpos,randperm(n)];
end
Tabu(:
1)=(Randpos(1,1:
m))';%n个城市,编号为1---n
for循环的次数是蚂蚁重复城市的次数,比如5个蚂蚁放到4个城市,需要重复两遍才能放完蚂蚁,每次循环产生n个1---n的随机数,相当于随机n个城市,产生城市序列
循环结束
Tabu一句表示将m个蚂蚁随机,每个蚂蚁放到前面产生的城市序列中,每个蚂蚁一个城市,需要m个,所以提取前面1:
m个序列
'表示转置,没有多大用处,可能参与后面的计算方便。
我感觉如果m,n很大的话,你这样做会产生很大的浪费,计算很多的随机数,这样的话更好,一句就得:
(如果变量Randpos后面没有用到的话,如果用到了,还要用你的程序)Tabu=ceil(n*rand(1,m))'
%%第三步:
m只蚂蚁按概率函数选择下一座城市,完成各自的周游
forj=2:
n
fori=1:
m
visited=Tabu(i,1:
(j-1)); %已访问的城市
J=zeros(1,(n-j+1)); %待访问的城市
P=J; %待访问城市的选择概率分布
Jc=1;
fork=1:
n
iflength(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1;
end
end
%下面计算待选城市的概率分布
fork=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
ifNC>=2
Tabu(1,:
)=R_best(NC-1,:
);
end
%%第四步:
记录本次迭代最佳路线
L=zeros(m,1);
fori=1:
m
R=Tabu(i,:
);
forj=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),:
);
L_ave(NC)=mean(L);
NC=NC+1
%%第五步:
更新信息素
Delta_Tau=zeros(n,n);
fori=1:
m
forj=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);
end
%%第七步:
输出结果
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos
(1),:
);
Shortest_Length=L_best(Pos
(1));
subplot(1,2,1)
DrawRoute(C,Shortest_Route)
subplot(1,2,2)
plot(L_best)
holdon
plot(L_ave,'y')
title('平均距离与最短距离')
functionDrawRoute(C,R)
%%====================================================================
%% DrawRoute.m
%% 画路线图的子函数
%%--------------------------------------------------------------------
%% C Coordinate 节点坐标,由一个N×2的矩阵存储
%% R Route 路线
%%====================================================================
N=length(R)
scatter(C(:
1),C(:
2))
holdon
plot([C(R
(1),1),C(R(N),1)],[C(R
(1),2),C(R(N),2)])
holdon
forii=2:
N
plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)])
holdon
end
title('旅行商问题优化结果')
%以下是解放军信息工程大学一个老师编的matlab程序,请尊重原作者劳动,引用时请注明出处。
function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
%%-------------------------------------------------------------------------
%%主要符号说明
%%Cn个城市的坐标,n×2的矩阵
%%NC_max最大迭代次数
%%m蚂蚁个数
%%Alpha表征信息素重要程度的参数
%%Beta表征启发式因子重要程度的参数
%%Rho信息素蒸发系数
%%Q信息素增加强度系数
%%R_best各代最佳路线
%%L_best各代最佳路线的长度
%%=========================================================================
%%第一步:
变量初始化
n=size(C,1);%n表示问题的规模(城市个数)
D=zeros(n,n);%D表示完全图的赋权邻接矩阵
fori=1:
n
forj=1:
n
ifi~=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; %i=j时不计算,应该为0,但后面的启发因子要取倒数,用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(NC_max,n); %各代最佳路线
L_best=inf.*ones(NC_max,1); %各代最佳路线的长度
L_ave=zeros(NC_max,1); %各代路线的平均长度
whileNC<=NC_max %停止条件之一:
达到最大迭代次数,停止
%%第二步:
将m只蚂蚁放到n个城市上
Randpos=[]; %随即存取
fori=1:
(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:
1)=(Randpos(1,1:
m))'; %此句不太理解?
%%第三步:
m只蚂蚁按概率函数选择下一座城市,完成各自的周游
forj=2:
n %所在城市不计算
fori=1:
m
visited=Tabu(i,1:
(j-1));%记录已访问的城市,避免重复访问
J=zeros(1,(n-j+1)); %待访问的城市
P=J; %待访问城市的选择概率分布
Jc=1;
fork=1:
n
iflength(find(visited==k))==0 %开始时置0
J(Jc)=k;
Jc=Jc+1; %访问的城市个数自加1
end
end
%下面计算待选城市的概率分布
fork=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); %cumsum,元素累加即求和
Select=find(Pcum>=rand);%若计算的概率大于原来的就选择这条路线
to_visit=J(Select
(1));
Tabu(i,j)=to_visit;
end
end
ifNC>=2
Tabu(1,:
)=R_best(NC-1,:
);
end
%%第四步:
记录本次迭代最佳路线
L=zeros(m,1); %开始距离为0,m*1的列向量
fori=1:
m
R=Tabu(i,:
);
forj=1:
(n-1)
L(i)=L(i)+D(R(j),R(j+1)); %原距离加上第j个城市到第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),:
);%此轮迭代后的最佳路线
L_ave(NC)=mean(L); %此轮迭代后的平均距离
NC=NC+1 %迭代继续
%%第五步:
更新信息素
Delta_Tau=zeros(n,n); %开始时信息素为n*n的0矩阵
fori=1:
m
forj=1:
(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
%此次循环在路径(i,j)上的信息素增量
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); %%直到最大迭代次数
end
%%第七步:
输出结果
Pos=find(L_best==min(L_best));%找到最佳路径(非0为真)
Shortest_Route=R_best(Pos
(1),:
)%最大迭代次数后最佳路径
Shortest_Length=L_best(Pos
(1))%最大迭代次数后最短距离
subplot(1,2,1) %绘制第一个子图形
DrawRoute(C,Shortest_Route) %画路线图的子函数
subplot(1,2,2) %绘制第二个子图形
plot(L_best)
holdon %保持图形
plot(L_ave,'r')
title('平均距离和最短距离') %标题
%%functionDrawRoute(C,R)
%%=========================================================================
%%DrawRoute.m
%%画路线图的子函数
%%-------------------------------------------------------------------------
%%CCoordinate节点坐标,由一个N×2的矩阵存储
%%RRoute路线
%%=========================================================================
%N=length(R);
%scatter(C(:
1),C(:
2));
%holdon
%plot([C(R
(1),1),C(R(N),1)],[C(R
(1),2),C(R(N),2)],'g')
%holdon
%forii=2:
N
%plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)],'g')
%holdon
%end
title('旅行商问题优化结果')
蚁群算法求解TSP问题的matlab程序
%蚁群算法求解TSP问题的matlab程序
clearall
closeall
clc
%初始化蚁群
m=31;%蚁群中蚂蚁的数量,当m接近或等于城市个数n时,本算法可以在最少的迭代次数内找到最优解
C=[13042312;36391315;41772244;37121399;34881535;33261556;32381229;41961004;
4312790;4386570;30071970;25621756;27881491;23811676;1332695;37151678;
39182179;40612370;37802212;36762578;40292838;42632931;34291908;35072367;
33942643;34393201;29353240;31403550;25452357;27782826;23702975];%城市的坐标矩阵
Nc_max=200;%最大循环次数,即算法迭代的次数,亦即蚂蚁出动的拨数(每拨蚂蚁的数量当然都是m)
alpha=1;%蚂蚁在运动过程中所积累信息(即信息素)在蚂蚁选择路径时的相对重要程度,alpha过大时,算法迭代到一定代数后将出现停滞现象
beta=5;%启发式因子在蚂蚁选择路径时的相对重要程度
rho=0.5;%0 Q=100;%蚂蚁释放的信息素量,对本算法的性能影响不大 %变量初始化 n=size(C,1);%表示TSP问题的规模,亦即城市的数量 D=ones(n,n);%表示城市完全地图的赋权邻接矩阵,记录城市之间的距离 fori=1: n forj=1: n ifi D(i,j)=sqrt((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2); end D(j,i)=D(i,j); end end eta=1./D;%启发式因子,这里设为城市之间距离的倒数 pheromone=ones(n,n);%信息素矩阵,这里假设任何两个城市之间路径上的初始信息素都为1 tabu_list=zeros(m,n);%禁忌表,记录蚂蚁已经走过的城市,蚂蚁在本次循环中不能再经过这些城市。 当本次循环结束后,禁忌表被用来计算蚂蚁当前所建立的解决方案,即经过的路径和路径的长度 Nc=0;%循环次数计数器 routh_best=zeros(Nc_max,n);%各次循环的最短路径 length_best=ones(Nc_max,1);%各次循环最短路径的长度 length_average=ones(Nc_max,1);%各次循环所有路径的平均长度 whileNc %将m只蚂蚁放在n个城市上 rand_position=[]; fori=1: ceil(m/n) rand_position=[rand_position,randperm(n)]; end tabu_list(: 1)=(rand_position(1: m))';%将蚂蚁放在城市上之后的禁忌表,第i行表示第i只蚂蚁,第i行第一列元素表示第i只蚂蚁所在的初始城市 %m只蚂蚁按概率函数选择下一座城市,在本次循环中完成各自的周游 forj=2: n fori=1: m city_visited=tabu_list(i,1: (j-1));%已访问的城市 city_remained=zeros(1,(n-j+1));%待访问的城市 probability=city_remained;%待访问城市的访问概率 cr=1; fork=1: n%for循环用于求待访问的城市。 比如如果城市个数是5,而已访问的城市city_visited=[24],则经过此for循环后city_remanied=[135] iflength(fin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 优化 神经网络
![提示](https://static.bdocx.com/images/bang_tan.gif)