日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

运筹系列10:线性规划开源软件GLPK和PyMathProg

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 运筹系列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 processed

2. 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。