一、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;否则,终止计算,输出最优解。

三、部分源代码

clc %清空命令行窗口
clear %从当前工作区中删除所有变量,并将它们从系统内存中释放
close all %删除其句柄未隐藏的所有图窗
tic % 保存当前时间
%% 蚁群算法求解DVRP
%输入:
%City           需求点经纬度
%Distance       距离矩阵
%AntNum         种群个数
%Alpha          信息素重要程度因子
%Beta           启发函数重要程度因子
%Rho            信息素挥发因子
%Q              常系数
%Eta            启发函数
%Tau            信息素矩阵
%MaxIter        最大迭代次数%输出:
%bestroute      最短路径
%mindisever     路径长度%% 加载数据
load('City.mat')        %需求点经纬度,用于画实际路径的XY坐标
load('Distance.mat')    %距离矩阵
load('Travelcon.mat')   %行程约束%% 初始化问题参数
CityNum = size(City,1)-1;    %需求点个数%% 初始化参数
AntNum = 8;                            % 蚂蚁数量
Alpha = 1;                              % 信息素重要程度因子
Beta = 5;                               % 启发函数重要程度因子
Rho = 0.1;                              % 信息素挥发因子
Q = 1;                                  % 常系数
Eta = 1./Distance;                      % 启发函数
Tau = ones(CityNum+1);                  % (CityNum+1)*(CityNum+1)信息素矩阵  初始化全为1
Population = zeros(AntNum,CityNum*2+1);  % AntNum行,(CityNum*2+1)列 的路径记录表
MaxIter = 50;                           % 最大迭代次数
bestind = ones(1,CityNum*2+1);    % 各代最佳路径
MinDis = zeros(MaxIter,1);              % 各代最佳路径的长度%% 迭代寻找最佳路径
Iter = 1;                               % 迭代次数初值
while Iter <= MaxIter %当未到达最大迭代次数%% 逐个蚂蚁路径选择for i = 1:AntNumTSProute=2:CityNum+1; %生成一条顺序不包括首尾位的升序TSP路线VRProute=[]; %初始化VRP路径while ~isempty(TSProute)%开辟新的子路径subpath=1; %先将配送中心放入子路径起点delete=subpath; %delete(end)=1给第一次进入内while的P(k)首项用DisTraveled=0; %此子路径的距离初始化为零while ~isempty(TSProute) %为子路径subpath第二个及以后的位置安排需求点%% 计在内while中计算城市间转移概率P = TSProute; % 为轮盘赌选择建立等于剩余需经过城市数量的长度的向量for k = 1:length(TSProute)%delete(end)为刚刚经过的城市,TSProute(k)为剩余可能经过的城市P(k) = Tau(delete(end),TSProute(k))^Alpha * Eta(delete(end),TSProute(k))^Beta; %省略相同分母endP = P/sum(P);% 轮盘赌法选择下一个访问城市Pc = cumsum(P); %累加概率TargetIndex = find(Pc >= rand); %寻找左数第一个大于伪随机数的累加概率的索引target = TSProute(TargetIndex(1)); %此索引对应的城市%不要强行改变蚂蚁通过轮盘法选到的下一个城市%它选到就确定了,然后如果超约束,结束此subpath%判断行程约束if DisTraveled+Distance(delete(end),target)+Distance(target,1) > TravelconbreakelseDisTraveled=DisTraveled+Distance(delete(end),target); %若符合,则经过的距离累加此距离%此点加入子路径subpath=[subpath,target];%此点加入要删除的点序列delete=[delete,target];%TSP路径中排除已安排的城市TSProute=setdiff(TSProute,delete);endend %内while结束,此subpath结束function DrawPath(route,City)
%% 画路径函数
%输入
% route     待画路径
% City      各城市坐标位置figure
hold on %保留当前坐标区中的绘图,从而使新添加到坐标区中的绘图不会删除现有绘图
box on %通过将当前坐标区的 Box 属性设置为 'on' 在坐标区周围显示框轮廓
xlim([min(City(:,1)-0.01),max(City(:,1)+0.01)]) %手动设置x轴范围  xlimit
ylim([min(City(:,2)-0.01),max(City(:,2)+0.01)]) %手动设置y轴范围% 画配送中心点
plot(City(1,1),City(1,2),'bp','MarkerFaceColor','r','MarkerSize',15) %plot(x轴坐标,y轴坐标,圆圈,颜色,某色RGB三元组)% 画需求点
plot(City(2:end,1),City(2:end,2),'o','color',[0.5,0.5,0.5],'MarkerFaceColor','g') %plot(x轴坐标,y轴坐标,圆圈,颜色,某色RGB三元组)%添加点编号
for i=1:size(City,1)text(City(i,1)+0.002,City(i,2)-0.002,num2str(i-1)); %为点进行编号 text(x轴坐标,y轴坐标,圆圈,颜色,红色RGB三元组)
end

