OUTLINE
- 前言
- 預備知識預警
- 什么是column generation
- 相關(guān)概念科普
- Cutting Stock Problem
- CG求解Cutting Stock Problem
- 列生成代碼
- reference
00 前言
這幾天勤奮的小編一直在精確算法的快樂學習之中不能自拔。到列生成算法這一塊,看了好幾天總算把這塊硬骨頭給啃下來了。然后發(fā)現(xiàn)網(wǎng)上關(guān)于列生成的教學資料也不是很多,大部分講的不是那么通俗易懂。所以今天就打算寫一寫這個算法,盡可能寫得通俗易懂。
01 預備知識預警
由于列生成算法涉及的知識點非常多,所以在開始之前希望讀者必須要具備以下的基礎(chǔ)知識,不然就沒法往下玩了:
- 線性規(guī)劃以及線性規(guī)劃對偶問題
- 單純形法原理
- 原問題的影子價格(shadow price)以及對偶變量
- 單純形法非基變量進基時非基變量檢驗數(shù)(reduce cost)的計算
以上內(nèi)容我就不展開科普了。如果對這些概念還有不熟悉的小伙伴,一定要回去搞清楚再往下看哦。
Cutting Stock Problem[1]
講column generation怎么可能少得了Cutting Stock Problem這個經(jīng)典的問題呢!在開始之前我們將以這個問題為鋪墊一步一步往下講解。
我們有以下問題,原紙卷每個長為L=17m,顧客們分別需要25個3m長,20個5m長,18個7m長的紙卷。那么需要怎樣切割才能使得浪費最小呢?
建模
Column Generation Formulation:
對于一卷紙,可以有很多種切割方案。
-
表示第j種方案里類別i的個數(shù)。
-
表示第 j 種方案的選擇個數(shù)。
于是,我們得到如下模型:
從上面的模型中,所有可行的裁剪方案的總數(shù)為n,我們并不知道這個值是多少,也不需要知道,只需要知道它很大。并且,隨著一卷紙長度的不斷增加,n是爆炸式增長的。
總之,可行的裁剪方案非常多,在上面的模型中我們無法顯式地把所有裁剪方案給表現(xiàn)出來。
02 什么是column generation?
2.1 相關(guān)背景
Column generation 是一種用于求解大規(guī)模線性優(yōu)化問題的非常高效的算法。[3]其理論基礎(chǔ)是由Danzig等于1960年提出。本質(zhì)上而言,列生成算法就是單純形法的一種形式,是用來求解線性規(guī)劃問題的。列生成算法已被應(yīng)用于求解如下著名的NP-hard優(yōu)化問題:機組人員調(diào)度問題(Crew Assignment Problem)、切割問題(Cutting Stock Problem)、車輛路徑問題(Vehicle Routing Problem)、單資源工廠選址問題(The single facility location problem )等。
2.2 larger linear programs
在某些線性優(yōu)化問題的模型中,約束的數(shù)目有限,但是變量的數(shù)目隨著問題規(guī)模的增長會爆炸式的增長,因此不能把所有的變量都顯性的在模型中表達出來。
比如剛剛介紹的Cutting Stock Problem的模型。隨著一卷紙長度的不斷增加,行的裁剪方案數(shù)量是爆炸式增長的。并且,可行的裁剪方案非常多,在模型中無法顯式地把所有裁剪方案給表現(xiàn)出來。
2.3 column generation
單純型法雖然能保證在數(shù)次迭代后找到最優(yōu)解,但像Cutting Stock Problem這一類的問題,由于變量太多根本無法把所有的變量都顯性的在模型中表達出來。所以單純形法在這里就無能為力了。
再有,在用單純形法求解這類線性規(guī)劃問題時,基變量(basic variable)只與約束的個數(shù)相關(guān),每次迭代只會有一個新的非基變量(non-basic variable)進基,因此,在整個求解過程中其實只有很少一部分變量會被涉及到。
因此,有人基于單純型法提出了列生成算法。其思路大概如下:[1]
先把原問題P_0給restrict到一個規(guī)模更小(即變量數(shù)比原問題少的)的P_1,在P_1上用單純型法求最優(yōu)解,但是此時求得的最優(yōu)解只是P_1上的,并不是P_0 的最優(yōu)解。
此時,就需要通過一個subproblem去check在那些未被考慮的變量中是否有使得reduced cost小于零的?如果有,那么就把這個變量的相關(guān)系數(shù)列加入到P_1的系數(shù)矩陣中,回到第1步。
經(jīng)過反復的迭代,直到subproblem中的reduced cost rate大于等于零,那么原問題P_0就求到了最優(yōu)解。
看算法流程圖會更加直觀哦:[2]
03 相關(guān)概念科普
剛剛講的內(nèi)容涉及到了幾個概念,master problem,linear master problem(LMP),restricted linear master problem,subproblem等,這一節(jié)來把這幾個概念給講清楚。還是基于上面的Cutting Stock Problem的模型:
3.1 master problem(MP)
對于一般問題而言,如果要用列生成求解,一般需要重新建模成set covering model。也就是和上面的Cutting Stock Problem類似形式的模型。重新建模成set covering model以后的問題就是master problem了。在Cutting Stock Problem中由于一開始就是建成這種形式,所以其Master Problem就是原模型:
3.2 linear master problem(LMP)
Column generation 是一種用于求解大規(guī)模線性優(yōu)化問題的。而上面的模型中,決策變量是整數(shù),因此要用列生成算法的話,要把整數(shù)變量給線性松弛了。得到linear master problem:
3.2 restricted linear master problem(RLMP)
把LMP給restrict到一個規(guī)模更小(即變量數(shù)比原問題少的)的就是restricted linear master problem了。比如可以用啟發(fā)式算法,在上面的linear master problem找出滿足條件(也就是形成的restricted linear master problem必須要有能滿足LMP所有約束的可行解)的k個列,得到如下的restricted linear master problem:
可以看到,相比原來的linear master problem,restricted linear master problem相當于把強制限制為非基變量了。[4]
3.3 subproblem
核能預警,如果這部分看不懂,請確保預備知識過關(guān)。如果預備知識不過關(guān),請在運籌學老師的陪同下觀看,謝謝合作!
上面的限制主問題求解完成后,我們想使用單純型法進行基變量的轉(zhuǎn)換,看看中,是否有可以轉(zhuǎn)入基變量的列。還記得怎么找進基的非基變量嗎?(不記得就去問你們的運籌學老師)。當然是通過非基變量的檢驗數(shù)辣,通過
,在
中尋找檢驗數(shù)最小并且為負數(shù)的變量,將變量對應(yīng)的那一列添加到RMP中。
那么,在檢驗數(shù)的計算公式中,大家還記得是什么嗎?
有兩重含義:
- 通過求解RLMP問題得到的影子價格(shadow price)。
- 通過求解RLMP對偶問題得到的對偶變量(dual variable)。
所以在開始之前小編一直強調(diào)預備知識一定要過關(guān)。這兩個含義意味著我們有上面兩種方式得到,不過我們一般傾向于使用第二種,WHY?
雖然通過單純型法直接求解restricted linear master problem能得到
所以我們總結(jié)一下:
通過求解RLMP問題或者RLMP對偶問題,得到我們想要的以后,subproblem就是通過
這條公式,在
中尋找檢驗數(shù)為負并且最小的變量,將變量對應(yīng)的那一列添加到RLMP中。
3.4 算法流程圖
通過上面講了這么多以后,這里在給出一個更詳細的流程圖:[5]
04 CG求解Cutting Stock Problem
通過上面的問題分析和建模以后,我們這一步一步一步來求解該問題,讓大家徹底理解column generation這個過程。該過程模擬需要用到一個線性求解器,大家還記得小編以前講過的lpsolve的教程嗎?趕緊去翻一下以前的教程,把lpsolveIDE裝上,然后跟著小編的腳步一步一步往下走。
4.1 restricted linear master problem(RLMP)
前面我們完成了問題的建模,得到了Cutting Stock Problem的linear Master Problem。現(xiàn)在,我們可以用啟發(fā)式算法找到一個滿足客戶需要的初始解:
首先,一個卷筒有三種切割方案:
方案1:切成5個3m
方案2:切成2個6m
方案3:切成2個7m
很容易得出,5個方案1、10個方案2、8個方案3,是能滿足所有客戶需求的。即得LMP的一個RLMP如下:
其中,
這三列分別對應(yīng)著方案1、方案2、方案3。還有一點需要注意的,對于每一列,都需要滿足:
,也就是每一卷紙只有16的長度,不能超出這個長度。這個叫列生成規(guī)則,不同問題有不同的規(guī)則約束。subproblem在尋找某些列或者生成某些列時,就是受到列生成規(guī)則的約束的。
4.2 開始列生成過程
iteration 1
RLMP:
將該模型輸入lpsolve,得到對偶變量如下:
得到。現(xiàn)在要找一列加入RMP,是哪一列呢?現(xiàn)在還不知道,我們暫記為
。非基變量檢驗數(shù)
。
subproblem:
求解結(jié)果得,reduced cost 為負數(shù),因此將
加入RLMP,開始第二輪迭代。
iteration 2
RLMP:
將該模型輸入lpsolve,得到對偶變量如下:
得到。現(xiàn)在要找一列加入RLMP,是哪一列呢?現(xiàn)在還不知道,我們暫記為
。非基變量檢驗數(shù)
。
subproblem:
求解結(jié)果得,reduced cost 為負數(shù),因此將
加入RLMP,開始第三輪迭代。
iteration 3
RMP:
將該模型輸入lpsolve,得到對偶變量如下:
得到。現(xiàn)在要找一列加入RLMP,是哪一列呢?現(xiàn)在還不知道,我們暫記為
。非基變量檢驗數(shù)
。
subproblem:
求解結(jié)果得,reduced cost 不為負數(shù),因此不用將
加入RLMP,列生成算法結(jié)束。
最終,我們求解最后一次迭代的RLMP:
得到RLMP的最優(yōu)解,這里因為把MP的整數(shù)決策變量給線性松弛了,求解的是MP問題的一個lower bound。畢竟列生成是用于求解linear program的。如果要求解大規(guī)模整數(shù)規(guī)劃問題,后面我們會介紹結(jié)合column generation的branch and price方法。
至此,我們已經(jīng)完完整整把列生成算法給走了一遍。相信列生成算法的原理已經(jīng)深入各位讀者的心里啦。
05 列生成代碼
獲取方式