-
函數格式
-
scipy.optimize.
linprog
(
c,
A_ub=None,
b_ub=None,
A_eq=None,
b_eq=None,
bounds=None,
method='simplex',
callback=None,
options=None
)
-
今天閱讀數據建模第一章線性規划問題,問題描述如下:
-
-
通過介紹我們知道了線性規划,就是目標函數及約束條件均為線性函數。
-
-
通過畫圖我們可知,X1,X2的最優解為2,6,目標值為26。
-
我們如何時候這個scipy的公式來計算這個值呢:
>>> c = [-1, 4] >>> A = [[-3, 1], [1, 2]] >>> b = [6, 4] >>> x0_bounds = (None, None) >>> x1_bounds = (-3, None) >>> from scipy.optimize import linprog >>> res = linprog(c, A_ub=A, b_ub=b, bounds=(x0_bounds, x1_bounds), ... options={"disp": True}) >>> print(res) 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
-
上面是官方給出的案例,我們很難看出來這個怎么求解最大值,不過英語好的也可以把。
-
言歸正傳,我們先結合官網是思路得出最小值的解。
In [1]:c = np.array([4,3])
In [1]:a = np.array([[2,1],[1,1]])
In [1]:In [1]:b = np.array([10,8])
In [1]:optimize.linprog(c,a,b,bounds=((0,None),(0,7)))
Out[1]:
fun: -0.0
message: 'Optimization terminated successfully.'
nit: 0
slack: array([ 10., 8., 7.])
status: 0
success: True
x: array([ 0., 0.])
-
按照正常的計算 我們得出了最小值為0,且x的兩個值為 0 , 0。對於上面的的公式有必要說明的是,bounds是針對x的最大最小一次給一個值,從題目可知,x1的取值范圍為大於0,最小值就為0,最大值沒有約束,被其他的條件所約束就可以了 ,沒有明確,所以是寫的 (0,None),而相對x2來說,他最小值為0,最大值被C約束,為7。所以范圍為(0,7),當有三個求解的時候,依次增加,不可省略。
-
接下來我們說這個最大值怎么求,其實只要對C取反我們就可以求除最大值的負數,對結果在取反回來就可以了
In [1]:optimize.linprog(-c,a,b,bounds=((0,None),(0,7)))
Out[1]:
fun: -26.0
message: 'Optimization terminated successfully.'
nit: 2
slack: array([ 0., 0., 1.])
status: 0
success: True
x: array([ 2., 6.])
-
是不是很簡單,得到的-26取反回來就是我們的最大值求解了,(2,6)就是我們的X1,X2取值了。其實有時候那個條件為>,>=的時候我們要寫成<,<=的模式,一樣對參數和結果取反就行了。
-
我這里在補充一個求三個解的實例:
-
-
-
我們的最優解為 14.57