首页 > 编程知识 正文

蚁群算法matlab代码讲解(蚁群算法MATLAB解VRP问题)

时间:2023-05-04 11:14:11 阅读:122930 作者:2620

Excel exp12_3_2.xls内容:

ANT_VRP函数:

function [R_best,L_best,L_ave,Shortest_Route,shortest_length]=ant_VRP(d,Demand,Cap ), iter q ) %% R_best各代的最佳路由(%% L_best各代的最佳路由长度(%% L_ave各代的平均距离) %% Shortest_Route最短路由) %% Shortest_Length 对称矩阵%%需求客户需求量%% Cap车辆最大载重量%% iter_max最大迭代次数%% m蚂蚁个数% % alpha表示信息素重要度的参数% % beta表示启发式因子的重要度的参数%% Rho %装载距离eta=ones(m,2*n ); %启发因子tau=Ones(n,n ); %信息素Tabu=Zeros(m,n ); %禁忌表route=Zeros(m,2*n ); %路径L=Zeros(m,1 ); %总路程L_best=Zeros(ITER_max,1 ); 按%世代划分的最佳路由长度r_best=Zeros(ITER_max,2*n ); %世代最佳路线nC=1; while nC=iter_max %停止条件eta=Zeros(m,2*n ); t=Zeros(m,2*n ); Tabu=Zeros(m,n ); 路径=zeros (m,2*n ); L=Zeros(m,1 );=============初始化起点城市=禁忌表===================fori=13360 mcap _1=cap; %最大载重量j=1; j_r=1; wiletabu(I,n )==0 T=zeros(m ) m,2*n ); %载重量加载矩阵tabu(I,1 )=1; %禁忌表起点位置为1route(I,1 )=1; %路径的开始位置为1视图=查找(tabu (I, )0); %已访问城市num_v=Length(visited ); %访问的城市数量j=Zeros(1,) n-num_v ); %拟访问城市道路表P=J; %拟访问城市选择概率分布Jc=1; %待访问城市选择指针for k=1:n %如果城市iflength(find(Tabu(I, )=k )0) k不是已访问城市代码,则将k放入矩阵j(JC )=k; Jc=Jc 1; endend%%%%==============每只蚂蚁都有选择概率穿越所有城市============fork=13360 n-num _ v % %概率计算公式中的分子else %各蚂蚁不在起点的城市t(I,k )=d ) Tabu,j ),j ) 1,k ) ); p(k )=) tau ) tabu(I,visited ) end ),p(k ) ) alpha ) () (1/t (I,k ) ) ^ beta ); %概率计算公式的分子end

else %如果车辆装载量小于待访问城市需求量 T(i,k)=0; P(k)=0; end end if length(find(T(i,:)>0))==0 %%%当车辆装载量小于待访问城市时,选择起点为1 Cap_1=Cap; j_r=j_r+1; Route(i,j_r)=1; L(i)=L(i)+D(1,Tabu(i,visited(end))); else P=P/(sum(P)); %按照概率原则选取下一个城市 Pcum=cumsum(P); %求累积概率和:cumsum([1 2 3])=1 3 6,目的在于使得Pcum的值总有大于rand的数 Select=find(Pcum>rand); %按概率选取下一个城市:当累积概率和大于给定的随机数,则选择求和被加上的最后一个城市作为即将访问的城市 o_visit=J(1,Select(1)); %待访问城市 j=j+1; j_r=j_r+1; Tabu(i,j)=o_visit; %待访问城市 Route(i,j_r)=o_visit; Cap_1=Cap_1-Demand(o_visit,1); %车辆装载剩余量 L(i)=L(i)+T(i,Select(1)); %路径长度 end end L(i)=L(i)+D(Tabu(i,n),1); %%路径长度 end L_best(nC)=min(L); %最优路径为距离最短的路径 pos=find(L==min(L)); %找出最优路径对应的位置:即为哪只蚂蚁 R_best(nC,:)=Route(pos(1),:); %确定最优路径对应的城市顺序 L_ave(nC)=mean(L)'; %求第k次迭代的平均距离 Delta_Tau=zeros(n,n); %Delta_Tau(i,j)表示所有蚂蚁留在第i个城市到第j个城市路径上的信息素增量 L_zan=L_best(1:nC,1); post=find(L_zan==min(L_zan)); Cities=find(R_best(nC,:)>0); num_R=length(Cities); for k=1:num_R-1 %建立了完整路径后在释放信息素 Delta_Tau(R_best(nC,k),R_best(nC,k+1))=Delta_Tau(R_best(nC,k),R_best(nC,k+1))+Q/L_best(nC); end Delta_Tau(R_best(nC,num_R),1)=Delta_Tau(R_best(nC,num_R),1)+Q/L_best(nC); Tau=Rho*Tau+Delta_Tau; nC=nC+1;endShortest_Route=zeros(1,2*n); %提取最短路径Shortest_Route(1,:)=R_best(iter_max,:);Shortest_Route=Shortest_Route(Shortest_Route>0);Shortest_Route=[Shortest_Route Shortest_Route(1,1)];Shortest_Length=min(L_best); %提取最短路径长度%L_ave=mean(L_best);

  求解程序:

clc;clear all%% ==============提取数据==============[xdata,textdata]=xlsread('exp12_3_2.xls'); %加载20个城市的数据,数据按照表格中位置保存在Excel文件exp12_3_1.xls中x_label=xdata(:,2); %第二列为横坐标y_label=xdata(:,3); %第三列为纵坐标Demand=xdata(:,4); %第四列为需求量C=[x_label y_label]; %坐标矩阵n=size(C,1); %n表示节点(客户)个数%% ==============计算距离矩阵==============D=zeros(n,n); %D表示完全图的赋权邻接矩阵,即距离矩阵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)=0; %i=j, 则距离为0; end D(j,i)=D(i,j); %距离矩阵为对称矩阵 endendAlpha=1;Beta=5;Rho=0.75;iter_max=100;Q=10;Cap=1;m=20; %Cap为车辆最大载重[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ANT_VRP(D,Demand,Cap,iter_max,m,Alpha,Beta,Rho,Q); %蚁群算法求解VRP问题通用函数,详见配套光盘Shortest_Route_1=Shortest_Route-1 %提取最优路线Shortest_Length %提取最短路径长度%% ==============作图==============figure(1) %作迭代收敛曲线图x=linspace(0,iter_max,iter_max);y=L_best(:,1);plot(x,y);xlabel('迭代次数'); ylabel('最短路径长度');figure(2) %作最短路径图plot([C(Shortest_Route,1)],[C(Shortest_Route,2)],'o-');grid onfor i =1:size(C,1) text(C(i,1),C(i,2),[' ' num2str(i-1)]); endxlabel('客户所在横坐标'); ylabel('客户所在纵坐标');

  

 

转载于:https://www.cnblogs.com/zxhyxiao/p/9413325.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。