旅行商问题(TSP)建模方法
旅行商问题是著名的NP-hard问题,具体描述如下:给定一个有向图 G = ( V , E ) G=(V,E) G=(V,E),其中V是总数为N的节点集合 ∣ V ∣ = N |V|=N ∣V∣=N,E是边的集合,TSP的目标是找到一条从某个起点出发,一次不重复地经过所有其他节点,最终返回起点的最短路。
TSP问题建模需要考虑因素包括:
- 决策变量:边(i, j)在最优解中是否被选中
- 目标函数:最小化总成本
- 约束1:每个点被到达且仅被到达一次
- 约束2:每个点离开且只被离开一次
初步模型如下:
min
∑
i
∑
j
c
i
j
x
i
j
∑
i
∈
V
x
i
j
=
1
∑
j
∈
V
x
i
j
=
1
x
i
j
∈
{
0
,
1
}
\small \min \sum_i{\sum_j{\begin{array}{c} c_{ij}x_{ij}\\ \end{array}}} \\ \sum_{i\in V}{\begin{array}{c} x_{ij}=1\\ \end{array}} \\ \sum_{j\in V}{x_{ij}=1} \\ x_{ij}\in \left\{ 0,1 \right\}
mini∑j∑cijxiji∈V∑xij=1j∈V∑xij=1xij∈{0,1}
由于该模型的不完备,容易导致子环路的出现。子环路是指没有包含所有节点V的一条闭环。一般采用 subtour-elimination 或 Miller-Tucker-Zemlin (MTZ) 方法消除上述模型会出现的子环路
消除子环路:Subtour-Elimination
子环路出现意味着出现了包含点个数为
S
,
(
S
<
∣
V
∣
=
N
)
S,(S<|V|=N)
S,(S<∣V∣=N) 的子环。因此我们可以朴素地认为,只要加入子环路删除约束,依次删除所有少于N的子环即可。
∑
i
,
j
∈
S
x
i
j
≤
∣
S
∣
−
1
2
≤
∣
S
∣
≤
n
−
1
,
S
⊂
V
\small \sum_{i,j\in S}{x_{ij}\le |S|-1} \qquad 2\le|S|\le n-1,\; S\subset V
i,j∈S∑xij≤∣S∣−12≤∣S∣≤n−1,S⊂V
上述约束的数量级至多为 2 N 2^N 2N,略显繁杂,一般通过求解器callback函数,以惰性更新的方式添加约束。
消除子环路:Miller-Tucker-Zemlin (MTZ)
通过引入辅助决策变量 μ i ∀ i ∈ V , μ i ≥ 0 \mu_i \; \forall i \in V, \mu_i \ge 0 μi∀i∈V,μi≥0,对于每条边 ( i , j ) ∈ E (i,j) \in E (i,j)∈E,构造 MTZ 约束。
μ i − μ j + M x i j ≤ M − 1 , ∀ i , j ∈ V , i , j ≠ 0 , i ≠ j \small \mu_i-\mu_j+Mx_{ij} \le M-1, \quad \forall i,j \in V, \; i,j\ne 0, i\ne j μi−μj+Mxij≤M−1,∀i,j∈V,i,j=0,i=j
M是一个足够大的正数,理论上应当为
μ
i
−
μ
j
+
1
\mu_i -\mu_j+1
μi−μj+1 的一个上界即可。在建模时,需要进行一些处理防止某些不可行的情况出现。一是要将起点复制一份,标记为终点,从而满足起点与终点的重合。二是要当
i
≠
j
i\ne j
i=j 时才加入约束。因此上述MTZ约束改进为:
μ
i
−
μ
j
+
N
x
i
j
≤
N
−
1
∀
i
∈
{
1
,
.
.
.
,
N
}
,
j
∈
{
2
,
.
.
.
N
+
1
}
,
i
≠
j
\small \mu_i -\mu_j+Nx_{ij} \le N-1 \quad \forall i \in \{1,...,N\},\; j \in \{2, ... N+1\},\; i \ne j
μi−μj+Nxij≤N−1∀i∈{1,...,N},j∈{2,...N+1},i=j