運籌優化(十三)--大規模優化方法
針對因為算例的規模過大或者結果過於複雜而無法整體求解的數學模型,將原味分解成多個足夠簡單、可以單獨迭代直接求解的子問題,伴隨的主問題結合所有子問題的結果給出模型的精確或者近似精確的最優解,並將最優解相關的資訊傳遞給子問題用以更新模型中相應的引數。
列生成演算法
列生成演算法通常被應用於求解大規模整數規劃問題的分支定價演算法(branch-and-price algorithm)中,其理論基礎是由Danzig等於1960年提出。當求解一個最小化問題時,列生成演算法主要的作用是為每個搜尋樹節點找到一個較優的下界(lower bound)。本質上而言,列生成演算法就是單純形法的一種形式,是用來求解線性規劃問題的。列生成演算法已被應用於求解如下著名的NP-hard優化問題:機組人員排程問題(Crew Assignment Problem)、切割問題(Cutting Stock Problem)、車輛路徑問題(Vehicle Routing Problem)、單資源工廠選址問題(The single facility location problem )等。
列生成演算法的基本思想
在某些線性優化問題的模型中,約束的數目有限,但是變數的數目隨著問題規模的增長會爆炸式的增長,因此不能把所有的變數都顯性的在模型中表達出來。在用單純形法求解這類線性規劃問題時,基變數(basic variable)只與約束的個數相關,每次迭代只會有一個新的非基變數(non-basic variable)進基,因此,在整個求解過程中其實只有很少一部分變數會被涉及到。簡單來說,列生成演算法通過求解子問題(pricing problem),來找到可以進基的非基變數,該非基變數在模型中並沒有顯性的寫出來(可以看成是生成了一個變數,每個變數其實等價於一列,所以該方法被稱為列生成演算法)。如果找不到一個可以進基的非基變數,那麼就意味著所有的非基變數的檢驗數(reduced cost)都滿足最優解的條件,也就是說,該線性規劃的最優解已被找到,即使很多變數沒有在模型中寫出來。
拉格朗日鬆弛
拉格朗日鬆弛演算法並不是採用直接搜尋最優解的策略,而是希望通過對模型進行分解,計算模型最優目標函式值的較強的上下界。有時該分解演算法可以用於求解大規模離散模型的線性鬆弛問題,另外有時,利用拉格朗日鬆弛甚至可以得到比線性鬆弛更好的上下界。該演算法還可以提高分支界定或者分支割平面演算法的求解效率,還可以結合取整運算為原模型得到近似最優解。
對於一個給定的整數規劃問題,線性鬆弛是去掉模型中的整數約束,而拉格朗日鬆弛則是放鬆模型中的部分線性約束,保留整數約束和其他線性約束,這些被鬆弛的約束並不是完全去掉,而是在利用拉格朗日乘子在目標函式上增加相應的懲罰項,對不滿足這些約束條件的解進行較大的懲罰。
考慮到任何一個合理的鬆弛問題都應該使得到的問題更加容易處理,因此,拉格朗日鬆弛通過利用對偶乘子儘可能鬆弛線性約束的方法,使得到的子問題更容易求解。
Dantzig-Wolfe分解
該分解演算法不再是針對決策候選方案對應於完全資訊下的列情況,而是藉助拉格朗日鬆弛演算法,將大量的 複雜約束與一個或多個具有容易處理的特殊結構(如網路流)的線性約束分解開。
DW分解的問題對應的約束條件具有如下的結構:
第一行的約束Ay=b叫complicating/coupling constraints,後面的By=d可以看做是列生成的規則。
DW分解的思路是,將變數用極點/極線表示。開始的時候極點/極線對應的變數很少,然後根據子問題的求解結果不斷給主問題新增極點/極線。
3.1. 子問題
先給出Bx = b的一些極點和極線,比如說是 x1...xk ,帶入子問題求解:
min Σi(cN−πAj)xi
s.t. Bixi=bi
然後可以求得新的極點/極線 xk+1
3.2. 限制主問題
min cy c y
s.t. Ay=b(π)
y=Σux (這個約束可以用來消除模型中的 y )
Σu=1(t)
t 是問題的上界,如果最優值 cy∗=t ,那麼就取到了最優值,否則繼續求解子問題新增變數。
benders 分解演算法
Benders分解演算法是由Jacques F. Benders在1962年首先提出,目的是用於解決混合整數規劃問題(mixed integer programming problem,簡稱MIP問題),即連續變數與整數變數同時出現的極值問題[1]。但它的實際應用並不限於此,A.M. Geoffrion建立了廣義的Benders分解法,它可以對具有Benders分解基本形式的非線性問題求解,對子問題的求解方法也不必一定是線性的。Benders 分解法是一個很常用的方法,用來計算像整數非線性規劃問題和隨機規劃問題之類的難以解決的問題。
Jacques F. Benders設計了一個巧妙的途徑,來求解具有複雜變數的數學規劃問題。所謂的複雜變數是指,當將這些變數固定後,剩下的優化問題(通常稱為子問題)變得相對容易。在Benders考慮的一類特殊問題中,先把複雜變數的值固定,從而將問題規約為一個一般的線性規劃問題,當然,這個線性規劃問題是以複雜變數為引數的。在Benders設計的演算法裡,利用割平面的方式將主問題(以子問題的解為參變數)的極值和使子問題(線性規劃問題)有可行解的參變數值的集合很恰當地表達了出來。過程中,對偶理論用來推導刻畫這些表示式特徵的自然割平面族,而帶有參變數的線性規劃問題被用來生成割平面。
在1976年,Florian[2]將這個演算法應用於鐵路機車的排程問題。1976年,Richardso[3]把這個演算法應用於航空路線規劃,1974年 Geoffrion和Graves[4]成功地把這個演算法應用於設計工業分配系統。從1978年開始,Fisher和 Jaikumar[5]就在研究討論利用這個演算法的優勢來規劃機動車的路線。以上這些應用說明Benders分解演算法用來解決各種特定結構的混合整規劃問題有很大的優勢。
2.Benders分解演算法具體說明
給定一個線性優化問題:
其中x和y分別是p和q維向量,Y是y所在的可行域空間,A、B是矩陣,b、c、f表示適當的一維向量。
假設y是複雜變數,當y值固定時,原問題可以轉化為相對容易求解的問題,利用Benders方法可以將問題分解為兩部分:
其中q(y)表示當y值固定時子問題的最優解。
可以發現,子問題(3)是線性優化問題,如果子問題無界,那麼主問題(2)也必定無界,此時原問題(1)也無界,那麼原問題沒有最優解。我們假設子問題(3)有界,我們可以通過求解子問題(3)的對偶問題來計算q(y)。子問題的對偶問題可以寫成:
從對偶問題(4)中可以發現對偶問題的可行域不依賴於y的值,而y的值僅影響目標函式。因此,當我們給定y的值時,例如
,如果對偶問題的可行域為空,那麼原問題無界或可行域也為空(此時對所有的y原問題都為空)。假設式子(4)不為空,我們可以列舉對偶問題所有的極點(extreme points)
和極射線(extreme rays)
,其中I和J分別表示極點和射線的個數。對於一個給定的y的值,
,可以通過檢測:(a)對於所有的極射線式子
是否成立[6],(b)能否找到一個極點使對偶問題目標函式值
最大。如果(a)存在,則對偶問題無界且原問題無解,如果(b)成立,則對偶問題和原問題都有有限的最優解。
注:(a)的理論依據見參考文獻[2],178頁Theorem 4.14,具體理論如下:
對於一個最小化問題
,約束條件為
,假設可行域中至少存在一個極點。則最優解為-∞的條件為當且僅當存在某個極射線d使
。注意本文中用來舉例的子問題的對偶問題是最大化問題,參考文獻[2]中提及的是最小化問題。
基於上述理論,對偶問題可以重新寫成:
從(5)可以發現只有q一個變數,但是存在很多個約束。我們用(5)代替(2)中的q(y),則原問題可以寫成:
由於極射線和極點數量龐大,如果要生成所有的約束顯然不現實。Benders演算法求解的是鬆弛主問題(Relaxed master problem),即鬆弛主問題中的約束是原問題中約束(6b)和(6c)的一個子集。最開始,初始鬆弛主問題中無約束,在Benders演算法求解過程中不斷向鬆弛主問題中加入約束(6b)和(6c)中的某一個,即加入有效的切平面(cut)。通過求解鬆弛主問題,我們可以得到一個候選最優解(y*,q*),然後將y*代入對偶子問題(4)中求解計算q(y*)值,如果子問題的最優解q(y*)=q*,則演算法停止。如果對偶問題無解,則在鬆弛主問題中可以加入(6b)型別的約束,然後求解新的鬆弛主問題。(6b)型別的約束稱之為Benders feasibility cuts。如果對偶子問題的最優解q(y*)>q*,則在鬆弛主問題中可以引入(6c)型別的約束,然後求解新的鬆弛主問題。(6c)型別的約束稱之為Benders optimality cuts。在每次迭代過程中都可以生產某一型別的約束,由於I和J是有限的,故可以保證在有限次迭代過程後得到最優解。
相關文章
- 運籌優化(一)--運籌學概述優化
- 運籌優化(七)--動態規劃解析優化動態規劃
- 運籌優化(九)--整數規劃模型優化模型
- 運籌優化(十)--整數規劃求解優化
- 運籌優化(八)--圖與網路優化優化
- 運籌優化(五)--線性規劃之內點法優化
- 運籌優化(六)--目標規劃定義及解法優化
- 運籌優化(十一)--無約束非線性規劃優化
- 運籌優化(十七)--儲存論基礎及其最優化求解優化
- 運籌優化(十八)--對策論基礎及其最優化求解優化
- 運籌優化(十九)--決策論基礎及其最優化求解優化
- 運籌優化(十六)--排隊論基礎及其最優化求解優化
- 運籌優化(二)--線性規劃概念及應用模型優化模型
- 運籌優化(十二)--帶約束非線性規劃(NLP)優化
- 運籌優化(十四)--離散優化的啟發式演算法優化演算法
- 運籌優化(十五)--應用模型之分配問題優化模型
- 攀登規模化的高峰 - 螞蟻集團大規模 Sigma 叢集 ApiServer 優化實踐APIServer優化
- 運籌優化(四)--線性規劃之對偶問題和靈敏度分析優化
- Oracle優化案例-儲存過程的優化思路(二十三)Oracle優化儲存過程
- MySQL 優化三(優化規則)(高階篇)MySql優化
- Webpack之模組化優化Web優化
- 大規模服務網格效能優化 | Aeraki xDS 按需載入優化
- 大規格檔案的上傳優化優化
- MySQL 規範及優化MySql優化
- Web 效能優化方法Web優化
- 【NLP】常用優化方法優化
- MySQL 優化常用方法MySql優化
- 04 最優化方法優化
- Oracle優化的方法Oracle優化
- Spark(十三) Spark效能調優之RDD持久化Spark持久化
- Reids大key優化優化
- 前端效能優化(JS/CSS優化,SEO優化)前端優化JSCSS
- 斜率優化動態規劃優化動態規劃
- PB 級大規模 Elasticsearch 叢集運維與調優實踐Elasticsearch運維
- 優化Angularjs的$watch方法優化AngularJS
- SQL優化的方法論SQL優化
- 大規模圖訓練調優指南
- MySQL大表優化方案MySql優化