matlab——線性規划


@


前言

線性規划是數學規划中的一個重要分支,常用於解決如何利用現有資源來安排生產,以取得最大經濟效益的問題。本文將粗略地介紹線性規划,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

參考書目

《數學建模算法與應用》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM