運輸問題的+Leapms模型
運輸問題是本科教課書中的一個經典章節。運輸問題的線性規划模型非常簡單,而且求解難度極小。
問題
一個公司生產並銷售一種產品。該公司有m個產地、n個銷地。產地 i 的供給量不大於p[i],銷地 j 的需求量不小於d[i],從 i 到 j 的運輸費用為 c[i][j]。要求規划產地到銷地之間的調運量,使得調用總費用最小。
數據
以下是教課書[1,2]中的一個運輸問題的數據表:
+Leapms模型語言常識
1、sub-index: 在大多數計算機語言中,如c語言、python語言中,用[ ]表示腳標, [ ] 被讀作 sub-index (腳標)。例如x[i][j] 就相當於$x_{ij}$, 被讀成 x sub-index i,j 。+Leapms建模語言也不例外。
2、of: 在大多數計算機語言中, () 一般有兩個用途—— (1) 表示算式的優先等級、(2)表示函數,例如sin(a);當 ( )表示函數時,讀做of, 例如sina(a)讀做 sine of a。+Leapms使用這種習慣。
3、花括號{ } : +Leapms中的花括號有兩個用法,(1)表示數據區里的數據集合、(2)表示累加或累乘中局部變量的變化范圍。 例如 $\sum_{i=1}^m\sum_{i=1}^nx_{ij}c_{ij}$在+Leapm中就被寫成 sum{i=1,...,m; j=1,...,n} x[i][j]c[i][j]。
4、注釋:+Leapms的注釋符號是//,從//開始到行結束都被當作注釋忽略
運輸問題的建模
設x[i][j]為從產地 i 到銷地 j 的調運量,則調運總費用是 sum{i=1,...,m;j=1,...,n} x[i][j]c[i][j],於是模型的目標為
minimize sum{i=1,..,m;j=1,..,n}c[i][j]x[i][j] //(1)
產量約束
sum{j=1,...,n}x[i][j] <= s[i] | i=1,...,m //(2)
銷量約束
sum{i=1,...,m}x[i][j] >= d[j] | j=1,...,n //(3)
於是運輸問題模型的主要部分即:
minimize sum{i=1,..,m;j=1,..,n}c[i][j]x[i][j] //(1) subject to sum{j=1,...,n}x[i][j] <= s[i] | i=1,...,m //(2) sum{i=1,...,m}x[i][j] >= d[j] | j=1,...,n //(3)
+Leapms要求對所有出現在模型中的符號進行說明:
where m,n are integers c[i][j] is a number|i=1,...,m;j=1,...,n d,s are sets x[i][j] is a variable of nonnegative number|--> i=1,...,m;j=1,...,n
為了使得模型能夠被解析和求解,必須給出數據:
data m=3 n=4 c={ 8 6 10 9 9 12 13 7 14 9 16 5 } d={45 20 30 30} s={35 50 40}
模型的解析和求解
+Leapms模型使用純文本表達。
在+Leapms環境中用Load命令即可調入模型並對模型進行解析。解析完畢后會報告模型的變量數和約束數。
然后使用solve命令求解。(如果有整形或者0-1變量,則需使用mip命令求解,否則只進行松弛求解)。
cplex命令或gurobi命令可以調用cplex或gurobi軟件對模型進行求解。
+Leapms>load Current directory is "ROOT". ......... transportation.leap ......... please input the filename:transportation ================================================================ 1: minimize sum{i=1,..,m;j=1,..,n}c[i][j]x[i][j] //(1) 2: subject to 3: sum{j=1,...,n}x[i][j] <= s[i] | i=1,...,m //(2) 4: sum{i=1,...,m}x[i][j] >= d[j] | j=1,...,n //(3) 5: where 6: m,n are integers 7: c[i][j] is a number|i=1,...,m;j=1,...,n 8: d,s are sets 9: x[i][j] is a variable of nonnegative number|--> 10: i=1,...,m;j=1,...,n 11: data 12: m=3 13: n=4 14: c={ 15: 8 6 10 9 16: 9 12 13 7 17: 14 9 16 5 18: } 19: d={45 20 30 30} 20: s={35 50 40} 21: ================================================================ >>end of the file. Parsing model: 1D 2R 3V 4O 5C 6S 7End. .................................. number of variables=12 number of constraints=7 .................................. +Leapms>solve The LP is solved to optimal. 找到線性規划最優解.非零變量值和最優目標值如下: ......... x1_2*=10 x1_3*=25 x2_1*=45 x2_3*=5 x3_2*=10 x3_4*=30 ......... Objective*=1020 ......... +Leapms>
上面的求解結果給出非零最優決策變量和最優目標值。該題最優目標值為1020。
上面的運輸模型求解難度很小,商用求解器可以在一個小時甚至更短時間內內求解到百萬級變量的問題。
LaTex 模型的自動生成
在+Leapms環境中使用命令“Latex” 會自動生成 LaTex文件(.tex),在安裝有LaTex環境的系統中雙擊此文件能夠自動生成數學形式的pdf模型。
\documentclass{article} \usepackage{amsmath}\begin{document} \section{LaTex code for Model ``Transportation.leap"} \rule[0pt]{5cm}{0.05em}\\ \begin{align} \min\quad \sum_{i=1}^{m}\sum_{j=1}^{n}c_{ij}x_{ij}\end{align} subject to \begin{align} &\sum_{j=1}^{n}x_{ij}\leq s_{i},\quad i=1,...,m\\ &\sum_{i=1}^{m}x_{ij}\geq d_{j},\quad j=1,...,n\\&x_{ij}\geq 0 , \quad i=1\ldots m; j=1\ldots n \end{align} \\\rule[0pt]{5cm}{0.05em}\\ The above formulations are generated by +Leapms from model file ``Transportation.leap" at 11:34:24 2018-12-27. \end{document}
由上面自動生成的LaTex代碼所進一步生成的pdf數學模型:
參考文獻
[1] Wayne L. Winston. Operations Research: Applications and Algorithms. Duxbury press, boston, 1997
[2] Wayne L. Winston. 運籌學(數學規划 第3版 影印版). 北京:清華大學出版社,2004