一、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 蚁群算法(ant colony algorithm,ACA)起源和发展历程
Marco Dorigo等人在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从而能快速的找到目标,于是在1991年在其博士论文中首次系统地提出一种基于蚂蚁种群的新型智能优化算法“蚂蚁系统(Ant system,简称AS)”,后来,提出者及许多研究者对该算法作了各种改进,将其应用于更为广泛的领域,如图着色问题、二次分配问题、工件排序问题、车辆路径问题、车间作业调度问题、网络路由问题、大规模集成电路设计等。近些年来,M.Dorigo等人把蚂蚁算法进一步发展成一种通用的优化技术“蚁群优化(Ant Colony Optimization,简称ACO)”,并将所有符合ACO框架的算法称为“蚁群优化算法(ACO algorithm)”。


具体来说,各个蚂蚁在没有事先告知食物在什么地方的前提下开始寻找食物。当一只找到食物以后,它会向环境释放一种挥发性分泌物pheromone (称为信息素,该物质随着时间的推移会逐渐挥发消失,信息素浓度的大小表征路径的远近)信息素能够让其他蚂蚁感知从而起到一个引导的作用。通常多个路径上均有信息素时,蚂蚁会优先选择信息素浓度高的路径,从而使浓度高的路径信息素浓度更高,形成一个正反馈。有些蚂蚁并没有像其它蚂蚁一样总重复同样的路,他们会另辟蹊径,如果另开辟的道路比原来的其他道路更短,那么,渐渐地,更多的蚂蚁被吸引到这条较短的路上来。最后,经过一段时间运行,可能会出现一条最短的路径被大多数蚂蚁重复着。最终,信息素浓度最高的路径即是最终被蚂蚁选中的最优路径。
与其他算法相比,蚁群算法是一种比较年轻的算法,具有分布式计算、无中心控制、个体之间异步间接通信等特点,并且易于与其他优化算法相结合,经过不少仁人志士的不断探索,到今天已经发展出了各式各样的改进蚁群算法,不过蚁群算法的原理仍是主干。

2 蚁群算法的求解原理
基于上述对蚁群觅食行为的描述,该算法主要对觅食行为进行以下几个方面模拟:
(1)模拟的图场景中包含了两种信息素,一种表示家,一种表示食物的地点,并且这两种信息素都在以一定的速率进行挥发。
(2)每个蚂蚁只能感知它周围的小部分地方的信息。蚂蚁在寻找食物的时候,如果在感知范围内,就可以直接过去,如果不在感知范围内,就要朝着信息素多的地方走,蚂蚁可以有一个小概率不往信息素多的地方走,而另辟蹊径,这个小概率事件很重要,代表了一种找路的创新,对于找到更优的解很重要。
(3)蚂蚁回窝的规则与找食物的规则相同。
(4)蚂蚁在移动时候首先会根据信息素的指引,如果没有信息素的指引,会按照自己的移动方向惯性走下去,但也有一定的机率改变方向,蚂蚁还可以记住已经走过的路,避免重复走一个地方。
(5)蚂蚁在找到食物时留下的信息素最多,然后距离食物越远的地方留下的信息素越少。找到窝的信息素留下的量的规则跟食物相同。蚁群算法有以下几个特点:正反馈算法、并发性算法、较强的鲁棒性、概率型全局搜索、不依赖严格的数学性质、搜索时间长,易出现停止现象。
蚂蚁转移概率公式:

公式中:是蚂蚁k从城市i转移到j的概率;α,β分别为信息素和启发式因子的相对重要程度;为边(i,j)上的信息素量;为启发式因子;为蚂蚁k下步允许选择的城市。上述公式即为蚂蚁系统中的信息素更新公式,是边(i,j)上的信息素量;ρ是信息素蒸发系数,0<ρ<1;为第k只蚂蚁在本次迭代中留在边(i,j)上的信息素量;Q为一正常系数;为第k只蚂蚁在本次周游中的路径长度。
在蚂蚁系统中,信息素更新公式为:

