第一章 線性規劃
線性規劃問題:
目標函數和約束條件均爲線性函數時的問題,成爲線性規劃問題
線性規劃的一般模型
max z=j=1∑ncjxjs.t.{∑j=1naijxj≤bx≥0 ,j=1,2,...,n
- 可行解:滿足約束的解x=[x1,...,xn]T
線性規劃的軟件求解
爲規範,將線性規劃的標準形式定爲:
mincTx,s.t.⎩⎪⎨⎪⎧Aup⋅x=bUpAeq⋅x=beqlb≤x≤ub
python代碼如下,其中r爲解:
import numpy as np
from scipy.optimize import linprog
c = np.array([-2, -3, +5])
A_up = np.array([[-2, 5, -1], [1, 3, 1]])
b_up = np.array([-10, 12])
A_eq = np.array([[1, 1, 1]])
b_eq = np.array([7])
r = linprog(c, A_up, b_up, A_eq, b_eq, bounds=((0, None), (0, None), (0, None)))
print(r)
運行結果實例:
con: array([1.80711979e-09])
fun: -14.571428565645085
message: 'Optimization terminated successfully.'
nit: 5
slack: array([-2.24563479e-10, 3.85714286e+00])
status: 0
success: True
x: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])
例:
求解下列線性規劃問題:
minz=2x1+3x2+xs.t.⎩⎪⎨⎪⎧x1+4x2+2x3≥83x1+2x2≥6x1,x2,x3≥0
將線性規劃轉化成以下形式:
minz=2x1+3x2+xs.t.⎩⎪⎪⎨⎪⎪⎧[−1−3−4−2−20]⎣⎡x1x2x3⎦⎤≤[−8−6]x1,x2,x3≥0
python代碼如下:
import numpy as np
from scipy.optimize import linprog
c = np.array([2, 3, 1])
A_up = np.array([[-1, -4, -2], [-3, -2, 0]])
b_up = np.array([-8, -6])
r = linprog(c, A_ub=A_up, b_ub=b_up, bounds=((0, None), (0, None), (0, None)))
print(r)
結果:
con: array([], dtype=float64)
fun: 6.999999994872991
message: 'Optimization terminated successfully.'
nit: 3
slack: array([ 3.85261067e-09, -1.41066305e-08])
status: 0
success: True
x: array([1.17949641, 1.23075538, 0.94874104])
注:scipy
的優化函數有限,在精度和優化程度上可能比不上專業優化軟件MATLAB
,Lingo
等。
可轉化爲線性規劃的問題
數學規劃問題:
min∣x1∣+∣x2∣+...+∣xn∣s.t. Ax≤b
例:
求解下列數學規劃問題:
minz=∣x1∣+2∣x2∣+3∣x3∣+4∣x4∣s.t.⎩⎪⎨⎪⎧x1−x2−x3+x4≤−2,x1−x2+x3−3x4≤−1,x1−x2−2x3+3x4≤−21
將變量變換ui=2xi+∣xi∣,vi=2∣xi∣−xi,則可把模型變換爲:
mincTy,s.t.⎩⎨⎧[A,−A][uv]≤bu,v≥0