四、运行结果



五、matlab版本及参考文献

1 matlab版本
2014a

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

【DVRP】基于matlab蚁群算法求解带距离的VRP问题【含Matlab源码 1040期】相关推荐

  1. 【配送路径规划】基于matlab蚁群算法求解配送路径最短问题【含Matlab源码 2222期】

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

  2. 【Matlab DVRP】蚁群算法求解带距离的车辆路径规划问题【含源码 1040期】

    一.代码运行视频(哔哩哔哩) [Matlab DVRP]蚁群算法求解带距离的车辆路径规划问题[含源码 1040期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1 ...

  3. 【微电网优化】基于matlab粒子群算法求解综合能源系统优化问题【含Matlab源码 1969期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[微电网优化]基于matlab粒子群算法求解综合能源系统优化问题[含Matlab源码 1969期] 点击上面蓝色字体,直接付费下载,即可. ...

  4. 【TWVRP】基于matlab蚁群算法求解带时间窗车辆路径规划问题【含Matlab源码 1930期】

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

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

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

  6. 【配送路径规划】蚁群算法求解配送路径最短问题【含Matlab源码 2222期】

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

  7. 【优化布局】基于matlab粒子群算法求解充电站布局优化问题【含Matlab源码 012期】

    ⛄一.粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在.生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都 ...

  8. 【路径规划】基于matlab蚁群算法机器人栅格地图最短路径规划【含Matlab源码 119期】

    ⛄一.简介 路径规划是实现移动机器人自主导航的关键技术,是指在有障碍物的环境中,按照一定的评价标准(如距离.时间.能耗等),寻找到一条从起始点到目标点的无碰撞路径,这里选取最短距离路径规划的评价标准, ...

  9. 【路径规划】基于matlab蚁群算法机器人栅格地图最短路径规划【含Matlab源码 1580期】

    ⛄一.简介 路径规划是实现移动机器人自主导航的关键技术,是指在有障碍物的环境中,按照一定的评价标准(如距离.时间.能耗等),寻找到一条从起始点到目标点的无碰撞路径,这里选取最短距离路径规划的评价标准, ...

  10. 【路径规划】基于matlab蚁群算法机器人栅格地图最短路径规划【含Matlab源码 1618期】

    ⛄一.蚁群算法及栅格地图简介 1 蚁群算法 1.1 蚁群算法的提出 蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来寻找优化路径的机率型算法.它由Marc ...

最新文章

  1. 【数据结构】最小生成树 Prim算法 Kruskal算法
  2. Objective-C 内存管理retain和release
  3. 【Python】0/1背包、动态规划
  4. 一些有用的Linux命令
  5. python常用内建函数
  6. 计算机一级b考试理论知识,全国计算机等级考试一级b知识点
  7. Java笔记-使用RestTemplate发送http数据包(get与post)
  8. IP地址的定义和含义
  9. My97DatePicker JS时间控件 当前日期前后不能选
  10. 数据结构c语言版第二版(严蔚敏)第一章笔记
  11. python画点位变化向量图
  12. 【理论】RS-232、RS-485、RS-422通信接口标准介绍
  13. NX二次开发-UFUN新建工程图UF_DRAW_create_drawing
  14. NoSQLBooster for MongoDB 5x版本商业版(mac os)
  15. 高效上网教程---资源软件搜索技巧(搜索好用软件或者app去哪些网站)
  16. VLOOKUP函数使用及注意事项
  17. linux下非root用户如何修改root权限的文件
  18. php调试技术手册读书笔记,RT-Thread读书笔记之一:开始学习了
  19. Removal【套路DP】
  20. 西工大机考《大学英语2》大作业网考

热门文章

  1. 如何简单的理解TDD与DDT
  2. PostgreSQL 递归查询 (转)
  3. Linux下的指令:tail
  4. 移动端 短信发送,一键拨号功能
  5. 分析Linux内核创建一个新进程的过程
  6. IDEA配置openCV
  7. 传智播客 Web静态服务器-6-epoll
  8. 20191109每日一句
  9. python 字符串以及通过dos命令运行py脚本
  10. 190318每日一句