VRP求解matlab程序

更新时间:2023-07-08 13:00:50 阅读: 评论:0

%
% the procedure of ant colony algorithm for VRP
%
% % % % % % % % % % %
%initialize the parameters of ant colony algorithms
city=[1 145 215 0
2 151 264 1100
3 159 261 700
4 130 254 800
5 128 252 1400
6 163 247 2100
7 146 246 400
8 161 242 800
9 142 239 100
10 163 236 500
11 148 232 600
12 128 231 1200
13 156 217 1300
14 129 214 1300
15 146 208 300
16 164 208 900
17 141 206 2100
18 147 193 1000
19 164 193 900
20 129 189 2500
21 155 185 1800
22 139 182 700];
d=city(:,2:3);
x=d(:,1);
乘号
y=d(:,2);
g=city(:,4);
m=10; % 蚂蚁数
mm=max(size(city));
alpha=1;
belta=3;% 决定tao和miu重要性的参数
lmda=0;
rou=0.4; %衰减系数
q0=0.95;
% 概率
tao0=1/(10*400.04);%初始信息素
Q=2;% 蚂蚁循环一周所释放的信息素
defined_phrm=1.0; % initial pheromone level value
QV=6000; % 车辆容量
vehicle_best=round(sum(g)/QV)+1; %所完成任务所需的最少车数
V=40;
maxitime=100;
best_cost=zeros(1,maxitime); %最好解
cost=zeros(maxitime,m);
best_tour=[];
optcost=inf;
opttour=[];
maxtt=inf;
% 计算两点的距离
for i=1:mm;
for j=1:mm;
dist(i,j)=sqrt((d(i,1)-d(j,1))^2+(d(i,2)-d(j,2))^2);
end;
end;
%给tao miu赋初值
for i=1:mm;
for j=1:mm;
if i~=j;
%s(i,j)=dist(i,1)+dist(1,j)-dist(i,j); %节约值
tao(i,j)=defined_phrm; %defined_phrm=15.0 十分的拼音
miu(i,j)=1/dist(i,j);
end;
end;
end;
% 置deltao(i,j)为0
for k=1:mm;
for k=1:mm;
deltao(i,j)=0;
end;
end;
%%开始迭代
for Nc=1:maxitime%迭代次数
  temp=[];
 
for i=1:m %m(10)为蚂蚁数
tt=inf;
costt=0;
sumload=0;
cur_pos(i)=1; %从车场出发
rn=tdiff(randperm(mm),1);
n=1;%A(n)
nn=1;
part_sol(nn)=1; %部分路径的第一步
n_sol=0; % 蚂蚁产生的路径数量
M_vehicle=500; %是最大车辆数吗
t=0; %最佳路径数组的元素数为0
hh=1;
while hh~=0  凤凰传奇最新歌曲%hh为length(rn)
while sumload<QV   
for k=1:length(rn)
if sumload+g(rn(k))<=QV
%gama(cur_pos(i),rn(k))=(sumload+g(rn(k)))/QV;
% gama越来越大,sumload是个定值
A(n)=rn(k); %选择重量适合的点
n=n+1; %记录重量适合的点数
end;
女人的气质end;
na=length(A);
if na==0
    break
el
%在满足容量的点中计算概率,选择概率大的一点
for j=1:na
p(j)=10*[(tao(cur_pos(i),A(j)))^alpha]*[(miu(cur_pos(i),A(j)))^belta];
%p=compute_prob(A,cur_pos(i),tao,miu,alpha,belta,gama,lmda,i); %
end
sump=sum(p);
p=p/sump;
maxp=1e-8;
for j=1:na
if p(j)>maxp
潮汕有什么好玩的maxp=p(j);
index_max=j;
end;
像一样造句
end;
for j=1:na
if rand<=q0&rand<=p(j)
index_max=j;
break
end
end
  old_pos=cur_pos(i); 
cur_pos(i)=A(index_max);
%当找到一点
if tao(old_pos,cur_pos(i))>tao(cur_pos(i),old_pos)
    tao(cur_pos(i),old_pos)=tao(old_pos,cur_pos(i));
el
    tao(old_pos,cur_pos(i))=tao(cur_pos(i),old_pos);
end
tao(old_pos,cur_pos(i))=(1-rou)*tao(old_pos,cur_pos(i))+ rou*Q;
maxtao=10/(1-rou)*Q/200;
mintao=maxtao/200;
                if tao(old_pos,cur_pos(i))>maxtao
          tao(old_pos,cur_pos(i))=maxtao;
        end
        if tao(old_pos,cur_pos(i))<mintao
            tao(old_pos,cur_pos(i))=mintao;
        end   
 
nn=nn+1; % nn记录容量和概率都满足的点
part_sol(nn)=cur_pos(i); %part_sol为支路
sumload=sumload+g(cur_pos(i));
temp_load=sumload; %temp_load结束时放出的货物总量
rn=tdiff(rn,cur_pos(i));
fid=fopen('','a+');
fprintf(fid,'%s %i\t\n','the current position is:',cur_pos(i));
fprintf(fid,'%s\n','the 容量满足的 customer t is:');
fprintf(fid,'\n\t%i\n',A);
fprintf(fid,'------------------------------\n');
fclo(fid);
na=[];
index_max=0;
n=1;
A=[];
end
熬夜吃什么对身体好end%while sumload<QV
%当找到一段路
%如果当前点为车场
n_sol=n_sol+1; % n_sol为路径数,超过5条对其费用加上车辆的派遣费用
fid=fopen('','a+');
fprintf(fid,'%s%i%s','NO.',n_sol,'条路径是:');
fprintf(fid,'%i ',part_sol);
fprintf(fid,'\n');
fprintf(fid,'%s','当前送出货物总量是:');
fprintf(fid,'%i\n',temp_load);
fprintf(fid,'------------------------------\n');
fclo(fid);
% 对所得路径进行路径内3-opt优化(优化函数没给出)
for nt=1:length(part_sol); % 将所有产生的路径传给一个数组
temp(t+nt)=part_sol(nt); %temp为总路径
end;
t=t+length(part_sol); %总路径元素为t
sumload=0;
final_sol=tdiff(part_sol,1);
rn=tdiff(rn,final_sol);
hh=length(rn);
part_sol=[];
final_sol=[];
nn=1;
part_sol(nn)=1;
A=[];
n=1;
end %得到一条路的结束点
    t=t+1;
  temp(t)=1;
   
ii=length(temp); %计算蚂蚁i产生的路径总长度
for i=1:ii-1
costt=costt+dist(temp(i),temp(i+1));
end
cost(Nc,i)=costt;
灰雀教案
%cost(n_gen,i)=cost_sol(temp,dist)+M_vehicle*(n_sol-vehicle_best);
costt=0;
if cost(Nc,i)<tt
    tt=cost(Nc,i);
best_Nc=Nc; % 产生最小费用的代数
best_ant=i; %产生最小费用的蚂蚁
best_tour=temp;
temp=[];
end;
end  %蚂蚁的循环结束点
if maxtt>tt
    maxtt=tt;
    opttour=best_tour;
end
best_cost(1,Nc)=tt;
%如果所有蚂蚁均完成一次循环,则用最佳费用所对应的路径对弧进行整体更新

本文发布于:2023-07-08 13:00:50,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1085499.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:路径   蚂蚁   产生
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图