✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
本文主要研究广州番禺配送中心的车辆路径规划问题,首先针对之前车辆运行中的先送货后取货模式,产生车辆运行路线的迂回,以及车辆在回程中的空载,路径规划不合理,送货时间长的问题,采用集成的观点同时考虑有取货要求的客户和有送货要求的客户,把所有的送货订单和取货订单在前一天汇集到配送中心,这样每个客户的取货需求量和送货需求量根据前一天订单信息得到确认;从而可以确定配送中心以及每个顾客的位置和需求量,从而进行同时取送货,送货是针对当天的配送中心收到的货物,取货是针对前一天有发货需求的客户。在基本VRPSDP模型的基础上,加入时间窗因素,以配送车辆总的成本为优化目标,给出T公司广州番禺配送中心同时取送货的运作模式。
1.1. 问题描述
根据番禺配送中心的实际作业情况,本文将传统的同时取送货的车辆路径问题进行重新定义:给定一
个配送中心和多辆配送车辆,多量车辆从番禺配送中心出发,分别根据安排好的路线到各个客户处送货,
同时将具有取货需求的客户的货物运回配送中心。这里配送中心送的货物是当天需要配送的货物,而运回
的货物则是客户前一天需要运回的货物。要求在给定的约束条件下,合理安排车辆的行走路径,在综合考
虑各车型的固定成本和可变配送成本的前提下,以总成本最小为目标,以尽可能提高车辆满载率、减少出
行次数为思路,构建多车型的同时取送货的车辆路径优化模型。本文研究的车辆路径问题的假设如下:
1) 只有 1 个配送中心,且配送中心的地理位置已知;
2) 货物可以混装;
3) 配送中心与需求点的坐标位置及送货量和取货量均已知;
4) 各种车型的车辆数已知,且各车型的固定费用、旅行费用、车容量均已知;
5) 每辆车服务 1 条回路,由番禺配送中心出发最终回到番禺配送中心;
6) 每辆车在行驶中的车载质量不超过该车型的容量限制;
7) 每辆车每次的配送距离不超过该车型允许的最大行驶距离;
8) 每个需求点能且只能由同一辆车进行服务,每个客户最多被服务两次;
9) 货物在运输途中不会变质损坏;不考虑司机的工作时间;不考虑道路的通行情况;不考虑运输时
的规章制度等。
⛄ 部分代码
%% Regret2Ins 依次将removed中的顾客插回配送方案中
%先计算removed中各个顾客插回当前解中所产生最小距离增量,然后再从上述各个最小距离增量的顾客中
%找出一个(距离增量第2小-距离增量第1小)最大的顾客插回,反复执行,直到全部插回
%输入removed: 被移除顾客的集合
%rfvc: 破坏后的配送方案
%输入demands: 顾客需求量
%输入pdemands: 顾客回收量
%输入cap: 车辆最大装载量
%输入a: 顾客时间窗开始时间[a[i],b[i]]
%输入b: 顾客时间窗结束时间[a[i],b[i]]
%输入L: 配送中心时间窗结束时间
%输入s: 客户点的服务时间
%输入dist: 距离矩阵
%输入v: 车辆行驶速度
%repFvc: 修复后的配送方案
function repFvc=Regret2Ins(removed,rfvc,demands,pdemands,cap,a,b,L,s,dist,v)
rfvcp=rfvc; %复制部分解
%反复插回removed中的顾客,直到全部顾客插回
while ~isempty(removed)
nr=length(removed); %移除集合中顾客数目
ri=zeros(nr,1); %存储removed各顾客最“好”插回路径
rid=zeros(nr,1); %存储removed各顾客插回最“好”插回路径后的遗憾值增量
NV=size(rfvcp,1); %当前解所用车辆数目
%逐个计算removed中的顾客插回当前解中各路径的目标函数值增
for i=1:nr
visit=removed(i); %当前要插回的顾客
dec=[]; %对应于rc的成本节约值
ins=[]; %记录可以插回路径的序号
for j=1:NV
route=rfvcp{j}; %当前路径
%% 判断能否将一个顾客插入到一条路径中,如果能,则将该顾客插入到最佳位置(目标函数增加最小的位置)
[~,flag,deltaC]=insRoute(visit,route,demands,pdemands,cap,a,b,L,s,dist,v);
%flag=1表示能插入,flag=0表示不能插入
if flag==1
dec=[dec;deltaC];
ins=[ins;j];
end
end
%如果存在符合约束的插回路径,则找出记录遗憾值以及对应的路径
if ~isempty(ins)
[sd,sdi]=sort(dec); %将dec升序排列
insc=ins(sdi); %将ins的序号与dec排序后的序号对应
ri(i)=insc(1); %更新当前顾客最“好”插回路径
if size(ins)>1
de12=sd(2)-sd(1); %计算第2小成本增量与第1小成本增量差值
rid(i)=de12; %更新当前顾客插回最“好”插回路径后的遗憾值
else
de12=sd(1); %计算第2小成本增量与第1小成本增量差值
rid(i)=de12; %更新当前顾客插回最“好”插回路径后的遗憾值
end
else %如果不存在符合约束的路径,则新建路径
temp=[visit];
ri(i)=NV+1;
rid(i)=part_length(temp,dist);
end
end
%根据rid rid最大的顾客就是先插回的顾客
[~,firIns]=max(rid); %找出遗憾值最大的顾客序号
readyV=removed(firIns); %removed中准备插回的顾客
rIns=ri(firIns); %插回路径序号
%如果插回路径为新建路径
if rIns==NV+1
temp=readyV;
%新建路径,并将removed(firIns)插到该路径中
rfvcp{rIns,1}=temp;
%将removed(firIns)顾客从removed中移除
removed(firIns)=[];
else
%将firIns插回到rIns
rfvcp{rIns,1}=insRoute(removed(firIns),rfvcp{rIns,1},demands,pdemands,cap,a,b,L,s,dist,v);
%将removed(firIns)顾客从removed中移除
removed(firIns)=[];
end
end
repFvc=rfvcp;
end
⛄ 运行结果
⛄ 参考文献
[1] 王超, 刘超, 穆东,等. 基于离散布谷鸟算法求解带时间窗和同时取送货的车辆路径问题[J]. 计算机集成制造系统, 2018, 24(3):13.
[2] 关丽霞. 带软时间窗和同时取送货的车辆路径问题研究[D]. 中南大学, 2010.
[3] 汤雅连, 蔡延光, 蔡颢. 一种求解多车场多车型带同时取送货及时间窗的车辆路径优化问题的改进遗传算法[C]// 中国系统工程学会. 中国系统工程学会, 2014.
[4] 蒋毅. 基于蚁群优化算法的车辆路径问题研究[D]. 吉林大学, 2007.