一、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 关键参数说明

三、部分源代码

%% 包括充电站1
clc;
clear all
close allfilename='.\evrptw_instances\c101_21.txt';
[NO,type,XCOORD, YCOORD,DEMAND,READY_TIME,DUE_DATE,SERVICE_TIME]=textread(filename,'%s%s%s%s%s%s%s%s','headerlines',1);
%% 进行经验求解路径
K=randperm(100);%对客户点随机排序
M=30;%任务量
capacity = 200;%车子载重
timewindows_yuanshi=[str2num(char(READY_TIME))';str2num(char(DUE_DATE))'];%时间窗
coordinate_yuanshi=[str2num(char(XCOORD)),str2num(char(YCOORD))];%坐标信息
coordinate_chongdianzhan=[coordinate_yuanshi(2:22,1)';coordinate_yuanshi(2:22,2)';]';%充电站坐标
demand_yuanshi=str2num(char(DEMAND))';%所有需求
service_yuanshi=str2num(char(SERVICE_TIME))';%所有服务时间
D=distanse(coordinate_yuanshi);%距离1
coordinate=[coordinate_yuanshi(1,1),coordinate_yuanshi(K(1:M)+22,1)';coordinate_yuanshi(1,2),coordinate_yuanshi(K(1:M)+22,2)';]';%中心和客户坐标位置
timewindows=[timewindows_yuanshi(1,1),timewindows_yuanshi(1,K(1:M)+22) ;timewindows_yuanshi(1,2),timewindows_yuanshi(2,K(1:M)+22)];%随机选取的客户点时间窗
demand=[demand_yuanshi(1),demand_yuanshi(K(1:M)+22)];%随机选取的客户点需求
service=[service_yuanshi(1),service_yuanshi(K(1:M))+22];%随机选取的客户点服务时间
% coordinate_yuanshi1=[coordinate_yuanshi(1,1),coordinate_yuanshi(23:end,1)';coordinate_yuanshi(1,2),coordinate_yuanshi(23:end,2)';]';%中心和客户坐标位置
% D1=distanse(coordinate_yuanshi1);%距离
D2=distanse(coordinate);%距离
renwudian1=[1,K(1:M)+1];%包括起点的任务点
Q=77.751111;%电量
r=1;%消耗率
g=0.39;%充电
v=1;%速度% %% 遗传参数初始化
C=500;%C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定
Pc=0.9;%交叉概率
Pm=0.4;%变异概率
popsize=80;%种群数量
%经验公式m=[Σgi /aq]+1,粗求车辆数
function [ farm ] = crossover( farm,n,k,popsize,Pc )
%CROSSOVER Summary of this function goes here
%   Detailed explanation goes here
% ⑴随机产生交叉位,如果在交叉位的外侧两端的父代基因都是0的话,则对父代1
% 进行简单交叉;如果交叉位的外侧两端的父代基因不为0的话,则将左交叉位向左
% 移,直至移动到左交叉位的左端基因为0时停止。以左交叉位为起点,继续向右移
% 动右交叉位,直至右交叉位的右端基因为0为止。这样就保证了父代染色体都用1条
% 子路径来进行交叉。
% ⑵经过第1步操作,子代中仍会产生访问同一客户2次的情况,需要对
% 子代进行整理。在子代中选择那些具有重复情况的自然数,如果该自然数并非
% 在交叉位内的话,则删除之。子代如存在未访问到某一客户的情况,则在染色
% 体的交叉位外补上该客户对应的自然数。
% ⑶经过第2步的操作,如果产生了某一子路径为空的情况,即染色体中含
% 有2个连续的0,须继续进行第3步操作。将其中的1个0与染色体其它位上
% 的客户自然码进行交换。对该客户自然码的要求是该码的前一位与后一位均不
% 为0。本步操作可放在对子代的变异后进行。function temp = minsert(chrom,num,n)%insert函数,向量中指定位置插入数%n是要插入的位置(之后)[x,xx] = size(chrom);temp = zeros(1,xx+1);   %初始化temp(1,1:n) = chrom(1,1:n);temp(1,n+1) = num;temp(1,(n+2):(xx+1)) = chrom(1,(n+1):xx);endfunction temp = mdelete(chrom,n)%delete函数,向量中指定位置删除数%n是要删除数的坐标[x,xx] = size(chrom);temp = zeros(1,xx-1);   %初始化temp(1,1:n-1) = chrom(1,1:n-1);temp(1,n:xx-1) = chrom(1,(n+1):xx);end
total = n+k+1;
for i = 1:(popsize/2)   %按对进行交叉if Pc > randchromosome1 = zeros(1,total);chromosome2 = zeros(1,total);chromosome1 = farm(i,:);    %染色体1chromosome2 = farm(popsize - i + 1,:);  %染色体2%第一步*************************************************************ran1L = round(rand*(total-3)+2);    %随机数1 注意1和最后不要随机到while chromosome1(1,ran1L) == 0    %不能随机到0ran1L = round(rand*(total-3)+2);endran1R = ran1L;ran2L = round(rand*(total-3)+2);    %随机数2while chromosome2(1,ran2L) == 0    %不能随机到0ran2L = round(rand*(total-3)+2);endran2R = ran2L;while chromosome1(1,ran1L-1) ~= 0    %左移直至第一个0出现ran1L = ran1L - 1;endwhile chromosome1(1,ran1R+1) ~= 0    %右移直至第一个0出现ran1R = ran1R + 1;endwhile chromosome2(1,ran2L-1) ~= 0    %左移直至第一个0出现ran2L = ran2L - 1;endwhile chromosome2(1,ran2R+1) ~= 0    %右移直至第一个0出现ran2R = ran2R + 1;end%交换片段**********************************************************temp1 = zeros(1,total); %临时储存temp2 = zeros(1,total); %临时储存length1 = ran1R-ran1L+1;    %片段长length2 = ran2R-ran2L+1;    %片段长for ii = 1:length1 %转移到临时储存temp1(1,ii) = chromosome1(1,ran1L+ii-1);endfor ii = 1:length2 %转移到临时储存temp2(1,ii) = chromosome2(1,ran2L+ii-1);endchrom1 = zeros(1,total+length2-length1);    %中间染色体1chrom2 = zeros(1,total+length1-length2);    %中间染色体2%重新拼接染色体***************************************************chrom1(1,1:ran1L-1) = chromosome1(1,1:ran1L-1);chrom1(1,ran1L:ran1L+length2-1) = temp2(1,1:length2);chrom1(1,ran1L+length2:total+length2-length1) = chromosome1(1,ran1R+1:total);chrom2(1,1:ran2L-1) = chromosome2(1,1:ran2L-1);chrom2(1,ran2L:ran2L+length1-1) = temp1(1,1:length1);chrom2(1,ran2L+length1:total+length1-length2) = chromosome2(1,ran2R+1:total);%第二步*************************************************************nala1 = zeros(1,total);%搜索temp2中有而temp1中没有的数,那个数1中必定重复nala11 = zeros(1,total);%存放nala中数的位置nala2 = zeros(1,total);%搜索temp1中有而temp2中没有的数,那个数2中必定重复nala22 = zeros(1,total);%存放nala中数的位置%搜索相互没有的数kk = 1; %nala的下标  好累啊,wwwww......for ii = 1:length2flag = 0;for j = 1:length1if temp2(1,ii) == temp1(1,j);flag = 1;endendif flag == 0nala1(1,kk) = temp2(1,ii);kk = kk + 1;endendkk = 1; %nala的下标for ii = 1:length1flag = 0;for j = 1:length2if temp1(1,ii) == temp2(1,j);flag = 1;endendif flag == 0nala2(1,kk) = temp1(1,ii);kk = kk + 1;endend%将多余的数设为0***************************************************ii = 1;while nala1(1,ii) ~= 0[x,xx] = find(chrom1==nala1(1,ii));  %找出重复的位置j = 1;while xx(1,j) >= ran1L && xx(1,j) <= ran1L+length2-1j = j + 1;endnala11(1,ii) = xx(1,j);    %将重复数的位置保存下来chrom1(1,xx(1,j)) = 0;  %%重复的数变为零ii = ii + 1;endii = 1;while nala2(1,ii) ~= 0[x,xx] = find(chrom2==nala2(1,ii));  %找出重复的位置j = 1;while xx(1,j) >= ran2L && xx(1,j) <= ran2L+length1-1j = j + 1;endnala22(1,ii) = xx(1,j);    %将重复数的位置保存下来chrom2(1,xx(1,j)) = 0;  %%重复的数变为零ii = ii + 1;end%补上没有的数******************************************************[xx,x] = size(nonzeros(nala1));%得到nala的大小[yy,y] = size(nonzeros(nala2));%得到nala的大小if yy-xx < 0     %交换后变成yy>xx的情况%交换[chrom1,chrom2] = exchange(chrom1,chrom2);[nala1,nala2] = exchange(nala1,nala2);[nala11,nala22] = exchange(nala11,nala22);end%   yy-xx > 0 -->  说明变化后1比2短-->1需要补0并且插入,2需要补0并且删0%   yy-xx < 0 -->  说明变化后2比1短-->2需要补0并且插入,1需要补0并且删0%补0ii = 1;while nala11(1,ii) ~= 0chrom1(1,nala11(1,ii)) = nala2(1,ii);%1中补0chrom2(1,nala22(1,ii)) = nala1(1,ii);%2中补0ii = ii + 1;end%||||||||stage3|||||||||%当前ii在下一位的位置%1插入&2删除*****************************************************model1 = chrom1;    %用来适应变量维度model2 = chrom2;j = 1;  %!!!!!!!j初始化应该放在while循环外面,小错误不断啊flag_nala22 = 1;
%         %两个chrom的维度是一个问题
%         chrom11 = zeros(1,total);
%         chrom22 = zeros(1,total);while nala2(1,ii) ~= 0%插入,先扩充model->存储变维后的数据;然后chrom扩充,得到model保存的数据model1 = [model1,0];    %注意顺序model1 = minsert(chrom1,nala2(1,ii),1);chrom1 = [chrom1,0];chrom1 = model1;%删除0,首先降序排列,用来从后向前删除;之后model变维while flag_nala22   %又是一个错误,靠,nala22temp每次循环都会被初始化,1次就够了,细心细心,淡定淡定......nala22temp = zeros(1,total-ii+1);nala22temp = nala22(1,ii:total);flag_nala22 = 0;endnala22temp = sort(nala22temp);nala22temp = fliplr(nala22temp);[q,qq] = size(chrom2);model2 = zeros(1,qq-1); %注意顺序model2 = mdelete(chrom2,nala22temp(1,j));j = j + 1;chrom2 = zeros(1,qq-1);chrom2 = model2;%千万不要忘记迭代+1ii = ii + 1;endfarm(i,:) = chrom1;farm(popsize - i + 1,:) = chrom2;%在整个算法中,我通过重复的数设0避免了0接着0的情况,很有成就感。end %交叉概率检测
end %main loop
end %function

