00 前言

各位小伙伴大家好,相信大家已经看过前面column generation求解vehicle routing problems的过程详解。该问题中,子问题主要是找到一条reduced cost最小的合法路径,然后加入到Master Problem中。其实,子问题也是一个著名的NP-Hard问题,今天我们就来介绍一下。

01 ESPPRC

考虑图1.1中描述的网络。 除了每条边的成本c_ij之外,还存在经过边(i,j)的所消耗的资源t_ij,比如时间。 我们的目标是找到从开始节点到结束节点的最短路径,每个节点只能访问一次,同时使得资源消耗满足可用的资源约束,比如全程不能超过多少时间。[1]

当然上面描述问题只是ESPPRC中的一个例子,实际的资源约束可能有很多种,比如在VRPTW的子问题中:[2]

起始节点和结束节点一样,每个节点有固定的时间窗和固定的需求。车辆不能超过容量约束的要求等等。

ESPPRC vs SPPRC

SPPRC和ESPPRC一样,只不过SPPRC去掉了elementary的约束,允许最短路中一个节点被访问多次。

02 应用

我们知道,ESPPRC是可以应用在column generation中的算法框架中的。那么具体是怎么应用的呢?我们知道,在column generation中,subproblem每次迭代就是找一条reduced cost最小的路径,然后加入到Master Problem中。但是对于ESPPRC来说,每次的cost一样的,那不每次都求出同一条路径吗???

不!在column generation中,其子问题ESPPRC中边的cost是会随着Master Problem的求得到对偶变量改变而改变的。还记得reduced cost是怎么计算的吗?

其中,式子(22)可以表达成式子(23),(23)是什么意思呢?b_ijk意思是边ij是否在路径k中。那么,在每一次迭代中,我们就可以利用Master Problem的对偶变量,来更新ESPPRC中每条边的cost,最终求得的路径cost就是column generation中的reduced cost。

03 常见的算法

ESPPRC的建模如下:[4]


求解SPPRC和ESPPRC常见的算法主要有以下几种:[3]

  • Dynamic programming and labeling algorithms
  • Lagrangean relaxation
  • Constraint programming(建模)
  • Heuristics

04 Pulse Algorithm

这一节介绍一个ESPPRC的精确算法Pulse Algorithm[5],算法的伪代码如下:

其中:

  • r:表示到达当前节点时的cost
  • q:表示到达当前节点时的装载量
  • t:表示到达当前节点所需的总时间,早到需要等待,不能晚到

大体的思想是通过bound算法确定到达每个节点的最低cost,然后pulse进行路径搜索,而之前bound求出来的最低cost就可以在pulse搜索的过程中起到定界的作用,去掉一些不好的路径。

bound的算法如下:

每个节点的最低cost(相当于一个lower bound)是怎么算出来的呢?简单来说是通过限定每个节点最晚到达时间。在每个节点都给定最晚到达时间t,然后计算在这个最晚到达时间下,每个到达每个节点的最低cost。然后让t递减,直到t减少到临界值。最终得到的是每个节点关于各个最晚到达时间的最低cost矩阵。

最后来看看pulse算法:

pulse是找路的过程,在该过程中:

  • isFeasible检查到达节点时路径是否满足各种资源约束。
  • checkBounds检查在当前到达时间下,到达节点的cost是否小于等于之前bound算法求出来的那个最晚时间下的最低cost,如果不是就丢弃该支路径。
  • rollback进行如下检查:

在每一个节点(开始节点除外),比如上图中节点j,如果实线路径的cost < 虚线路径的cost。那么砍掉实线的路径(已经有人的cost比你更低,你可以滚了),这就相当于一个回滚的操作。

以上>>>>>>>>>>>>>>>>>>>>>就是整个pulse算法。这里只是起到一个抛砖引玉的过程。可能讲的不是很详细,详细的过程请大家去阅读文献。

05 算法代码

关于整个pulse算法伪代码和讲解已经够详细了,这里给出一个C++的实现代码,是我远房的一个学长的学姐的男朋友写的(真话)。关于编译运行上面也说明得够详细了。

代码下载请关注我们的公众号哦!在后台回复【espprc】不包括【】即可下载。

reference

  • [1] A PRIMER IN COLUMN GENERATION, Jacques Desrosiers Marco E. L ubbecke
  • [2] A tutorial on column generation and branch-and-price for vehicle routing problems, Dominique Feillet
  • [3] SHORTEST PATH PROBLEMS WITH RESOURCE CONSTRAINTS, Stefan Irnich Guy Desaulniers
  • [4] An Exact Algorithm for the Elementary Shortest Path Problem with Resource Constraints: Application to Some Vehicle Routing Problems, Dominique Feillet, Pierre Dejax, Michel Gendreau, Cyrille Gueguen
  • [5] An Exact Algorithm for the Elementary Shortest Path Problem with Resource Constraints, Leonardo Lozano, Daniel Duque, Andrés L. Medaglia

干货 | 列生成VRPTW子问题ESPPRC( Elementary shortest path problem with resource constraints)介绍附C++代码的更多相关文章

  1. 干货|技术小白如何在45分钟内发行通证(TOKEN)并上线交易(附流程代码

    https://blog.csdn.net/HiBlock/article/details/80071478

  2. 干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码

    OUTLINE 前言 预备知识预警 什么是column generation 相关概念科普 Cutting Stock Problem CG求解Cutting Stock Problem 列生成代码 ...

  3. 列生成算法(求解Cutting Stock问题)

    列生成是用于求解大规模线性优化问题的一种算法,其实就是单纯形法的一种形式.单纯性可以通过不断迭代,通过换基变量的操作,最终找到问题的最优解.但是当问题的规模很大之后,变量的个数就会增大到在有限时间内无 ...

  4. 根据oracle的主键列生成SQLserver的主键

    根据oracle的主键列生成MsSQLServer的主键列 select 'alter table  ' || cu.table_name ||'  add constraint  '||' PK_' ...

  5. pandas 选择列或者添加列生成新的DataFrame

    选择某些列 import pandas as pd # 从Excel中读取数据,生成DataFrame数据 # 导入Excel路径和sheet name df = pd.read_excel(exce ...

  6. Bootstrap Blazor Table 组件(四)自定义列生成

    原文链接:https://www.cnblogs.com/ysmc/p/16223154.html Bootstrap Blazor 官方链接:https://www.blazor.zone/tabl ...

  7. excel的列生成算法

    echo '<pre>'; $i = 1; while($i < 703){ $char1 = floor($i / 26); $char2 = $i % 26; if($i % 2 ...

  8. pandas 由其中几列生成新的列

    data是一个dataframe #data["x1"]=data[["a","b"]].apply(lambda x:x["a& ...

  9. 模板列传值到子窗体中,子窗体中多选gridview中checkbox保存数据多项到数据库中

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

随机推荐

  1. 用cProfile做性能分析【转】

    原文地址: https://www.cnblogs.com/kaituorensheng/p/4453953.html

  2. Java自学-数组 增强型for循环

    Java 中如何使用增强for循环 增强型for循环在遍历一个数组的时候会更加快捷 步骤 1 : 增强型for循环 注:增强型for循环只能用来取值,却不能用来修改数组里的值 public class ...

  3. spring中bean的作用域属性singleton与prototype的区别

    1.singleton 当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会 ...

  4. Java知识回顾 (14)网络编程

    本资料来自于runoob,略有修改. 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细 ...

  5. iOS - 直播流程,视频推流,视频拉流,简介,SMTP、RTMP、HLS、 PLPlayerKit

    收藏笔记 1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机: ...

  6. IntelliJ IDEA 快捷键(转载收藏)

    自动代码 常用的有fori/sout/psvm+Tab即可生成循环.System.out.main方法等boilerplate样板代码 . 例如要输入for(User user : users)只需输 ...

  7. Python学习笔记-数字,列表,元祖,切片,循环

    数字 1,加减乘除:+,-,*,/ 2,平方:** 3,立方:**3 4,字符串转换:str(数字) 5,浮点数:带小数点  0.2 Python编程建议 import this >>&g ...

  8. 【快捷键】印象笔记Markdown快捷键

    新建 Markdown 笔记 CMD+D 粗体 CMD+B 斜体 CMD+I 删除线 CMD+S 分隔线 CMD+L 编号列表 CMD+Shift+O 项目符号列表 CMD+Shift+U 插入待办事 ...

  9. MySQL/MariaDB数据库的主从复制

     MySQL/MariaDB数据库的主从复制  作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL复制概述 1>.传统扩展方式 垂直扩展(也叫向上扩展,Sacle ...

  10. 接口测试 dubbo 接口测试技术

    本文转自测试之家 https://testerhome.com/topics/10481 dubbo是阿里巴巴开源的一套rpc方案,以为理念很契合微服务,这几年很火,用户里面不凡京东,当当,去哪儿等大 ...