运筹系列10:线性规划开源软件GLPK和PyMathProg
1. GLPK
GLPK全稱GNU Linear Programming Kit,是一個開源的求解線性規劃問題的工具套件,由c寫成,可以求解大規模線性規劃問題、混合整數規劃問題。GLPK是免費的,在大規模問題上的性能要遜色于商用軟件,求解的性能可以參考安裝文件doc目錄下的miplib2.txt,miplib3.txt和netlib.txt這三個文件,下面是截圖:
GLPK安裝非常簡單,在centos系統下,執行:
sudo yum install glpk
GLPK使用MathProg(mathematical programming language)建模語言,可以使用GLPSOL這個cmd應用來進行交互。作為示例,新建一個文件problem.mod,輸入:
var x1; var x2; maximize obj: 0.6 * x1 + 0.5 * x2; s.t. c1: x1 + 2 * x2 <= 1; s.t. c2: 3 * x1 + x2 <= 2; solve; display x1, x2; end;然后退出文件編輯,輸入glpsol -m p.mod,最后輸出了求解結果。
GLPSOL: GLPK LP/MIP Solver, v4.65 Parameter(s) specified in the command line:--math short.mod Reading model section from short.mod... 9 lines were read Generating obj... Generating c1... Generating c2... Model has been successfully generated GLPK Simplex Optimizer, v4.65 3 rows, 2 columns, 6 non-zeros Preprocessing... 2 rows, 2 columns, 4 non-zeros Scaling...A: min|aij| = 1.000e+00 max|aij| = 3.000e+00 ratio = 3.000e+00 Problem data seem to be well scaled Constructing initial basis... Size of triangular part is 2 * 0: obj = -0.000000000e+00 inf = 0.000e+00 (2) * 2: obj = 4.600000000e-01 inf = 0.000e+00 (0) OPTIMAL LP SOLUTION FOUND Time used: 0.0 secs Memory used: 0.1 Mb (102250 bytes) Display statement at line 8 x1.val = 0.6 x2.val = 0.2 Model has been successfully processed2. PyMathProg
python環境下可以使用PyMathProg進行建模并用GLPK求解。
pip install pymprog
下面是個簡單的例子:
from pymprog import * begin('bike production') x, y = var('x, y') # variables maximize(15 * x + 10 * y, 'profit') x <= 3 # mountain bike limit y <= 4 # racer production limit x + y <= 5 # metal finishing limit solve()下面是幾種定義變量的方式:
x,y = var('x','y') #默認變量是非負連續變量 z = var('z',3) #非負連續變量數組 a = var('a',kind=bool) #0/1變量。其他還有:float (默認): 連續變量;int: 整數變量;bool: 0/1變量 b = var('b',bounds = (0,5)) #限制上下界的連續變量 cindex = ('c1','c2','c3') c = var('c',cindex) #使用自定義index set來定義變量下面是關于index的一些示例:
A = (1, 2, 3) #interable的python類型(比如tuple,list,set……)都可以作為index。 B = (6, 7, 8) C = iprod(A, B) #可以用這種方式形成更大的index集合。 x = var('x',C) #使用index集合創建變量 x[2,7].name下面是關于parameter的一些示例:
k = par('k', [2,3,4]) #內容是list/tuple的話,那生成的就是一個parameter的list p = par('P', {'east':0, 'west':2, 'south':3, 'north':1}) #內容是dict的話,生成的是以dict的key為下標的list a, b, c = par('a,b,c', 3, (5,2)) #可以一次定義多個參數 r = [{(3,4):3, (1,2):4}, 5] R = par('R', r) #可以recusive定義參數 x = var('x', 3) x.value = 10 #可以重新定義參數值下面是關于contraint的一些示例:
x = var('x', 3) y = var('y') c = [6,4,3] sum(p*q for p,q in zip(c,x)) <= y #可以直接添加約束 st( sum(p*q for p,q in zip(c,x)) <= y ) #也可以用st表明這是一個約束目標函數定義很簡單:
maximize(sum(c[i]*x[i] for i in range(3)), 'Profit')可以調用的solver有四種,線性規劃有simplex、exact、interior三種(默認是simplex),整數規劃是intopt,可以顯式調用,例如:
solve(simplex) print(vobj()) #獲取目標函數值 print(x.primal) #獲取變量求解值下面是營養問題的綜合示例:
from pymprog import * minlev = group('minlev') fruits = ('apple', 'pear', 'orange') nutrit = ('fat', 'fibre', 'vitamin') ntrmin = ( 10, 50, 30 ) # min nutrition intake #nutrition ingredients of each fruit ingred = ('apple': (3,4,5), 'pear': (2,4,1),'orange': (2,3,4)) diet = var('diet', fruits, int) minimize(sum(diet[frt] for frt in fruits), 'mindiet') for n, ntr in enumerate(nutrit):minlev[ntr] = sum( diet[frt] * ingred[frt][n] for frt in fruits) >= ntrmin[n]點擊這里可以參考更多例子。
總結
以上是生活随笔為你收集整理的运筹系列10:线性规划开源软件GLPK和PyMathProg的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何软件项目电子投标
- 下一篇: 清风老师数学建模课程——第一讲层次分析法