一、VRP简介

1 VRP基本原理
车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一。VRP关注有一个供货商与K个销售点的路径规划的情况,可以简述为:对一系列发货点和收货点,组织调用一定的车辆,安排适当的行车路线,使车辆有序地通过它们,在满足指定的约束条件下(例如:货物的需求量与发货量,交发货时间,车辆容量限制,行驶里程限制,行驶时间限制等),力争实现一定的目标(如车辆空驶总里程最短,运输总费用最低,车辆按一定时间到达,使用的车辆数最小等)。
VRP的图例如下所示:

2 问题属性与常见问题
车辆路径问题的特性比较复杂,总的来说包含四个方面的属性:
(1)地址特性包括:车场数目、需求类型、作业要求。
(2)车辆特性包括:车辆数量、载重量约束、可运载品种约束、运行路线约束、工作时间约束。
(3)问题的其他特性。
(4)目标函数可能是总成本极小化,或者极小化最大作业成本,或者最大化准时作业。

3 常见问题有以下几类:
(1)旅行商问题
(2)带容量约束的车辆路线问题(CVRP)



该模型很难拓展到VRP的其他场景,并且不知道具体车辆的执行路径,因此对其模型继续改进。



(3)带时间窗的车辆路线问题
由于VRP问题的持续发展,考虑需求点对于车辆到达的时间有所要求之下,在车辆途程问题之中加入时窗的限制,便成为带时间窗车辆路径问题(VRP with Time Windows, VRPTW)。带时间窗车辆路径问题(VRPTW)是在VRP上加上了客户的被访问的时间窗约束。在VRPTW问题中,除了行驶成本之外, 成本函数还要包括由于早到某个客户而引起的等待时间和客户需要的服务时间。在VRPTW中,车辆除了要满足VRP问题的限制之外,还必须要满足需求点的时窗限制,而需求点的时窗限制可以分为两种,一种是硬时窗(Hard Time Window),硬时窗要求车辆必须要在时窗内到达,早到必须等待,而迟到则拒收;另一种是软时窗(Soft Time Window),不一定要在时窗内到达,但是在时窗之外到达必须要处罚,以处罚替代等待与拒收是软时窗与硬时窗最大的不同。


模型2(参考2017 A generalized formulation for vehicle routing problems):
该模型为2维决策变量



(4)收集和分发问题
(5)多车场车辆路线问题
参考(2005 lim,多车场车辆路径问题的遗传算法_邹彤, 1996 renaud)

由于车辆是同质的,这里的建模在变量中没有加入车辆的维度。


(6)优先约束车辆路线问题
(7)相容性约束车辆路线问题
(8)随机需求车辆路线问题

4 解决方案
(1)数学解析法
(2)人机交互法
(3)先分组再排路线法
(4)先排路线再分组法
(5)节省或插入法
(6)改善或交换法
(7)数学规划近似法
(8)启发式算法

5 VRP与VRPTW对比

二、遗传算法简介

1 引言


2 遗传算法理论
2.1 遗传算法的生物学基础


2.2 遗传算法的理论基础




2.3 遗传算法的基本概念






2.4 标准的遗传算法


2.5 遗传算法的特点


2.6 遗传算法的改进方向

3 遗传算法流程



4 关键参数说明

三、部分源代码

