XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

運籌OR帷幄發表於2018-10-16

此文簡單介紹AROMA的1.0版本:XProg。希望可以幫做魯棒最佳化相關的同行們省去手動求對偶和Robust Counterpart,然後吭哧吭哧程式設計的麻煩。

本文將簡單介紹XProg(內容主要來自Xprog的使用者手冊)。Julia語言裡有為魯棒最佳化開發的JuMPeR。個人使用體驗是XProg更簡潔,功能更齊全:可以直接程式設計最新的分散式魯棒最佳化(DRO)的相關模型,而JuMPeR主要適用於傳統的魯棒最佳化模型,而且似乎現在處於無人維護的狀態。Julia入門科普請出門左轉到 @覃含章的覃含章:Julia:簡單易用的數值計算/最佳化程式語言

https://zhuanlan.zhihu.com/p/39253127

XProg由Dr. Peng Xiong開發,旨在用最簡單直觀的語言進行魯棒最佳化模型的求解。最新版本的AROMA由Prof. Melvyn Sim, Dr. Peng Xiong 和Dr. Zhi Chen開發。XProg只有Matlab版;AROMA將會增加Python版本。兩者都可透過呼叫Gurobi,Cplex, MOSEK等求解器進行求解。

XProg

先上一個多產品的分散式魯棒報童模型的求解,直觀感受一下。

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

其中,模糊集(ambiguity set)   XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言   為,  

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

求解程式如下:

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

對於裡面的extended模糊集和extended LDR的概念,請參考

Adaptive Distributionally Robust Optimization

pubsonline.informs.org

由上面的例子可以看出,XProg提供了一種照著原始模型編出來的簡潔高效程式設計方法。它已經把求對偶求robust counterpart等步驟全部內嵌到程式裡去了。這大大地減少了之前做RO或者DRO的問題的時候,往往得先手動求對偶,然後再用C, C++, Java,Matlab等求解的那份酸爽!

以下直接舉例來闡明XProg的用法,具體語法請參閱XProg包裡面的“使用者手冊”。以下所舉的例子大都在安裝包中的“examples”。

1、線性規劃 (Linear Programming)

對於任意的線性規劃:     

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

實現起來特別方便:

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

比如下面這個線性規劃:   

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

只需要在程式開始賦值:

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

解出來結果如下:

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

2、混合整數規劃(Mixed Integer Programming)

對於混合整數規劃,只需在定義變數時註明是二進位制變數(binary variable)還是整數變數就可:

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

3、隨機規劃

XProg 還可以對隨機規劃問題進行求解。不同場景下的決策可以用cell array實現,舉例如下(編者實在太懶。。。問題描述請參考使用者手冊第15頁):

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

求解程式如下:

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

求解結果如下:

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

4、經典魯棒最佳化模型求解

舉例多階段庫存最佳化模型(問題描述請參考使用者手冊22頁):

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

實現程式如下:

XPROG: 簡單實用的魯棒最佳化(RO, DRO)程式語言

5、分散式魯棒最佳化模型求解

詳見文首的例子。

鑑於XProg很快就要被功能強大N多的AROMA取代,本文特別精簡地介紹了XProg這個簡單實用的魯棒最佳化(RO, DRO)程式語言。AROMA進一步對XProg進行了精簡,但是功能卻更加強大了。等AROMA正式上線之後,再寫一篇詳細的入門介紹文章。

相關文章