1 简介

车辆路径问题(Vehicle Routing Problem, VRP)是物流配送过程中的关键问题之一,随着物流配送行业竞争日益激烈和客户对物流配送时效性要求越来越高,对车辆路径问题的研究,尤其是对带时间窗车辆路径问题(Vehicle Routing Problem With Time Windows, VRPTW)的研究,不仅可以帮助运输企业提高服务水平,为客户提供快捷,准时,安全,舒适的服务,而且有助于企业节约运输成本,提高车辆利用效率,缩短生产周期,加速资金周转,实现资源的合理配置,汲取"第三利润源泉"的财富,因此研究带时间窗车辆路径问题具有重要的现实意义. 本文正是基于以上背景对带时间窗的车辆路径优化问题进行了相关研究.论文从旅行商问题出发,通过分析带时问窗车辆路径优化问题的基本理论,对可用于求解VRPTW的各种优化算法进行了对比,确定了遗传算法作为本文VRPTW求解算法.在此基础上,考虑配送距离,配送及时性以及配送车辆数对配送成本的影响,构建了以配送总成本最小化为目标的带有惩罚函数的VRPTW优化模型,并设计了适合于该模型求解的染色体编码方式以及遗传算子等.最后,应用算例进行了仿真试验,利用MATLAB软件分别计算出基于改进遗传算法和基本遗传算法的最优目标函数值与最优配送路径方案,通过对试验结果的对比分析,验证了本文所建模型及求解算法的合理性和有效性.

【VRP问题】基于模拟退火算法优化遗传算法求解带时间窗的取送货车辆路径规划问题含Matlab源码_优化算法

【VRP问题】基于模拟退火算法优化遗传算法求解带时间窗的取送货车辆路径规划问题含Matlab源码_优化算法_02

【VRP问题】基于模拟退火算法优化遗传算法求解带时间窗的取送货车辆路径规划问题含Matlab源码_最优解_03

【VRP问题】基于模拟退火算法优化遗传算法求解带时间窗的取送货车辆路径规划问题含Matlab源码_最优解_04

【VRP问题】基于模拟退火算法优化遗传算法求解带时间窗的取送货车辆路径规划问题含Matlab源码_优化算法_05

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

3 仿真结果

【VRP问题】基于模拟退火算法优化遗传算法求解带时间窗的取送货车辆路径规划问题含Matlab源码_最优解_06

4 参考文献


博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

【VRP问题】基于模拟退火算法优化遗传算法求解带时间窗的取送货车辆路径规划问题含Matlab源码_优化算法_07