1.線性規划模型:
2.使用python scipy.optimize linprog求解模型最優解:
在這里我們用到scipy中的linprog進行求解,linprog的用法見https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html
scipy.optimize.
linprog
(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', callback=None, options=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相同。