干貨 | 10分鍾教你用column generation求解vehicle routing problems


OUTLINE

  • 前言
  • VRPTW description
  • column generation
  • Illustration
  • code
  • reference

00 前言

此前向大家介紹了列生成算法的詳細過程,以及下料問題的代碼。相信各位小伙伴對column generation已經有了一個透徹的了解了。今天我們在來一點干貨,用column generation求解vehicle routing problems。

01 VRPTW description

關於VRPTW問題的描述,以及建模方式,可以參照此文干貨|十分鍾快速掌握CPLEX求解VRPTW數學模型(附JAVA代碼及CPLEX安裝流程)。不過今天給大家帶來的是VRPTW的另外一個建模方式,它是在傳統的模型上利用了Dantzig-Wolfe decomposition分解算法得到的。

關於Dantzig-Wolfe decomposition分解算法,可以參照文章:

Formulation:[1]

  • $\Omega $ :the set of feasible vehicle routes, i.e., the set of paths in G issued from the
    depot, going to the depot, satisfying capacity and time window constraints and visiting
    at most once each customer.
  • \(c_k\) :the cost of route \(r_k \in \Omega\).
  • $ a_{ik}$ := 1 if route\(r_k\)visits customer\(v_i\) and = 0 otherwise.
  • $ b_{ijk}$ := 1 if route\(r_k\)uses arc\((v_i,v_j)\)and = 0 otherwise.

The VRPTW can be described with the following set covering model:

where \(θ_k\) indicates whether route \(r_k\) is selected (\(θ_k\) = 1) or not (\(θ_k\) = 0) in the solution.其中\(v_0\)是depot點。

其中:

  • 約束1保證了每個Customer都至少被服務一次。
  • 約束2限制了車輛的使用數量。
  • $\theta_k \(定義為整數,但顯然當\)\theta_k > 1$時解都不是最優的。這樣做的目的是為了后續使用column generation時獲得一個更好的線性松弛。

02 column generation

從上面的模型中,先來討論一個點,用\(S(\Omega)\)表示集合\(\Omega\)里面的路徑數量,n表示Customer的點數,那么
\(S(\Omega)\)和n的關系可以看下表:

\(S(\Omega)\) n
10 \((A_{10}^2+A_{10}^3+A_{10}^4+...+A_{10}^{10})/2\)
20 \((A_{20}^2+A_{20}^3+A_{20}^4+...+A_{20}^{20})/2\)
... ...
100 \((A_{100}^2+A_{100}^3+A_{100}^4+...+A_{100}^{100})/2\)

可以看出,變量\(\theta\)的數目隨着問題規模n的增長會爆炸式的增長。這時候,顯然branch and bound這類的算法已經無能為力了,因為變量數目太多太多,搜索樹會有多少個分支想都不敢想。

所以,我們上一節課講的column generation就派上用場辣。如果相關概念還不清楚的就趕緊回去翻一翻上一次課的內容吧。

2.1 Master Problem(MP)

我們知道,column generation是求解linear program的,因為上面的model是一個整數規划模型,還不能直接挪過來當Master Problem。

在此之前,我們需要將\(\theta_k \in N\)給線性松弛一下變成\(\theta_k >= 0\)。這下\(\theta_k\)就從整數變量松弛為線性變量了。由此我們可以得出問題的Master Problem如下:

2.2 Restricted Master Problem(RMP)

在上述模型中,約束5中的列直觀表現為一條可行的路徑\(r_k\),現在要Restricted一下我們的Master Problem,直接Restricted Master Problem中的 \(\Omega\)即可。我們設\(\Omega_1 \subset \Omega\),那么Restricted Master Problem可以表示為:

然后我們再順便把RMP的對偶model也寫出來,便於后續對偶變量的求解:

在對偶模型中:

  • \(\lambda_i\)是非負的對偶變量,對應着約束(9)。
  • \(\lambda_0\)是非負的對偶變量,對應着約束(10)。

2.3 Subproblem

子問題要做的就是找一條路\(r_k \in \Omega \setminus \Omega_1\)使得,

其中,\(r_k\)受到的約束:

  • 從depot出發,最終回到depot。
  • 滿足容量和時間窗的約束。

03 Illustration

在這一節我們將會給大家帶來一個簡單的VRPTW實例,詳細演示一下column generation求解VRPTW的過程。大家可以再次熟悉一下column generation的原理。

假如我們有以下的一個very simple的VRPTW問題:

其中:

  • 邊上數字表示路徑的距離。
  • 點上的區間表示時間窗。
  • 為了更加簡化問題,我們假設車的容量足夠大(總是能容量約束),車的數量足夠多(總是能滿足數量約束)。

Start

一開始我們很容易找到一個初始的路徑集合$\Omega_1 = {(v_0,v_1,v_0),(v_0,v_2,v_0),(v_0,v_3,v_0) } $。
服務所有的Customer。所以得到的Restricted Master Problem和Dual programs如下:

Iteration 1

RMP ( $\Omega_1 = {(v_0,v_1,v_0),(v_0,v_2,v_0),(v_0,v_3,v_0) } $ ):

很容易求得上述模型的最優解為\(\theta = (1,1,1), \lambda = (2,2.8,2)\)

現在假如subproblem通過啟發式或者什么方法找到了一條路徑$ r_4 = (v_0,v_1,v_2,v_0)\(,路徑\)r_4\(的reduce cost 為3.4-2-2.8 = -1.4 < 0。現在將\)r_4\(加入到\)\Omega_1 $中,開始下一輪迭代。

Iteration 2

RMP ( $\Omega_1 = {(v_0,v_1,v_0),(v_0,v_2,v_0),(v_0,v_3,v_0), (v_0,v_1,v_2,v_0)} $ ):

Again,很容易求得上述模型的最優解為\(\theta = (0,0,1,1), \lambda = (2,1.4,2)\)

subproblem找到了一條路徑$ r_5 = (v_0,v_1,v_2,v_3,v_0)\(,路徑\)r_5\(的reduce cost 為4-2-1.4-2 = -1.4 < 0。現在將\)r_5\(加入到\)\Omega_1 $中,開始下一輪迭代。

Iteration 3

RMP( $\Omega_1 = {(v_0,v_1,v_0),(v_0,v_2,v_0),(v_0,v_3,v_0), (v_0,v_1,v_2,v_0),(v_0,v_1,v_2,v_3,v_0)} $ ):

求解得到最優解為\(\theta = (0,0,0,0,1), \lambda = (2,1.4,0.6)\)

現在我們可以easily發現,還剩下兩條route不在\(\Omega_1\)之中了。而這兩條route的reduce cost都非負,列生成算法停止。並且在這個例子中,linear relaxation的解是integer optimal solution。

至此,列生成算法求解VRPTW的過程結束,相信這么詳細的過程大家已經看懂了。

04 code

關於列生成算法求解VRPTW的算法將會在下一期呈現,大家可以先把這兩期的內容好好消化了先。請關注我們的公眾號以獲取最新的消息,在第一時間獲取代碼:

可以關注我們的公眾號哦!獲取更多精彩消息!

05 reference

-[1]A tutorial on column generation and branch-and-price for vehicle routing problems, Dominique Feillet


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM