以下文章来源于数据魔术师 ,作者邓发珩、周航
前言
哈罗大家好~!
想必大家在刚开始学习运筹学模型时,会觉得有些茫然不知所措吧?比如一大堆神奇的名词,各种各样的约束。。。反正我一开始是很懵的状态。
那么我们这次带来一个比较基础的带时间窗的最短路问题(Shortest Path Problem with Time Windows,简称SPPTW),使用一个基础的精确算法,即label-setting算法,来求解它。由于参考文献年代比较久远,这种方法现在已经有了很大的优化。当然,只有先从基础开始,一步步攀登才能不断解决更困难的问题。(说白了就是小编也还不会辣么难的问题啦)
话不多说,开始这篇文章吧!
欲下载本文相关的代码及算例,请关注公众号【程序猿声】,后台回复【SPPTWCPP】不包括【】即可
目录
一. SPPTW简介
二. Label-setting算法简介
三. 占优剪枝:dominate
四. 标记处理的顺序:字典排序
五. 算法流程与例子
六. C++源代码分享
SPPTW简介
先来简单介绍要处理的问题。
最短路问题(Shortest Path Problem,简称SPP):
在一个图中,每条边都有与它相关的数字,我们将这样的数字称为权。对下图G=(N,A)而言,每条边都只有一个权表示花费(cost)(可以理解为该边的长度)。给定起点p,求出p到达其余各点花费最小的路径。
例如上面这张图。每条边上都有一个权用来表示花费。传统的最短路问题要求我们求出起点(例如v_0)到其余各点的最小成本的路径。比如v_0到v_4的最短路径是v_0→v_2→v_3→v_4,其总花费是19;而v_0→v_4这条路径,总花费为30,因此不是v_0到v_4的最短路径。
注意,在经典的最短路问题中,边上的权重一般为正值。
在SPPTW中:
图中每条边有两个权重