1. 程式人生 > 其它 >旅行商問題的兩種經典求解方法

旅行商問題的兩種經典求解方法

背景

旅行商問題(Travelling salesman problem, TSP)是一個典型的整數規劃問題,給定一系列點集\(V(|V|=n)\),在點集中從一點出發,尋找一條最短路徑,該路徑經過點集中的所有點,並且每個點只經過一次。

對於該問題我們可以進行初步建模:

\[\begin{aligned} \min & \sum_{i} \sum_{j} c_{i j} x_{i j} & \\ &\sum_{i \in V} x_{i j}=1, & \forall j \in V, i \neq j \\ &\sum_{j \in V} x_{i j}=1, & \forall i \in V, i \neq j \\ & x_{i j} \in\{0,1\}, & \forall i, j \in V \end{aligned} \]

式中\(x_{i,j}\)

表示從節點\(i\)到節點\(j\)的路徑,\(c_{i,j}\)表示路徑\(i \rightarrow j\)的長度;第一個約束保證一個節點只出發一次,第二個約束保證一個節點值到達一次。但是上述的兩個約束並不能解決TSP問題,可能出現如下情況:

如上圖,對於一個有6個節點的點集,(1)有子迴路(2)無子迴路均可以滿足上式的約束條件,但很明顯(1)有子迴路不是TSP問題的解。

對於TSP問題,重點研究的表示如何消除子迴路。下面介紹兩種消除子迴路的TSP問題求解方法。

Dantzig–Fulkerson–Johnson formulation

該方法由Dantzig,Fulkerson 和Johnson提出,模型如下:

\[\begin{aligned} \min &\sum_{i} \sum_{j} c_{i j} x_{i j} \\ & \sum_{i \in V} x_{i j}=1, &\forall j \in V, i \neq j \\ &\sum_{j \in V} x_{i j}=1, & \forall i \in V, i \neq j \\ &\sum_{i, j \in S} x_{i j} \leqslant|S|-1, & 2 \leqslant|S| \leqslant N-1, S \subset V \\ &x_{i j} \in\{0,1\}, & \forall i, j \in V \end{aligned} \]

式中\(N=|V|\)

表示點集\(Z\)中點的個數。

將該模型的第三個消除子迴路的約束單獨提出來:

\[\sum_{i, j \in S} x_{i j} \leqslant|S|-1, 2 \leqslant|S| \leqslant N-1, S \subset V \]

式中\(S\)\(V\)的一個真子集,這個式子的含義是:對於一個\(V\)中的任意真子集\(S\)\(S\)中連通的節點邊數小於節點個數。

如上圖,對於一個有子迴路的點集,其中的子集如\(S\{5,6,7\}=5 \rightarrow 6 \rightarrow 7 \rightarrow 5\)\(\sum_{i, j \in S} x_{i j}=3\nleqslant |S|-1\),怒,不滿足第三個約束。

Miller–Tucker–Zemlin formulation

該方法由Miller,Tucker和Zemlin,模型如下:

\[\begin{aligned} \min &\sum_{i} \sum_{j} c_{i j} x_{i j} & \\ &\sum_{i \in V} x_{i j}=1, & \forall j \in V, i \neq j \\ &\sum_{j \in V} x_{i j}=1, & \forall i \in V, i \neq j \\ &\mu_{i}-\mu_{j}+N x_{i j} \leqslant N-1, & \forall i, j \in V,2 \leq i \neq j \leq N\\ &x_{i j} \in\{0,1\}, \mu_{i} \geqslant 0, \mu_{i} \in \mathbf{R}^{1} & \forall i \in V \end{aligned} \]

MTZ計算公式通過引入人工變數\(\mu\)來消除子迴路,單獨提出第三個約束:

\[\mu_{i}-\mu_{j}+N x_{i j} \leqslant N-1, \forall i, j \in V,2 \leq i \neq j \leq N \]

\(\mu_i\)的值表示迴路中節點\(i\)的次序,對於非連通的兩個節點\(i\)\(j\),上式可以變換為:

\[\mu_i -\mu_j \leq N-1 \]

該式顯然恆成立。

對於連通的兩個節點\(i \rightarrow j\),上式可以變換為:

\[\mu_i \leq \mu_j-1 \]

如上圖中的子集\(S\{5,6,7\}=5 \rightarrow 6 \rightarrow 7 \rightarrow 5\)\(\mu_5=1,\mu_6=2,\mu_7=3,\mu_5=4\),顯然不滿足第三個約束。