作者:彭澜
纽约州立大学水牛城分校工业工程系在读博士生,研究方向:车辆路径规划问题(VRP)
旅行商问题(TSP)是运筹学领域最知名的问题之一。本文将从整数规划模型建模的角度,介绍七种不同的建模方式,给大家提供对TSP的不同视角。
引言
本文将讨论“茴”字的六种写法,啊不对,旅行商问题的五类共七种建模模型。首先是两个最经典的模型,即DFJ模型和MTZ模型,这两个模型相信了解运筹学的朋友都有所接触,本文仅作少量拓展介绍。接下来的两类模型分别是基于货物流和最短路的模型,在国内现行的教材和中文材料中介绍较少,借此文也给大家提供一些思路。最后一个模型是分配问题模型,讨论了同样是解决TSP,采取最糟糕的建模方式的情况下模型能有多糟糕,也算是一个很有意思的角度。
Dantzig-Fulkerson-Johnson模型
首先我们来介绍TSP发展历史上的第一个基于割平面法的,也是最重要的模型——Dantzig-Fulkerson-Johnson(DFJ)模型。一看名字就知道,这三位都是运筹学巨擘:G. Dantzig是单纯形法的发明者,R. Fulkerson和L. Ford Jr. 共同发明了最大流网络问题中的经典的Ford-Fulkerson算法, S. M. Johnson是Ford-Johnson排序算法的发明者之一,该排序算法在提出后的20年内一直是排序算法中已知需要进行排序次数最少的。DFJ模型自1954年提出以来,一直都在TSP和VRP(车辆路径规划问题)的研究中占据核心的地位,其子回路消除约束也启发了各类TSP或VRP拓展模型。
对于DFJ模型,我们定义决策变量为0-1变量xij:
模型的目标函数可以写作
DFJ模型只有三组约束条件,如下
其中,约束(3)和约束(4)是流平衡约束,意味着对于每一个顾客(或仓库站点),都会从上一个顾客处出发去访问该顾客,也会从该顾客处出发去访问下一个顾客。但是如果只有这两组约束,我们只能保证每个顾客都连接到其他顾客处,无法保证所有的顾客都连接在同一条回路上,也就是无法避免下图所示的情形:
我们将这种无法覆盖所有顾客的回路称作子回路(subtour),约束(5)的目的就是消除所有的这种子回路,从而保证全局只有一条回路且该回路覆盖了所有节点。约束(5)的内容是,对于所有节点的集合V的所有子集合,如果这个子集合S不是只有一个节点或者包含了所有节点的特殊情形,那么,必须要有一条边从子集合S外出发,进入子集合S,且有另一条边从子集合S出发,到达子集合外的节点上。这样一来,所有的节点就都必须连接在同一条回路上,形成TSP的完整回路。
另一种对约束(5)等价的描述方式如下:
约束(6)的意思是,同样地,对于这些子集合,子集合内的节点之间的连边必须小于|S|-1,这样在子集合内就无法形成回路(对于n个节点,形成回路至少要n条边)。
由于子集合S是节点集合V的子集,而这种子集的数量是指数规模的,也就是说,在有n个顾客的算例中,DFJ模型的约束数量是级别的,决策变量的个数是
级别的。这就使得直接使用DFJ模型,罗列出所有的约束条件后进行求解不具有可行性,因此,通常我们会使用Lazy约束来进行求解。
所谓的Lazy约束其实是指在模型建立的时候不添加这组子回路约束,每次求解得到可行解(这里的可行解是指没有添加子回路约束的情况下的可行解,对于TSP本身不一定是可行解)后验证得到的解,如果解中存在子回路,那么就将子回路对应的约束添加进模型中,继续/重新对模型进行求解。这样一来,在绝大多数情况下,我们就不需要涉及到所有子回路约束,而只需要添加相对之下非常少量的约束就能进行求解。
目前运筹学领域常用的求解器(包括Gurobi,CPLEX等)都提供了callback功能,也就是在求解的过程中,一旦搜索到一个整数解,就调用callback函数,添加约束。由于求解采用的是割平面法,添加约束后依然可以继续进行,所以模型求解不需要停下来。另一种实现方法相