一、TSP问题介绍
旅行商问题(Travelingsalesman problem),简称为TSP问题,即在一个具有n个城市的完全图中,旅行者希望进行一次巡回旅行,或经历一次哈密顿回路,可以恰好访问每一个城市一次,并且最终回到出发城市。而这次巡回旅行的总费用为访问各个城市费用的总和,故旅行者同时希望整个行程的费用是最低的,求这个路线的排列策略。
二、整数规划模型介绍
2.1什么是整数规划
假设有一个线性规划(Linear Program)
其中A是m×n的矩阵,c是n维行向量,b是m维列向量,x是n维列向量。
我们添加一个限制,即部分变量必须取整数值,可以得到一个混合整数规划(MIP,Mixed Integer Program)如下:
其中,A是m×n的矩阵,G是m×p矩阵,c是n维行向量,h是p维行向量,x是整数变量的n维列向量,y是实变量的p维列向量。
如果所有变量都要求是整数,我们可以得到如下的整数规划模型(IP,Integer Program):
如果所有变量都要求取值为0或1,我们可以得到一个0-1整数规划模型(BIP,0-1 Binary Integer Program):
2.2如何利用整数规划
首先需要了解组合优化问题(COP,combinatorial optimization problem),对于这类问题我们通常会有一个有限集N={1,2,...n},每个元素的权重为c,F是N的可行子集,那么寻找最小权重可行子集的问题可表示为:
COP问题常常可以转化为IP和BIP问题。
为了解决问题需要数学建模。在计算中,将现实问题转化为数学公式需要系统地完成。应明确区分问题中的数据和模型中使用的变量。要注意以下几点:
(1)定义必要的变量。
(2)使用这些变量定义一组约束,使可行点对应于问题的可行解。
(3)使用这些变量定义目标函数。
如果出现困难,可以定义一组额外的或替代的变量并进行迭代。定义变量和约束可能并不总是像线性规划那么简单,尤其是对COP问题。我们通常会比较关注对子集S⊆ N的选择。为此,我们通常使用S的关联向量,即n维0–1向量xS,如果j∈ S,则xjS=1、 否则xjS=0。
2.3经典的整数规划问题
2.3.1指派问题
有n人可执行n项工作。每个人被指派只执行一项工作。每个人的禀赋不同,因此每个人完成不同任务的成本不同,因此如果i被分配去完成工作j,其成本为cij。问题目标是找到成本最小的分配方式。
对变量的规定如下:若i被分配去完成工作j,则xij=1;否则xij=0。
对约束的规定如下:
每个人i只完成一项工作:
每项工作j只由一个人完成:
变量是0-1变量:
对目标函数的定义:
2.3.2 0-1背包问题
有预算b可用于投资项目,有n个项目可选,项目j的支出是aj,其预期回报是cj。目标是选择一组投资项目,要求总投入不能超过预算,并使预期回报最大化。
对变量的规定如下:若项目j被选中,则xj=1;若项目j未被选中,则xj=0。
对约束的规定如下:
总投入不能超过预算:
变量是0-1变量:
对目标函数的定义:
2.3.3集合覆盖问题
给定一些区域,问题是决定在哪里安装一套应急服务中心。对于每个可能的中心,安装服务中心的成本以及它可以服务的地区都是已知的。例如,如果中心是消防站,消防站可以为那些配备消防车的地区提供服务,以便在八分钟内到达火灾现场。目标是选择一组成本最低的服务中心,以便覆盖每个地区。
首先,我们可以将其表述为比较抽象的COP问题。设区域集为M={1,…,M},可能的中心集为N={1,…,N}。中心j∈ N可服务的地区是Sj⊆ M,安装成本为cj。可以得到:
其次,我们将其转化为BIP问题。为了便于描述,我们首先构造0-1关联矩阵A,如果i∈ Sj,则aij=1,否则aij=0。
对变量的规定如下:若中心j被选中,则xj=1;若中心j未被选中,则xj=0。
对约束的规定如下:
区域i至少能被一个中心服务:
变量是0-1变量:
对目标函数的定义:
三、整数规划模型解决TSP问题
现在将TSP问题表述为BIP问题。
对变量的规定如下:若旅行商从城市i直接到了城市j,则xij=1;否则xij=0。
对约束的规定如下:
旅行商只离开过城市i一次:
旅行商只到达了城市j一次:
但是以上的约束条件可能会产生断开连接的解,也就是形成多个联通分支,这种连通分支,在TSP问题中叫做子回路,如下图3-1所示:
为了消除这种现象,有以下两种方法:
1、添加新的约束强制销售人员必须从一组城市传递到另一组城市,即所谓的割集约束(cut-set constraints):
(S不是空集,也不是全集;S内外至少有一个连接)
变量是0-1变量:
对目标函数的定义:若从城市i到城市j的距离为cij,则目标函数是:
2、子回路消除约束(subtour elimination constraints):
添加新的约束消除解集中产生的子回路,有两种添加方式:
第一种:
(集合S中的城市数量在2个以上,n-1个以下,S内部不形成回路)
用反证法即可证明该约束能消除子回路:假设不满足该约束,那么就存在一个N的子集S,使得
这表示集合S中的边数大于等于S中点的数量,也就是说集合S中存在回路。所以满足该约束可以消除子回路。
第二种:
为了使ij取不同值,我们将从城市i到城市j的距离定义为cij,并且令cii=M,其中M是一个非常大的数,这样就能保证旅行商不会从城市i离开后又直接进入城市i。
然后针对每个城市i,引入一个新的连续变量ui,并添加如下约束:
同样的,用反证法可以证明:
首先,若城市i与j之间有连边,即xij=1,那么上面的约束就变为
也就是说沿着回路,ui是一直增加的。接下来,我们假定存在子回路2->4->6->2满足上述约束,那么就有
这是不可能的,因此添加上述约束,能够保证不存在子回路。
四、基于Matlab使用求解器解决TSP问题
在求解TSP问题的线性规划模型时,最关键的环节便是消除子回路。本实验对比4种解决方法:MTZ1、MTZ2、cutset、subtour elimination在消除TSP问题子回路过程中发挥的作用,并根据实验结果得出了一些相应结论。基于约束条件MTZ1、MTZ2、cutset及subtour elimination的TSP线性规划模型与Matlab伪代码如下:
图4-1 子回路消除条件为MTZ1、MTZ2的数学建模
图4-2 子回路消除条件为MTZ1的伪代码
图4-3 子回路消除条件为MTZ2的伪代码
图4-4 子回路消除条件为cutset的数学建模
图4-5 子回路消除条件为cutset的伪代码
图4-6 子回路消除条件为subtour elimination的数学建模
图4-7 子回路消除条件为subtour elimination的伪代码
从以上内容不难看出,MTZ1与MTZ2的数学建模相同,但二者伪代码有细微差别。由于MTZ2的限制条件较MTZ1多出一条:若xij=1,则uj>ui+1,该判定过程需要一定时间,因此理论上基于约束条件MTZ1的线性规划模型将更快消除子约束并求得最优解。cutset与subtour elimination的数学建模不同,但二者伪代码相似,都需要穷举2:n-1个元素的所有子集以破除子回路。然而cutset的思路是子集S内外至少有一个连接,以此避免S内部形成闭合回路;subtour elimination则是从子集S内各元素相连形成的边数与所有元素点数的数量关系出发,判定集合内是否存在子回路。
为了提高解决问题的效率,我们在整数规划问题中借助求解器。在这里为读者介绍本篇解决方法:Yalmip和Gurobi。Yalmip是Lofberg开发的一款免费优化求解工具,其最大的特色在于集成许多外部的最优化求解器,形成一种统一的建模求解语言,并提供Matlab的调用API,减少了学习者的学习成本。Gurobi是由美国Gurobi公司开发的新一代大规模数学规划优化器,在 Decision Tree for Optimization Software 网站举行的第三方优化器评估中,展示出更快的优化速度和精度,成为优化器领域的新翘楚。
将上述工具嵌入Matlab环境中,并分别使用Yalmip与Gurobi,基于不同的TSP线性规划消除子回路约束条件MTZ1、MTZ2、cutset、subtour elimination对经典TSP算例Berlin8、Berlin52进行求解,实验结果如图4-8、图4-9所示。各位读者可在互联网搜索Yalmip及Gurobi的下载、安装和配置方法,在此不做赘述。
图4-8 使用Yalmip求解算例
由图4-8可知,Yalmip在求解规模较小的Berlin8算例过程中有不俗的表现,对于约束条件MTZ1、cutset与subtour elimination的求解耗时均在0.2s左右,求解MTZ2的耗时稍长,超过了0.5s,但使用Yalmip求解基于上述4种约束的Berlin8算例均能得到最优解2551。然而,Yalmip自身存在着局限性,在面对规模庞大的算例Berlin52时的求解表现非常糟糕,耗时5min以上依旧未能得出任何一个约束下的可行(最优)解。
图4-9 使用Gurobi求解算例
由图4-9可知,Gurobi求解Berlin8算例的表现与Yalmip不相上下,甚至对于约束MTZ2的求解用时比Yalmip更短,然而就Gurobi对于另外三个消除子回路约束MTZ1、cutst、subtour elimination的求解耗时而言,则比Yalmip略长,因为Gurobi需花费更多的时间完成初始化。Gurobi求解Berlin52算例的表现明显优于Yalmip,其分别耗时6.105s、9.777s得到了MTZ1、MTZ2的目标值7542,不过遗憾的是,调用Gurobi也没能成功求解基于约束cutset与subtour elimination的Berlin52算例。
可见,无论使用Yalmip还是Gurobi,在cutset与subtour elimination的约束条件下均无法在可接受时间内求解Berlin52算例。推测是因为cutset和subtour elimination在消除子回路时需要穷举k个元素的所有子集S,运算量巨大,导致耗时呈指数形式增加。
五、小结
本文介绍了整数规划模型,介绍了一个比较经典的整数规划问题;并用整数规划模型解决对TSP问题进行了建模,介绍了三种消除TSP问题子回路的约束条件。最后通过Matlab对TSP问题进行了求解。
【囿于作者的学术水平,本文的诸多表述或许不够严谨,用途仅限于优化算法入门者的非正式学术交流,不足之处还望各位读者指正。】
相关资料:
Matlab代码实现
作者:宋博文 张雨沁
校对:任珈岳