3 蚁群算法的求解步骤:
(1)初始化参数在计算之初,需要对相关参数进行初始化,如蚁群规模(蚂蚁数量)m、信息素重要程度因子α、启发函数重要程度因子β、信息素会发银子ρ、信息素释放总量Q、最大迭代次数iter_max、迭代次数初值iter=1。
(2)构建解空间将各个蚂蚁随机地置于不同的出发点,对每个蚂蚁k(k=1,2,3…m),按照(2-1)计算其下一个待访问城市,直到所有蚂蚁访问完所有城市。
(3)更新信息苏计算每个蚂蚁经过路径长度Lk(k=1,2,…,m),记录当前迭代次数中的最优解(最短路径)。同时,根据式(2-2)和(2-3)对各个城市连接路径上信息素浓度进行更新。
(4) 判断是否终止若iter<iter_max,则令iter=iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,终止计算,输出最优解。
(5)判断是否终止若iter<iter_max,则令iter=iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,终止计算,输出最优解。3. 判断是否终止若iter<iter_max,则令iter=iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,终止计算,输出最优解。

三、部分源代码


clear
clc
close all
tic
%% 用importdata这个函数来读取文件
c101=importdata('c101.txt');
cap=200;                                                        %车辆最大装载量
%% 提取数据信息
E=c101(1,5);                                                    %配送中心时间窗开始时间
L=c101(1,6);                                                    %配送中心时间窗结束时间
vertexs=c101(:,2:3);                                            %所有点的坐标x和y
customer=vertexs(2:end,:);                                      %顾客坐标
cusnum=size(customer,1);                                        %顾客数
v_num=25;                                                       %车辆最多使用数目
demands=c101(2:end,4);                                          %需求量
a=c101(2:end,5);                                                %顾客时间窗开始时间[a[i],b[i]]
b=c101(2:end,6);                                                %顾客时间窗结束时间[a[i],b[i]]
width=b-a;                                                      %顾客的时间窗宽度
s=c101(2:end,7);                                                %客户点的服务时间
h=pdist(vertexs);
dist=squareform(h);                                             %距离矩阵
%% 初始化参数
m=50;                                                           %蚂蚁数量
alpha=1;                                                        %信息素重要程度因子
beta=3;                                                         %启发函数重要程度因子
gama=2;                                                         %等待时间重要程度因子
delta=3;                                                        %时间窗跨度重要程度因子
r0=0.5;                                                         %r0为用来控制转移规则的参数
rho=0.85;                                                       %信息素挥发因子
Q=5;                                                            %更新信息素浓度的常数
Eta=1./dist;                                                    %启发函数
Tau=ones(cusnum+1,cusnum+1);                                    %信息素矩阵
Table=zeros(m,cusnum);                                          %路径记录表
iter=1;                                                         %迭代次数初值
iter_max=30;                                                   %最大迭代次数
Route_best=zeros(iter_max,cusnum);                              %各代最佳路径
Cost_best=zeros(iter_max,1);                                    %各代最佳路径的成本
%% 迭代寻找最佳路径
while iter<=iter_max%% 先构建出所有蚂蚁的路径%逐个蚂蚁选择for i=1:m%逐个顾客选择for j=1:cusnumr=rand;                                             %r为在[0,1]上的随机变量np=next_point(i,Table,Tau,Eta,alpha,beta,gama,delta,r,r0,a,b,width,s,L,dist,cap,demands);Table(i,j)=np;endend%% 计算各个蚂蚁的成本=1000*车辆使用数目+车辆行驶总距离cost=zeros(m,1);NV=zeros(m,1);TD=zeros(m,1);for i=1:mVC=decode(Table(i,:),cap,demands,a,b,L,s,dist);[cost(i,1),NV(i,1),TD(i,1)]=costFun(VC,dist);end%% 计算最小成本及平均成本if iter == 1[min_Cost,min_index]=min(cost);Cost_best(iter)=min_Cost;Route_best(iter,:)=Table(min_index,:);else[min_Cost,min_index]=min(cost);Cost_best(iter)=min(Cost_best(iter - 1),min_Cost);if Cost_best(iter)==min_CostRoute_best(iter,:)=Table(min_index,:);elseRoute_best(iter,:)=Route_best((iter-1),:);endend%% 根据转移公式,找到蚂蚁k从i点出发移动到的下一个点j,j点必须是满足容量及时间约束且是未被蚂蚁k服务过的顾客function j=next_point(k,Table,Tau,Eta,alpha,beta,gama,delta,r,r0,a,b,width,s,L,dist,cap,demands)
route_k=Table(k,:);                                         %蚂蚁k的路径
i=route_k(find(route_k~=0,1,'last'));                       %蚂蚁k正在访问的顾客编号
if isempty(i)i=0;
end
route_k(route_k==0)=[];                                     %将0从蚂蚁k的路径记录数组中删除
cusnum=size(Table,2);                                       %顾客数目
allSet=1:cusnum;                                            %setxor(a,b)可以得到a,b两个矩阵不相同的元素,也叫不在交集中的元素,
unVisit=setxor(route_k,allSet);                             %找出蚂蚁k未服务的顾客集合
uvNum=length(unVisit);                                      %找出蚂蚁k未服务的顾客数目
[VC,NV,TD]=decode(route_k,cap,demands,a,b,L,s,dist);        %蚂蚁k目前为止所构建出的所有路径
%如果当前路径配送方案为空
if ~isempty(VC)route=VC{end,1};                                            %蚂蚁k当前正在构建的路径
else%如果当前路径配送方案不为空route=[];
end
lr=length(route);                                           %蚂蚁k当前正在构建的路径所访问顾客数目
preroute=zeros(1,lr+1);                                     %临时变量,储存蚂蚁k当前正在构建的路径添加下一个点后的路径
preroute(1:lr)=route;
Nik=next_point_set(k,Table,cap,demands,a,b,L,s,dist);       %找到蚂蚁k从i点出发可以移动到的下一个点j的集合,j点必须是满足容量及时间约束且是未被蚂蚁k服务过的顾客%% 如果r<=r0,j=max{[Tau(i,j)]^alpha * [Eta(i+1,j+1)]^beta * [1/width(j)]^gama * [1/wait(j)]^delta}
if r<=r0%如果Nik非空,即蚂蚁k可以在当前路径从顾客i继续访问顾客if ~isempty(Nik)Nik_num=length(Nik);p_value=zeros(Nik_num,1);                           %记录状态转移概率for h=1:Nik_numj=Nik(h);preroute(end)=j;[~,~,wait,~]=begin_s(preroute,a,s,dist);if wait(end)==0wait(end)=1e-8;endp_value(h,1)=((Tau(i+1,j+1))^alpha)*((Eta(i+1,j+1))^beta)*((1/width(j))^gama)*((1/wait(end))^delta);end[~,maxIndex]=max(p_value);                          %找出p_value中最大值所在序号j=Nik(maxIndex);                                    %确定顾客jelse%如果Nik为空,即蚂蚁k必须返回配送中心,从配送中心开始访问新的顾客p_value=zeros(uvNum,1);                             %记录状态转移概率for h=1:uvNumj=unVisit(h);preroute(end)=j;[~,~,wait,~]=begin_s(preroute,a,s,dist);if wait(end)==0wait(end)=1e-8;endp_value(h,1)=((Tau(i+1,j+1))^alpha)*((Eta(i+1,j+1))^beta)*((1/width(j))^gama)*((1/wait(end))^delta);end[~,maxIndex]=max(p_value);                          %找出p_value中最大值所在序号j=unVisit(maxIndex);                                %确定顾客jend
else%% 如果r>r0,依据概率公式用轮盘赌法选择点j%如果Nik非空,即蚂蚁k可以在当前路径从顾客i继续访问顾客if ~isempty(Nik)Nik_num=length(Nik);p_value=zeros(Nik_num,1);                           %记录状态转移概率for h=1:Nik_numj=Nik(h);preroute(end)=j;[~,~,wait,~]=begin_s(preroute,a,s,dist);if wait(end)==0wait(end)=1e-8;endp_value(h,1)=((Tau(i+1,j+1))^alpha)*((Eta(i+1,j+1))^beta)*((1/width(j))^gama)*((1/wait(end))^delta);endindex=roulette(p_value);                            %根据轮盘赌选出序号j=Nik(index);                                       %确定顾客jelse%如果Nik为空,即蚂蚁k必须返回配送中心,从配送中心开始访问新的顾客p_value=zeros(uvNum,1);                             %记录状态转移概率for h=1:uvNumj=unVisit(h);preroute(end)=j;[~,~,wait,~]=begin_s(preroute,a,s,dist);if wait(end)==0wait(end)=1e-8;endp_value(h,1)=((Tau(i+1,j+1))^alpha)*((Eta(i+1,j+1))^beta)*((1/width(j))^gama)*((1/wait(end))^delta);end

