使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)
函數格式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
總結
以上是生活随笔為你收集整理的使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 官宣:我改名啦
- 下一篇: 聊聊GIS中的坐标系|再版 详细定义、计