1. 程式人生 > >python玄學建模(1):線性規劃

python玄學建模(1):線性規劃

重要 success 等於 ive scipy 順序 sub ref 示例

本文是對官方文檔中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*x1 <= 6;

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):線性規劃