@
前言
線性規划是數學規划中的一個重要分支,常用於解決如何利用現有資源來安排生產,以取得最大經濟效益的問題。本文將粗略地介紹線性規划,matlab實現和常見變形。
一、基本概念
一般線性規划問題地(數學)標准型為
\[max\quad z=\sum\limits_{j=1}^nc_jx_j, \\s.t \quad y= \begin{cases} \sum\limits_{j=1}^na_{ij}x_j=b_i,i=1,2,...,m\\ x_j\geq0,j=1,2,...,n \end{cases} \tag{1} \]
可行解:滿足約束條件的解\(x=[x_1,...,x_n]^T\)
最優解:使目標函數達到最大值的可行解
二、matlab實現
1.常用函數
matlab中規定線性規划的標准形式為:
\[\underset {x}{min}\ \pmb f^T\pmb x,\\s.t\quad \begin{cases} \pmb{A\cdot x}\leq \pmb b,\\ Aeq \cdot \pmb x=beq\\ lb\leq x\leq ub \end{cases} \]
其中\(\pmb{f,x,b},beq,lb,ub\)為列向量, \(\pmb f\)稱為價值向量,\(\pmb b\)稱為資源向量;\(\pmb A,Aeq\)為矩陣。
matlab求線性規划的函數為
[x,fval]=linprog(f,A,b);
[x,fval]=linprog(f,A,b,Aeq,beq);
[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub);//如果Aeq,beq不存在用[]代替
注意:
(1)如果是求\(\underset {x}{max}\ \pmb f^T\pmb x\),則需轉化為\(\underset {x}{min}\ \pmb {-f}^T\pmb x\),答案為函數求出來的值的相反數。
(2)在得到矩陣\(\pmb {A,b}\)前,要將所有不等式轉化為\(\pmb {Ax}\leq \pmb b\)的形式。
2.常見變形
\[min\quad |x_1|+|x_2|+...+|x_n|,\\ s.t\quad \pmb {Ax\leq b}. \]
這看起來不是線性規划,但可以通過變換轉化成線性規划問題。
注意到對任意\(x_i\),存在\(u_i,v_i\geq 0\)滿足
\[x_i=u_i-v_i,|x_i|=u_i+v_i\\u_i=\frac{x_i+|x_i|}{2},v_i=\frac{|x_i|-x_i}{2} \]
記\(\pmb u=[u_1,...,u_n]^T,\pmb v=[v_1,...,v_n]^T\),於是上述問題轉化為
\[min\quad \sum\limits_{i=1}^{n}(u_i+v_i),\\s.t\ \begin{cases} \pmb{A\cdot (u-v)}\leq \pmb b,\\ \pmb {u,v}\geq 0.\\ \end{cases} \]
改寫成matlab形式
\[min\quad ,\left[ \begin{matrix} 1\\1\end{matrix}\right]^T\left[ \begin{matrix} \pmb u\\\pmb v\end{matrix}\right]\\s.t\ \begin{cases} [A,-A]\cdot \left[ \begin{matrix} \pmb u\\\pmb v\end{matrix}\right],\\ \pmb {u,v}\geq 0.\\ \end{cases} \]
code:
//z=|x1|+2|x2|+3|x3|+4|x4|
f=1:4;
f=[f,f]';
A=[1,-1,-1,1;1,-1,1,-3;1,-1,-2,3];
A=[A,-A];
b=[-2;-1;-0.5];
[y,z]=linprog(f,A,b,[],[],zeros(8,1));
x=y(1:4)-y(5:end)
z
參考書目
《數學建模算法與應用》