
線性規划問題的基本內容
線性規划解決的是自變量在一定的線性約束條件下,使得線性目標函數求得最大值或者最小值的問題。
\[\min z=\sum_{j=1}^{n} f_{j} x_{j} \]
\[\text { s.t. }\left\{\begin{array}{ll}{\sum_{j=1}^{n} a_{i j} x_{j} \leqslant b_{i}} & {(i=1,2, \cdots, m)} \\ {\sum_{j=1}^{n} a_{k j}^{\mathrm{eq}} x_{j} \leqslant b_{k}^{\mathrm{eq}}} & {(k=1,2, \cdots, h)} \\ {\mathrm{lb}_{j} \leqslant x_{j} \leqslant \mathrm{ub}_{j}} & {(j=1,2, \cdots, n)}\end{array}\right. \]
其中
價值系數向量為
\[\mathbf{F}=\left(f_{1}, f_{2}, \cdots, f_{n}\right)^{\mathrm{T}} \]
決策變量向量為
\[\mathbf{X}=\left(x_{1}, x_{2}, \cdots, x_{n}\right)^{\mathrm{T}} \]
不等式約束系數矩陣為
\[\mathbf{A}=\left(\begin{array}{ccc}{a_{11}} & {\cdots} & {a_{1 n}} \\ {\vdots} & {\ddots} & {\vdots} \\ {a_{m 1}} & {\cdots} & {a_{m n}}\end{array}\right) \]
不等式右端常數向量為
\[\mathbf{B}=\left(b_{1}, b_{2}, \cdots, b_{n}\right)^{\mathrm{T}} \]
等式約束系數矩陣為
\[\mathbf{A}_{eq} = \left(\begin{array}{ccc}{a_{11}^{\mathrm{cq}}} & {\cdots} & {a_{1 n}^{\mathrm{cq}}} \\ {\vdots} & {\ddots} & {\vdots} \\ {a_{\mathrm{h1}}^{\mathrm{eq}}} & {\cdots} & {a_{\mathrm{hn}}^{\mathrm{eq}}}\end{array}\right) \]
等式右端常數向量為
\[\mathbf{B}_{\mathrm{eq}}=\left(b_{1}^{\mathrm{eq}}, b_{2}^{\mathrm{eq}}, \cdots, b_{\mathrm{h}}^{\mathrm{eq}}\right)^{\mathrm{T}} \]
決策變量下界向量為
\[\mathbf{L B}=\left(\mathrm{lb}_{1}, \mathrm{lb}_{2}, \cdots, \mathrm{lb}_{n}\right)^{\mathrm{T}} \]
決策變量上界變量為
\[\mathbf{UB}=\left(\mathrm{ub}_{1}, \mathrm{ub}_{2}, \cdots, \mathrm{ub}_{n}\right)^{\mathrm{T}} \]
當目標函數為最小值時,上述問題可以寫成如下形式:
\[\min z=\boldsymbol{F}^{\mathrm{T}} \boldsymbol{X} \]
\[\text { s.t. }\left\{\begin{array}{l}{\mathbf{A}\mathbf{X} \leqslant \mathbf{B}} \\ {\mathbf{A}_{\mathrm{eq}} \mathbf{X}=\mathbf{B}_{\mathrm{eq}}} \\ {\mathbf{LB} \leqslant \mathbf{X} \leqslant \mathbf{UB}}\end{array}\right. \]
當目標函數為最大值時,上述問題可以寫成如下形式:
\[\max z=\boldsymbol{-F}^{\mathrm{T}} \boldsymbol{X} \]
\[\text { s.t. }\left\{\begin{array}{l}{\mathbf{A}\mathbf{X} \leqslant \mathbf{B}} \\ {\mathbf{A}_{\mathrm{eq}} \mathbf{X}=\mathbf{B}_{\mathrm{eq}}} \\ {\mathbf{LB} \leqslant \mathbf{X} \leqslant \mathbf{UB}}\end{array}\right. \]
Matlab模型代碼
調用形式
[X,FVAL,EXITFLAG,OUTPUT,LAMBDA] = linprog(F,A,B,Aeq,Beq,LB,UB) % 目標函數為最小值
[X,FVAL,EXITFLAG,OUTPUT,LAMBDA] = linprog(-F,A,B,Aeq,Beq,LB,UB) % 目標函數為最大值
輸入變量
-
F 為目標函數中的價值系數向量
-
A 為不等式約束系數矩陣(注意默認不等式方向為小於等於,若為大於等於,需要將其取相反數)
-
B 為不等式右端常數向量(注意默認不等式方向為小於等於,若為大於等於,需要將其取相反數)
-
Aeq 為等式約束系數矩陣
-
Beq 為等式右端常數向量
-
LB 為決策變量下界向量
-
UB為決策變量上界向量
在調用時,輸入參數不存在時,可以將其輸入用 [] 空矩陣表示。
輸出變量
- X 為最優解
- FVAL 為最優目標值
- EXITFLAG 為運行結束標志,當等於1時,表示程序收斂於解 X;當等於0時,表示程序運行次數到達最大;當小於0時,說明情況較多
- OUTPUT 為程序迭代次數
- LAMBDA 為解X相關的Largrange乘子和影子價格
案例演示
目標函數與約束條件
\[\min z=2 x_{1}+3 x_{2}+x_{3} \]
\[\left\{\begin{array}{l}{x_{1}+4 x_{2}+2 x_{3} \geq 8} \\ {3 x_{1}+2 x_{2} \geq 6} \\ {x_{1}, x_{2}, x_{3} \geq 0}\end{array}\right. \]
Matlab程序
F= [2;3;1];
A = [1,4,2;3,2,0];
B = [8;6];
LB = zeros(3,1);
[X,FVAL] = linprog(F,-A,-B,[],[],LB,[])
運行結果
Optimization terminated.
X =
0.8066
1.7900
0.0166
FVAL =
7.0000