四、运行结果



五、matlab版本及参考文献

1 matlab版本
2014a

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

【TWVRP】基于matalb蚁群算法求解带时间窗的车辆路径规划问题【含Matlab源码 775期】相关推荐

  1. 【TWVRP】基于matlab鲸鱼算法求解带时间窗开放式车辆路径问题【含Matlab源码 1986期】

    ⛄一.鲸鱼算法简介 鲸鱼优化算法(Whale Optimization Algorithm,WOA)是澳大利亚学者Mirjalili等根据座头鲸的狩猎方式提出的一种新的群智能优化算法.鲸鱼在大海中随机 ...

  2. 【TWVRP】基于matlab蚁群算法求解带时间窗的车辆路径规划(成本最低)【含Matlab源码 2514期】

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

  3. 【TWVRP】蚁群算法求解带时间窗的车辆路径规划问题【含Matlab源码 1406期】

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

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

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

  5. 【路径规划】基于粒子群算法求解带时间窗的车辆路径规划问题VRPTW模型matlab源码

    1 模型简介 将粒子群算法(PSO)应用于带时间窗车辆路径优化问题(VRPTW),构造车辆路径问题的粒子表达方法,建立了此问题的粒子群算法,并与遗传算法作了比较.实验结果表明,粒子群算法可以快速,有效 ...

  6. 【TWVRP】粒子群算法求解带时间窗的车辆路径规划问题【含Matlab源码 334期】

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

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

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

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

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

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

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

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

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