clear
clc
close all
tic
%% 读取数据
load('shuju7');
bl=0;
%% 提取数据信息
E=shuju(1,4);                                                    %初始点时间窗开始时间
L=shuju(1,5);                                                    %初始点心时间窗结束时间
zuobiao=shuju(:,2:3);                                       %所有点的坐标x和y
zuobiao=[zuobiao(:,1),-zuobiao(:,2)];
customer=zuobiao(2:end,:);                                       %顾客坐标
cusnum=size(customer,1);                                         %顾客数
v_num=1;                                                        %车辆数
a=shuju(2:end,4);                                                %顾客时间窗开始时间[a[i],b[i]]
b=shuju(2:end,5);                                                %顾客时间窗结束时间[a[i],b[i]]
F=shuju(2:end,1);
dist=load('shiji7.mat');%D导入距离矩阵
dist=struct2cell(dist);
dist=cell2mat(dist);
%% 遗传算法参数设置
chesu=300;%车速
alpha=100000;                                                       %违反的容量约束的惩罚函数系数
belta=chesu/1000;%违反时间窗约束的惩罚函数系数
belta2=1;NIND=1000;                                                       %种群大小
MAXGEN=50;                                                     %迭代次数
Pc=0.9;                                                         %交叉概率
Pm=0.05;                                                        %变异概率
GGAP=0.9;                                                       %代沟(Generation gap)
N=cusnum;
%% 初始化种群
[s,g,sj,gk,Chrom]=init(cusnum,NIND,F);                             %构造初始解%% 输出随机解的路线和总距离
disp('初始种群中的一个随机值:')[VC,TD,violate_cus]=decode(Chrom(1,:),cusnum,a,b,L,dist,chesu,bl);
% disp(['总距离:',num2str(TD)]);
disp(['车辆行驶总距离:',num2str(TD)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%% 优化function lineStyles=linspecer(N,varargin)if nargin==0 % return a colormaplineStyles = linspecer(128);return;
endif ischar(N)lineStyles = linspecer(128,N);return;
endif N<=0 % its empty, nothing else to do herelineStyles=[];return;
end% interperet varagin
qualFlag = 0;
colorblindFlag = 0;if ~isempty(varargin)>0 % you set a parameter?switch lower(varargin{1})case {'qualitative','qua'}if N>12 % go home, you just can't get this.warning('qualitiative is not possible for greater than 12 items, please reconsider');elseif N>9warning(['Default may be nicer for ' num2str(N) ' for clearer colors use: whitebg(''black''); ']);endendqualFlag = 1;case {'sequential','seq'}lineStyles = colorm(N);return;case {'white','whitefade'}lineStyles = whiteFade(N);return;case 'red'lineStyles = whiteFade(N,'red');return;case 'blue'lineStyles = whiteFade(N,'blue');return;case 'green'lineStyles = whiteFade(N,'green');return;case {'gray','grey'}lineStyles = whiteFade(N,'gray');return;case {'colorblind'}colorblindFlag = 1;otherwisewarning(['parameter ''' varargin{1} ''' not recognized']);end
end
% *.95
% predefine some colormapsset3 = colorBrew2mat({[141, 211, 199];[ 255, 237, 111];[ 190, 186, 218];[ 251, 128, 114];[ 128, 177, 211];[ 253, 180, 98];[ 179, 222, 105];[ 188, 128, 189];[ 217, 217, 217];[ 204, 235, 197];[ 252, 205, 229];[ 255, 255, 179]}');
set1JL = brighten(colorBrew2mat({[228, 26, 28];[ 55, 126, 184]; [ 77, 175, 74];[ 255, 127, 0];[ 255, 237, 111]*.85;[ 166, 86, 40];[ 247, 129, 191];[ 153, 153, 153];[ 152, 78, 163]}'));
set1 = brighten(colorBrew2mat({[ 55, 126, 184]*.85;[228, 26, 28];[ 77, 175, 74];[ 255, 127, 0];[ 152, 78, 163]}),.8);% colorblindSet = {[215,25,28];[253,174,97];[171,217,233];[44,123,182]};
colorblindSet = {[215,25,28];[253,174,97];[171,217,233]*.8;[44,123,182]*.8};set3 = dim(set3,.93);if colorblindFlagswitch N%     sorry about this line folks. kind of legacy here because I used to%     use individual 1x3 cells instead of nx3 arrayscase 4lineStyles = colorBrew2mat(colorblindSet);otherwisecolorblindFlag = false;warning('sorry unsupported colorblind set for this number, using regular types');end
end
if ~colorblindFlagswitch Ncase 1lineStyles = { [  55, 126, 184]/255};case {2, 3, 4, 5 }lineStyles = set1(1:N);case {6 , 7, 8, 9}lineStyles = set1JL(1:N)';case {10, 11, 12}if qualFlag % force qualitative graphslineStyles = set3(1:N)';else % 10 is a good number to start with the sequential ones.lineStyles = cmap2linspecer(colorm(N));endotherwise % any old case where I need a quick job done.lineStyles = cmap2linspecer(colorm(N));end
end
lineStyles = cell2mat(lineStyles);end% extra functions
function varIn = colorBrew2mat(varIn)
for ii=1:length(varIn) % just divide by 255varIn{ii}=varIn{ii}/255;
end
endfunction varIn = brighten(varIn,varargin) % increase the brightnessif isempty(varargin),frac = .9;
elsefrac = varargin{1};
endfor ii=1:length(varIn)varIn{ii}=varIn{ii}*frac+(1-frac);
end
endfunction varIn = dim(varIn,f)for ii=1:length(varIn)varIn{ii} = f*varIn{ii};end
endfunction vOut = cmap2linspecer(vIn) % changes the format from a double array to a cell array with the right format
vOut = cell(size(vIn,1),1);
for ii=1:size(vIn,1)vOut{ii} = vIn(ii,:);
end
end
%%
% colorm returns a colormap which is really good for creating informative
% heatmap style figures.
% No particular color stands out and it doesn't do too badly for colorblind people either.
% It works by interpolating the data from the
% 'spectral' setting on http://colorbrewer2.org/ set to 11 colors
% It is modified a little to make the brightest yellow a little less bright.
function cmap = colorm(varargin)
n = 100;
if ~isempty(varargin)n = varargin{1};
endif n==1cmap =  [0.2005    0.5593    0.7380];return;
end
if n==2cmap =  [0.2005    0.5593    0.7380;0.9684    0.4799    0.2723];return;
endfrac=.95; % Slight modification from colorbrewer here to make the yellows in the center just a bit darker
cmapp = [158, 1, 66; 213, 62, 79; 244, 109, 67; 253, 174, 97; 254, 224, 139; 255*frac, 255*frac, 191*frac; 230, 245, 152; 171, 221, 164; 102, 194, 165; 50, 136, 189; 94, 79, 162];
x = linspace(1,n,size(cmapp,1));
xi = 1:n;
cmap = zeros(n,3);
for ii=1:3cmap(:,ii) = pchip(x,cmapp(:,ii),xi);
end
cmap = flipud(cmap/255);
endfunction cmap = whiteFade(varargin)
n = 100;
if nargin>0n = varargin{1};
endthisColor = 'blue';if nargin>1thisColor = varargin{2};
end
switch thisColorcase {'gray','grey'}cmapp = [255,255,255;240,240,240;217,217,217;189,189,189;150,150,150;115,115,115;82,82,82;37,37,37;0,0,0];case 'green'cmapp = [247,252,245;229,245,224;199,233,192;161,217,155;116,196,118;65,171,93;35,139,69;0,109,44;0,68,27];case 'blue'cmapp = [247,251,255;222,235,247;198,219,239;158,202,225;107,174,214;66,146,198;33,113,181;8,81,156;8,48,107];case 'red'cmapp = [255,245,240;254,224,210;252,187,161;252,146,114;251,106,74;239,59,44;203,24,29;165,15,21;103,0,13];otherwisewarning(['sorry your color argument ' thisColor ' was not recognized']);
endcmap = interpomap(n,cmapp);
end% Eat a approximate colormap, then interpolate the rest of it up.
function cmap = interpomap(n,cmapp)x = linspace(1,n,size(cmapp,1));xi = 1:n;cmap = zeros(n,3);for ii=1:3cmap(:,ii) = pchip(x,cmapp(:,ii),xi);endcmap = (cmap/255); % flipud??
end

四、运行结果


五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

【TWVRP】基于matlab遗传算法求解带时间窗的载重约束外卖配送车辆路径规划问题【含Matlab源码 1417期】相关推荐

  1. 【路径规划】基于头脑风暴优化算法求解带时间窗和同时取送货的车辆路径问题附matlab代码

    1 内容介绍 本文主要研究广州番禺配送中心的车辆路径规划问题,首先针对之前车辆运行中的先送货后取货模式,产生车辆运行路线的迂回,以及车辆在回程中的空载,路径规划不合理,送货时间长的问题,采用集成的观点 ...

  2. 【Matlab路径规划】改进的遗传算法机器人避障路径规划【含GUI源码 703期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]改进的遗传算法机器人避障路径规划[含GUI源码 703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  3. 【TWVRP】基于matlab遗传算法求解带时间窗且车辆速度车辆路径规划问题【含Matlab源码 2094期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  4. 【配送路径规划】基于matlab蚁群优化节约算法单中心多城市配送车辆路径规划【含Matlab源码 017期】

    一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简述 ...

  5. 物流管理论文实现:基于遗传算法的带时间窗和载重约束的车辆路径优化

    车辆路径问题 ​ 车辆路径问题(Vehicle Routing Problem-VRP)是为一些车辆(确定或不确定数量)确定访问一些客户的路径,每一客户被而且只被访问一次,且每条路径上的客户需求量之和 ...

  6. 基于遗传算法有时间窗、载重约束外卖配送路径优化

    1.外卖配送中与普通路径优化的区别 (1)外卖配送中必须先取订单在进行配送,所以染色体是有序排列的 (2)两点间的距离并不代表十几的距离 (3)在进行交叉与变异时也只能运用特殊的方法 (4)如有载货限 ...

  7. 【路径规划】基于遗传算法求解带时间窗车辆路径规划问题(VRPTW)matlab源码

    1 简介 有时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows,VRPTW)因为其有重要的现实意义而备受关注.其时间窗即为客户接受服务的时间范围, ...

  8. 【路径规划】基于遗传算法求解带时间窗多电动车充电路径规划问题附matlab代码

    1 简介 电动车在物流领域中取代燃油车是一个广泛的发展趋势.但电动车的电池利用率低,充电时间长,相关充电配套设施建设不完善,存在"续驶里程焦虑"等现象成为了电动车推广和应用的重要制 ...

  9. 【TWVRP】遗传算法求解带时间窗的含充电站车辆路径规划问题【含Matlab源码 1177期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  10. 【路径规划】基于鲸鱼算法求解带时间窗开放式车辆路径问题附matlab代码

    1 内容介绍 1.1.1 研究背景 物流作为现代经济社会的流动血液,在国民经济发展和人们生产生活中发挥着不可 替代的作用,没有物流的流动也就没有生产商品的交换流动,人们的生活必需品也不可能得到及时供应 ...

最新文章

  1. class.forname().newInstance()
  2. jQuery基础(未完待续)
  3. [转] 微软轻量级 Web 开发平台 WebMatrix 发布
  4. VC获取父进程PID
  5. apache derby_Apache Derby数据库JVM安全策略
  6. 第三方应用商店仍为用户获取APP主渠道 细分市场或成新增长点
  7. 如果连这10个Python缩写都不知道,那你一定是Python新手
  8. java list filter 性能,java的List中使用filter過濾出符合特定條件的元素List
  9. 笨办法学 Python · 续 第三部分:数据结构
  10. 让携号转网不再难!但你得了解这几大限制
  11. xposed 主动调用方法_操作方法:主动容量管理
  12. 数据结构设计_数据结构算法设计题学起来很困难怎么破
  13. 漫话:如何给女朋友解释什么是反向代理、正向代理?
  14. HZNU-1480-The Gougu Theorem【勾股数】
  15. 文字相对于图片垂直居中
  16. 使用 Python 和 Bitly 缩短您的 URL
  17. Win10+Ubuntu16.04双系统安装过程中遇到的一些问题及解决办法
  18. 微信小程序-日期时间选择器
  19. python编程实例 下载-Python编程从入门到实践PDF下载高清完整扫描原版
  20. BWAPP靶场-HTML injection-Reflected(POST)

热门文章

  1. Springboot druid 监控sql语句
  2. 设计模式-(8)外观(swift版)
  3. html5--3.19 新增的progress/meter元素
  4. 日志异常处理-spring aop注解
  5. Json简介与转换数据例子
  6. Problem D: 平面划分
  7. 20200607每日一句
  8. Atitit 安全登录退出管理法v3 tbb.docx 目录 1.1. 未持有效出入边界票据。。校验票据有效性 1 1.2. 从事与票据种类不符的活动的 2 1.3. 数据为数字的应该校验数字 2
  9. Atitit 软件开发中的艾提拉思想与理念总结 后端优先 手机优先 做好政治动员 高层抽象 一定要出理论结果书籍总结 技术就是艺术 三个软件层次的划分 实现层 规划层 艺术层 无限生
  10. paip.python连接mysql最佳实践o4