四、运行结果



五、matlab版本及参考文献

1 matlab版本
2014a

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

【TWVRP】基于matlab遗传算法求解带时间窗的含充电站车辆路径规划问题【含Matlab源码 1177期】相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 【TWVRP】模拟退火算法求解带时间窗的车辆路径规划问题【含Matlab源码 160期】

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

  7. 【TWVRP】模拟退火算法求解带时间窗的多车型路径规划问题【含Matlab源码 913期】

    ⛄一.模拟退火算法简介 1 引言 模拟退火算法(Simulated Annealing,SA)的思想最早由Metropolis等人于1953年提出:Kirkpatrick于1983年第一次使用模拟退火 ...

  8. 【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题(总成本最低)【含Matlab源码 2590期】

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

  9. 【TWVRP】基于matlab模拟退火算法求解带时间窗的车辆路径规划问题【含Matlab源码 160期】

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

  10. 【TWVRP】基于matlab模拟退火算法求解带时间窗的多车型路径规划问题【含Matlab源码 913期】

    ⛄一.模拟退火算法简介 1 引言 模拟退火算法(Simulated Annealing,SA)的思想最早由Metropolis等人于1953年提出:Kirkpatrick于1983年第一次使用模拟退火 ...

最新文章

  1. 全球及中国海洋工程装备行业产值规模价值及投资风险预警报告2021-2027年版
  2. 线程队列,线程池和协程
  3. Effective Java之检查参数的有效性(三十八)
  4. ES6箭头函数和模板字符串
  5. 嵌入式linux h.264,利用ffmpeg来进行视频解码h.264格式(linux)
  6. Java泛型中的子类型化
  7. visual studio 按钮判断管理员和用户_用户管理的设计原则
  8. CTF中文件与16进制互转及相关操作(Python3)
  9. promise入门的准备工作-(尚硅谷教程笔记)
  10. 基于python+django框架+Mysql数据库的新闻信息管理系统设计与实现
  11. ad自动连线_ad如何自动布线
  12. Json解析工具对比
  13. Linux命令行安装图形化界面
  14. 【工具分享】一个阿里出品的免费在线图表制作工具(ChartCube 图表魔方)
  15. Second《C++ Primer》中文第四版
  16. 自学Java day24 一篇文章弄懂mySQL基础命令 从jvav到架构师
  17. 三种POSS材料(乙烯基POSS、氨基POSS和苯基POSS)
  18. angular的传值,子传父,父传子
  19. [PS业务知识]BCWS、BCWP、ACWP的理解
  20. 常见的agv控制系统及功能有哪些?

热门文章

  1. 力扣——分数排名(数据库的题
  2. Beautiful Sequence
  3. faster rcnn源码阅读笔记2
  4. iOS:面试八大陷阱
  5. Oracle 根据业务创建新的用户
  6. CSU 8月月赛 Decimal 小数化分数
  7. 七月算法机器学习4 凸优化初步
  8. C#委托 模板和回调函数
  9. Atitit 战略之道 attilax著 v4 r88
  10. atitit 商业项目常用模块技术知识点 v3 qc29