使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM