1 简介
车辆路径问题(Vehicle Routing Problem, VRP)是物流配送过程中的关键问题之一,随着物流配送行业竞争日益激烈和客户对物流配送时效性要求越来越高,对车辆路径问题的研究,尤其是对带时间窗车辆路径问题(Vehicle Routing Problem With Time Windows, VRPTW)的研究,不仅可以帮助运输企业提高服务水平,为客户提供快捷,准时,安全,舒适的服务,而且有助于企业节约运输成本,提高车辆利用效率,缩短生产周期,加速资金周转,实现资源的合理配置,汲取"第三利润源泉"的财富,因此研究带时间窗车辆路径问题具有重要的现实意义. 本文正是基于以上背景对带时间窗的车辆路径优化问题进行了相关研究.论文从旅行商问题出发,通过分析带时问窗车辆路径优化问题的基本理论,对可用于求解VRPTW的各种优化算法进行了对比,确定了遗传算法作为本文VRPTW求解算法.在此基础上,考虑配送距离,配送及时性以及配送车辆数对配送成本的影响,构建了以配送总成本最小化为目标的带有惩罚函数的VRPTW优化模型,并设计了适合于该模型求解的染色体编码方式以及遗传算子等.最后,应用算例进行了仿真试验,利用MATLAB软件分别计算出基于改进遗传算法和基本遗传算法的最优目标函数值与最优配送路径方案,通过对试验结果的对比分析,验证了本文所建模型及求解算法的合理性和有效性.
2 部分代码
clc
clear;
tic
Stop=xlsread('coodinate');
stop_xy_ary=Stop(:,1:2);
StopCount=size(stop_xy_ary,1);
RequstParing=xlsread('paring')
RequstSetTime=RequstParing(:,4);
RequstCount=size(RequstParing,1);
myDistance=Distance(StopCount,stop_xy_ary);
myDmand=Dmand(RequstParing);
capacity = 25;
popsize=500;
a = 0.8; %【3】为什么确定为0.8
k1 = 2; %round((sum(abs(myDmand))./(a*capacity))+1)-1; %最小车辆数
k2 = 2; %最大车辆数
original = 15;%%车辆自重
C=100;
Pc=0.9;
Pm=0.2;
myDistance=myDistance;
n = 2*RequstCount+1;
minvalue = 1000000;
for k = k1:k2 %每种车辆数做一次寻优
tempR = zeros(1,n+k);
farmina= zeros(popsize,n+k);
farmina=inatialize(popsize,RequstCount,k,RequstParing);
%[tempR,tempvalue] = Run_VRP(myDistance,RequstParing,myDmand,popsize,k,capacity,original,C,Pc,Pm,farmina);%运算返回最优路径R和其总距离Rlength
farm= zeros(popsize,n+k);
farm=farmina;
R=farm(1,:);%一个随机解(个体)->用来存放最优解(最短路径)
evalue=zeros(popsize,1);%存储路径长度
alph = 0.9; %退火衰减系数
counter=0;
while counter < C
for i = 1:popsize
evalue(i,1) = myEvalue(myDistance,RequstParing,farm(i,:),k,capacity,original,myDmand); %计算目标函数
end
tempminvalue=min(evalue);%找到当前最优解
coor=find(evalue==tempminvalue);%返回的是在len中路径最短的路径在evalue的位置 ;坐标(i,1)
R=farm(coor(1,1),:);%更新最优解
if counter == 0 %计算初始退火温度
t = temp_inatial(evalue,popsize);
end
farm1 = select(farm,evalue,popsize,k,myDistance,RequstParing,capacity,original,myDmand,t);%模拟退火+轮盘赌->选择
farm2 =crossover(farm1,RequstCount,k,popsize,Pc);
farm3 = variation(farm2,RequstCount,popsize,Pm);
for i = 1:popsize
evalue(i,1) = myEvalue(myDistance,RequstParing,farm3(i,:),k,capacity,original,myDmand); %计算目标函数
end
maxvalue=max(evalue);%找到当前最差解
coor=find(evalue==maxvalue);%返回的是在len中路径最长的路径坐标(i,1)
farm2(coor(1,1),:) = R;%用最优解替代最差解
counter = counter + 1;
t = t * alph; %退火降温
end %mainLoop
if tempminvalue < minvalue
minvalue = tempminvalue;
MINR=R;
minvehicle = k;
TimeRecordA=zeros(k,n+k);%储存应到时间
TimeRecordB=zeros(k,n+k);%储存实到时间
LoadRecord =zeros(k,n+k);%储存车载量
[TimeRecordA,TimeRecordB,LoadRecord]= myRecord( myDistance,RequstParing,MINR,k,capacity,original,myDmand);
end
end
minvalue
MINR
minvehicle
N = size(MINR,2);
minR=zeros(1,N);
for i=1:N
if MINR(1,i)>=1&&MINR(1,i)<=RequstCount
minR(1,i)= RequstParing(MINR(1,i),2);
else
if MINR(1,i)>=RequstCount+1&&MINR(1,i)<=2*RequstCount
minR(1,i)= RequstParing(MINR(1,i)-RequstCount,1);
end
end
end
a1=find(MINR==0);
minR(a1)=1;
minR
DrawRoute(stop_xy_ary,minR)
toc