%
% 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;
%如果所有蚂蚁均完成一次循环,则用最佳费用所对应的路径对弧进行整体更新