規(guī)劃問題之線性規(guī)劃【筆記】
例題
以下面線性規(guī)劃為例,求的最小值
方法一:使用scipy庫(kù)
預(yù)備知識(shí)
scipy.optimize.linprog
語法
scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='interior-point', callback=None, options=None, x0=None)
常用參數(shù):
c:所求目標(biāo)函數(shù)未知數(shù)的系數(shù)集合
A_ub:不等式左邊未知數(shù)的系數(shù)集合
B_up,不等式右邊數(shù)值集合
A_eq,等式左邊未知數(shù)的系數(shù)集合
B_eq ,等式右邊的數(shù)值集合
bounds:每個(gè)未知數(shù)的限制集合 ,默認(rèn)每個(gè)未知數(shù)限制條件為(0,None)
method:用于解決標(biāo)準(zhǔn)形式問題的算法。默認(rèn)為interior-point
常用返回值:
fun:float,目標(biāo)函數(shù)的最優(yōu)值。(求解目標(biāo)函數(shù)的 最小值 )
x:一維數(shù)組,在滿足約束條件的同時(shí)使目標(biāo)函數(shù)最小化的決策變量的值。
status:int,表示算法退出狀態(tài)的整數(shù)。
0:優(yōu)化成功終止。 1:迭代極限達(dá)到。 2:這個(gè)問題似乎不可行。 3:問題似乎是無界的。 4:遇到數(shù)值困難。 nit:int,在所有階段中執(zhí)行的迭代的總數(shù)。
message:str,表示算法退出狀態(tài)的字符串描述符。
API官方解釋:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html
解答
首先,將約束修改為標(biāo)準(zhǔn)模式:不等式只能含有 小于等于
編寫代碼
from scipy import optimize
import numpy as np
# 目標(biāo)函數(shù)未知數(shù)的系數(shù)
c = np.array([2,3,-5])
# 不等式左邊未知數(shù)的系數(shù)集合(二維數(shù)組,因?yàn)椴恢挂粋€(gè)不等式)
# 第一個(gè)不等式的系數(shù)是【-2,5,-1】
# 第二個(gè)不等式的系數(shù)是【1,3,1】
A_ub = np.array([[-2,5,-1],[1,3,1]])
# 不等式右邊數(shù)值的集合(一維數(shù)組)
# 第一個(gè)不等式右邊數(shù)值是-10
# 第二個(gè)不等式右邊數(shù)值是12
b_ub = np.array([-10,12])
# 等式左邊的系數(shù)集合(二維數(shù)組)
A_eq = np.array([[1,1,1]])
# 等式右邊的數(shù)值(一維)
b_eq = np.array([7])
# 使用optimize.linprog進(jìn)行求解
res = optimize.linprog(c,A_ub,b_ub,A_eq,b_eq)
res
運(yùn)行結(jié)果
最優(yōu)解(最小值):-14.000000657683234 最優(yōu)解對(duì)應(yīng)的: array([2.99999979e+00, 1.04988686e-08, 4.00000005e+00])

補(bǔ)充 - 1
倘若需要求 的最大值 ?
scipy.optimize.linprog 只能求目標(biāo)函數(shù)最小值
若需要求目標(biāo)函數(shù)最大值 ,只需要將函數(shù)中參數(shù)改為 -c
?因?yàn)樵谇笠粋€(gè)函數(shù)的最大值時(shí),我們可以求取反(乘以-1)后目標(biāo)函數(shù)的最小值
對(duì)最小值再乘以-1 即可得到最大值
比如函數(shù) x1 + x2 的最大值是2(事先不知道)
我們可以先求 -(x1 + x2) 的最小值
通過求解找出-(x1 + x2) 的最小值為 -2
那么最大值就是 -2 * -1 = 2
Demo代碼
from scipy import optimize
import numpy as np
c = np.array([2,3,-5])
A_ub = np.array([[-2,5,-1],[1,3,1]])
b_ub = np.array([-10,12])
A_eq = np.array([[1,1,1]])
b_eq = np.array([7])
res = optimize.linprog(-c,A_ub,b_ub,A_eq,b_eq)
res
運(yùn)行結(jié)果:
最優(yōu)解,最大值是:14.571428565645032(我們求的是-c的最小值,為-14.571428565645032,那么c的最大值就是 14.571428565645032) 對(duì)應(yīng)最優(yōu)解: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])

補(bǔ)充 - 2
可以發(fā)現(xiàn)最后結(jié)果中數(shù)據(jù)是以科學(xué)記數(shù)法表示的
倘若不需要科學(xué)技術(shù)法進(jìn)行表示
添加代碼np.set_printoptions(suppress=True) 即可
Demo代碼
from scipy import optimize
import numpy as np
np.set_printoptions(suppress=True)
c = np.array([2,3,-5])
A_ub = np.array([[-2,5,-1],[1,3,1]])
b_ub = np.array([-10,12])
A_eq = np.array([[1,1,1]])
b_eq = np.array([7])
res = optimize.linprog(-c,A_ub,b_ub,A_eq,b_eq)
res
運(yùn)行結(jié)果

補(bǔ)充 - 3
在前面的例子中,的范圍為 x >= 0 , 屬于scipy.optimize.linprog中參數(shù) bounds 的默認(rèn)值(0, None)
None:表示無限制
那么如果 有范圍限制該如何求解呢?
