1 简介
(VRP)车辆路线问题在物流业中对于节约汽车资源起到了决定性作用,为控制成本起了建设性作用. 遗传算法应用自然界优胜劣汰的规律.运用遗传算法求解车辆路径问题,可以从初始解开始计算,在计算过程中逐渐解出可行解及最优解,并淘汰不可行解.而模拟退火算法的应用,为求解车辆路径问题提供了新的方法,它能有效的防止陷入局部最优的情况.因此本文将遗传算法和模拟退火算法结合,利用各自的优点更快更高效的生成最优解.并在此过程中加入了记忆装置,在解的生成过程中记录下最优解,防止其在进化过程中遗失. 本文是通过遗传算法和模拟退火算法来研究带有时间窗口的车辆路径问题(客户要求将需求的货物在规定的时间窗内送到,也称有时限问题),利用一汽丰田产前物流管理系统提供的数据,运用有记忆的模拟退火遗传算法进行研究和试验,并能很好的产生最优解,达到了预期的效果.
1.1 vrp问题
1.2 模拟退火算法
1.3 模拟退火结合遗传算法
2 部分代码
%%遗传算法求解vrp问题(为选择操作从新设计后程序)
%D是距离矩阵,n为种群个数
%m为适配值淘汰加速指数,最好取为1,2,3,4,不宜太大
%交叉概率Pc,变异概率Pm
%R为最短路径,Rlength为路径长度
clc;
clear all
close all
t0=cputime;%计时开始
filename='.\Solomon\c101.txt';
[NO,XCOORD, YCOORD,DEMAND,READY_TIME,DUE_DATE,SERVICE_TIME]=textread(filename,'%s%s%s%s%s%s%s','headerlines',8);
%初始化
timewindows=[str2num(char(READY_TIME))';str2num(char(DUE_DATE))'];
coordinate=[str2num(char(XCOORD)),str2num(char(YCOORD))];
demand=str2num(char(DEMAND))';
service=str2num(char(SERVICE_TIME))';
D=distanse(coordinate);
popsize=80;%种群数量
capacity = 200;%车子载重
%经验公式m=[Σgi /aq]+1,粗求车辆数
a = 0.8; %【3】
k1 = round((sum(abs(demand))./(a*capacity)))-2; %最小车辆数
k2 = round((sum(abs(demand))./(a*capacity)))+1; %最大车辆数
% k1=size(NO);
% k2=k1+10;
original = 100;%初始每辆车的载货量
C=200;%C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定
Pc=0.9;%交叉概率
Pm=0.4;%变异概率
% R = zeros(1,n+k);
% tempR = zeros(1,n+k);
minvalue = 1000000;%随便设置的最优值,不能太小
for k = k1:1:k2 %每种车辆数做一次寻优
[tempR,tempvalue] = Run_VRP(D,demand,popsize,timewindows,k,capacity,original,C,Pc,Pm,service);%运算返回最优路径R和其总距离Rlength
if min(tempvalue) < minvalue
minvalue = min(tempvalue);%如果小于最小适应度值,替代&& min(tempvalue)>100
R = tempR;%保存最小路径
minvehicle = k;%保存最小车辆数量
shiyingdu=tempvalue ;%保存最小染色体
end
% disp(['最优染色体',num2str(tempR)]);
% disp(['最小车辆数',num2str(k)]);
% disp(['最小里程数',num2str(min(tempvalue))]);
% pause
end
TimeCost=cputime-t0;%
disp(['最优染色体',num2str(R)]);
disp(['最小车辆数',num2str(minvehicle)]);
disp(['最小里程数',num2str(minvalue)]);
% myplot(R,coordinate',n+k);
% disp(['最少时间代价',num2str(TimeCost)]);
figure(3)
sz=100;
% scatter(coordinate(:,1),coordinate(:,2),50);%客户位置
hold on
[n,nn] = size(D);%节点个数
for i=2:n
plot(coordinate(i,1),coordinate(i,2),'ro','MarkerSize',5,'MarkerEdgeColor','k','MarkerFaceColor','b');
text(coordinate(i,1)-0.001,coordinate(i,2)+0.005,[num2str(i-1)],'Fontsize',10);hold on
end
hold on
plot(coordinate(1,1),coordinate(1,2),'p','MarkerSize',30,'MarkerEdgeColor','k','MarkerFaceColor','y');hold on%发货中心
ss=0;
cost=zeros(k,1);
for j=1:length(R)-1
if R(j)==0
ss=ss+1;
end
switch ss
case 1
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)]);hold on%%画出车辆1的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆1的路程
case 2
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','r');hold on%%画出车辆2的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆2的路程
case 3
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','g');hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 4
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','k');hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 5
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','y');hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 6
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','m');hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 7
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[1 0.6 0.3]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 8
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[0.5 0.5 0.5]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 9
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[0.6 0.4 0.7]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 10
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[0.8 0.4 0.7]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 11
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[0.6 0.6 0.7]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 12
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[0.6 0.4 0.7]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
otherwise
line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','c');hold on %%画出车辆4的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆4的路程
end
end
minvalue1=sum(cost);
title(['无人机数',num2str(minvehicle)]);
xlabel('横坐标');
ylabel('纵坐标')
figure(2)
plot(1:C-1,shiyingdu,'b-');
xlabel('迭代次数');
ylabel('适应度');
hold on
% figure
% plot(shiyingdu,'ks');
% xlabel('车辆数');
% ylabel('适应度值');
%参考文献【1】 开放式车辆路径问题及其应用研究
%参考文献【2】 物流配送车辆调度问题的模型和算法研究
%参考文献【3】 新型遗传模拟退火算法求解物流配送路径问题
%这两篇文献讲解得非常全面,对VRP问题研究很全面
3 仿真结果
4 参考文献
[1]刘逻. 遗传算法和模拟退火算法在车辆线路问题上的研究及应用[D]. 长春理工大学.