运筹系列65:TSP问题的精确求解法概述

1. 问题概述

tsp问题的数学模型如下:
在这里插入图片描述

1.1 给定upbound的Christofides方法

这是可以给出上界的一个方法,可以证明构造出的路线不超过最优路线的1.5倍。步骤为:
1)构造MST(最小生成树)
2)将里面的奇点连接起来构成欧拉回路称为完美匹配。Edmonds给出了多项式时间内构造最小代价完美匹配的方法,其长度不超过最优解的1.5倍。
在这里插入图片描述
证明方法也很直观,奇点最短路径可以拆分成两条完美匹配,其中总有一条的长度 ≤ \le 最优奇点路径长度/2 ≤ \le 最优完整路径长度/2
在这里插入图片描述

3)按欧拉回路顺序逐个扫描点,跳过重复经过的点,即可构造一条完整的路径。
在这里插入图片描述

下面是blossom算法的使用示例:

using BlossomV,TravelingSalesmanHeuristics,TSPLIB,Distances,DataStructures
tsp = readTSP("vlsi/bcl380.tsp"); # bays29
N = tsp.dimension
distmat = [euclidean(tsp.nodes[i,:],tsp.nodes[j,:]) for i in 1:N, j in 1:N]
mst = TravelingSalesmanHeuristics.minspantree(distmat)[1]
x = counter(cat([m[1] for m in mst],[m[2] for m in mst],dims=1))
odds = []
for xi in x
    if xi[2]%2==1
        append!(odds,xi[1])
    end
end
mat = Matching(Float64, length(odds))
for i in 1:length(odds)
    for j in 1:i-1
        add_edge(mat,i-1,j-1,distmat[odds[i],odds[j]])
    end
end
solve(mat)

using PyPlot
tree = mst
PyPlot.scatter(tsp.nodes[:,1],tsp.nodes[:,2],color="black",s=10)
for i in 1:length(tree)
    l = tsp.nodes[[tree[i][1],tree[i][2]],:]
    PyPlot.plot(l[:,1], l[:,2], color="black",linewidth = 1)
end
for i in 1:length(odds)
    j = get_match(mat,i-1)+1
    if j>i
        l = tsp.nodes[[odds[i],odds[j]],:]
        PyPlot.plot(l[:,1],l[:,2],color="r",linewidth = 0.5,linestyle="--")
    end
end

在这里插入图片描述

1.2. 给定lowerbound的松弛问题

首先看一个例子:
在这里插入图片描述
我们定义 x i j x_{ij} xij为边ij是否在路径上。根据TSP问题的要求,每个点只能路过一次,因此每个点连着两条边,有:
在这里插入图片描述

2. lazy constraint介绍

2.1 子回路约束

如下图,上面的模型无法避免subtour
在这里插入图片描述

为了消除两个子路径的情形,再增添约束条件:
在这里插入图片描述
要想完全枚举出所有这样的约束条件很难,在城市数目为10时,不等式数目就达到51043900866个。因此我们常采用行生成(也叫割平面)的方法,从松弛问题开始,每次求解完后,若发现有子路径,则不断增添拆散子路径的约束条件即可。示意如下,其中红色表示0.5,黑色表示1:
在这里插入图片描述
在这里插入图片描述

也可以使用最大流最小割来确定subtour
在这里插入图片描述
如上图,我们随意选定两个点,得到它们之间的最大流,这个值等于最小割。因此,我们计算n-1个最大流,如果得到小于2的值,那么找到对应的最小割加入约束集。

2.2 梳子约束

接下来,为了取整,我们再添加4集合约束:
在这里插入图片描述
在这里插入图片描述
后面逐步增加个数,称为梳子不等式,每条回路穿过边界的数目至少是3k+1次,其中k是梳齿的数目。
在这里插入图片描述

实战中可以使用启发式方法,如下图,对每个红色子图构造梳子约束:
在这里插入图片描述

生成梳子的研究可以参考:

Sylvia Boyd/Sally Cockburn/ Danielle Vella
Daniel Espinoza/Marcos Goycoolea

2.3 blossom不等式

可以看作subtour约束的加强版。选取顶点数目为奇数的簇,完美匹配中至少有一条边穿过簇的边界(相对应的,subtour约束的右边是2)。

3. 获取整数解

3.1 polyhedral combinatorics

我们以一个42城市为例,使用LP和subtour约束,得到结果如下:
在这里插入图片描述
虚线部分表示数值为0.5,其他部分数值为1,其中long path是城市30-42。

添加如下两个约束:
在这里插入图片描述
可以获得最终的整数解。
上面这种添加约束的方法,称为polyhedral combinatorics,即寻找所有整数解满足但是LP最优解不满足的约束。
当添加约束的方法对lb的改善低于一定阈值时,我们开始使用branch-and-bound方法来求解问题。

3.2 分枝定界法

分枝定界法是指将问题拆分成多个子问题来求解的一种方法。
如果只用subtour约束,我们可以结合分枝定界算法来处理整数约束条件:
在这里插入图片描述
在这里插入图片描述

分枝定界的关键是如何快速确定下界,否则膨胀速度会非常快。因此将其与分割法结合起来,得到新的分枝切割法。

4. 寻找cuts

这一节的目的是使用hierarchy decomposition的方法找到合适的cuts。

4.1 Tight sets和PQ树

tight set指的是满足 x ( S , V − S ) = 2 x(S,V-S)=2 x(S,VS)=2 S S S
我们首先选择一个城市exterior,然后定义 W = V − e x t e r i o r W=V-{exterior} W=Vexterior
定义T为一颗PQ树,D(u)为u的所有叶子节点,B(T)为所有D(u)的集合。如果B(T)的所有元素都是tight set,那么我们称T和x相容。
例如下面的这棵PQ树就和3.1节的x相容(选择exterior为42)
在这里插入图片描述

4.2 使用shrinking寻找subtour constraints

shrinking指的是将集合 S S S替换为点 σ \sigma σ,相对应的,边集合做如下替换:
在这里插入图片描述
如果x满足subtour constraints,那么x相容的PQ树的所有u节点构成的x[u]也满足subtour constraints。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值