最新文章

  1. 今晚开播 | 人脸识别的最新进展以及工业级大规模人脸识别实践探讨
  2. java rest post list,Java RestTemplate.postForLocation方法代码示例
  3. mysql存中文_mysql数据库存储中文数据的解决办法
  4. layui循环数据并渲染_从简单到复杂三维图形渲染管线
  5. visual studio开启多核编译方法
  6. 精益设计:“纸上谈兵”的说服力
  7. 【Level 08】U08 Positive Attitude L6 Join our virtual community
  8. mysql中的编号怎么自动加_MySQL中实现ID编号自动增加的方法
  9. tomcat7,8 centos7 配置apr极好教程
  10. java kafka面试题_八年面试生涯,整理了一套Kafka面试题
  11. 聊聊另外一个Druid(很全)
  12. spring mvc 配置使用定时任务
  13. SFB 项目经验-11-为某上市企业的Skype for Business规划与实施
  14. 用GitHub做一份精美的在线简历
  15. HTML网页设计:CSS渐变、过渡
  16. 德国柏林计算机比赛,震撼!绝地求生世界杯德国柏林开场秀,盛况空前!
  17. 夏天简单实用驱蚊小妙招
  18. 机器视觉 | 光源照明综述(详细版)
  19. 路由器BRAS交换机实用维护操作
  20. Android中身份证正反面、营业执照横竖版的拍摄和裁剪

热门文章

  1. ld: i386 架构于输入文件foo.o 与 i386:x86-64 输出不兼容
  2. delete语句与reference约束 FK_subplan_job_id冲突问题,导致job无法删除解决办法
  3. ubuntu下安装ros出现“无法下载-package.ros.org中某个包-校验和不符”的解决方法...
  4. sqlserver 触发器语法
  5. 【WinCE版凯立德】2012春季版地图下载
  6. 使用SpringSide 3.1.4.3开发Web项目的全过程(中下)
  7. 【Vegas原创】Oracle批量create、Lock user的方法
  8. tinyxml读xml文件,转化字节,c#解析
  9. Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别
  10. Atitit.创建快捷方式 windows快捷方式的原理