使用python scipy.optimize linprog和lingo線性規划求解最大值,最小值(運籌學學習筆記)


1.線性規划模型:

 

2.使用python scipy.optimize linprog求解模型最優解:

在這里我們用到scipy中的linprog進行求解,linprog的用法見https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html

scipy.optimize.linprog(cA_ub=Noneb_ub=NoneA_eq=Noneb_eq=Nonebounds=Nonemethod='simplex'callback=Noneoptions=None)

method = 'simplex'(單純形法),bounds確定邊界,x≥0為(0,None)。

要使用linprog,目標函數要變成求最小值,如果原題目要求求max(最大值),只需對目標函數取負,但要注意求解的最終值是取負后的目標函數的最小值,取負即為最大值。

下面為具體python代碼:

 

import numpy as np
from scipy.optimize import linprog

c = np.array([1,2,3])
A_ub = np.array([[-2,1,1],[3,-1,-2]])
b_ub = np.array([9,-4])
A_eq = np.array([[3,-2,-3]])
b_eq = np.array([-6])
r = linprog(c,A_ub,b_ub,A_eq,b_eq,bounds=((None,0),(0,None),(None,None)))
print(r)

程序的輸出結果為:

fun: -22.0
message: 'Optimization terminated successfully.'
nit: 3
slack: array([ 0., 7., 0.])
status: 0
success: True
x: array([-7., 0., -5.])

 

fun為目標函數的最優值,slack為松弛變量,status表示優化結果狀態,在這里不用過於追究,x為最優解。

最優解為-22

3.使用lingo進行線性規划:

當模型不是很大是可以用lingo求解,下面為lingo求解過程:

-----------------------------------------------------------------------------------------------------------------------

min=x1+2*x2+3*x3;
-2*x1+x2+x3<=9;
-3*x1+x2+2*x3>=4;
3*x1-2*x2-3*x3=-6;
x1<=0;
@free(x1);@free(x3);

-----------------------------------------------------------------------------------------------------------------------


目標函數使用max=或者min=表示,注意不是max z=。在lingo中變量默認為非負,使用@free可以解除限制。注意每一行結束要是用“;”,這點跟c類似。

 

求解結果為:

Objective value:                             -22.00000

Variable Value 
X1          -7.000000 
X2          0.000000 
X3          -5.000000 

結果跟python相同。

 


免責聲明!

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



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