python玄學建模(1):線性規劃
本文是對官方文檔中scipy.optimize.linprog的簡單翻譯和解釋。(第一次寫博客,也不太會用博客園的編輯器,可能措辭和排版有不合適之處,請見諒)
文檔鏈接:https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.optimize.linprog.html
線性規劃的定義及解法就不過多介紹了,(畢竟教程多的是),
文檔中對linprog的描述是‘Minimize a linear objective function subject to linear equality and inequality constraints.’,解決的正是一般的線性規劃問題。
函數原型:scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method=‘simplex‘, callback=None, options=None)
其中比較重要的參數有c,A_ub,b_ub,A_eq,b_eq,bounds這幾個
c是一個數組,按順序排列目標函數的參數,比如目標函數是2x0-4x1,輸入的c就是[2,-4]。
A_ub與b_ub,A_eq與b_eq是兩對參數,前一對是不等式約束(小於等於),後一對是等式約束,使用方法其實是一樣的。例如,有約束條件
-3*x0
1*x0 + 2*x1 <= 4
(這裏用的是文檔中的例子)
那麽A_ub就是[[-3,1],[1,2]],b_ub是[6,4]。註意A_ub是二維的數組,第0維(行)的每一個數組就是每個約束條件裏x的系數。
如果是等式約束的話,只要換用另一對參數就可以了,不需要做其他改動
bounds就是字面意思了,也就是每一個x的取值範圍,一一對應,無窮要用None來表示,比如x0大於3,就應該寫成(3,None)。
順便提一下method,看上去是可選項,其實只有一個simplex可用......
知道這些就可以求解線性規劃問題了
引用文檔中的示例代碼:
c = [-1, 4] A= [[-3, 1], [1, 2]] b = [6, 4] x0_bounds = (None, None) x1_bounds = (-3, None) res = linprog(c, A_ub=A, b_ub=b, bounds=(x0_bounds, x1_bounds), options={"disp": True}) print(res)
目標函數f = -1*x0 + 4*x1
約束條件為
-3*x0 + 1*x1 <= 6
1*x0 + 2*x1 <= 4
x1>=3
print會輸出一下內容:
Optimization terminated successfully. Current function value: -11.428571 Iterations: 2 status: 0 success: True fun: -11.428571428571429 x: array([-1.14285714, 2.57142857]) message: ‘Optimization terminated successfully.‘ nit: 2
status就是執行情況,0代表成功結束,1代表到達最大叠代次數,2代表問題不可行,3代表問題由於無邊界而不可解(例如最優解可以取到無窮大);
fun和x就是最優解和對應的x的取值;
nit是叠代次數。
(其他好像也沒什麽了)
python玄學建模(1):線性規劃