MATLAB 线性规划

本文介绍了线性规划问题的概念,并详细阐述了如何使用MATLAB的linprog函数来解决线性规划问题,包括将问题转换为标准形式和编写MATLAB代码进行求解的过程。同时,文章提供了一个实例并展示了具体解决方案。
摘要由CSDN通过智能技术生成

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。



什么是线性规划问题

线性规划问题是指在一组线性不等式约束条件下,求解一个线性目标函数的最大值或最小值的问题。


如何使用 MATLAB 解决线性规划问题

常见的线性规划问题通常类似于以下形式:

max ⁡ Z = 4000 x 1 + 3000 x 2 \begin{equation} \max \quad Z=4000 x_{1}+3000 x_{2} \end{equation} maxZ=4000x1+3000x2
 s.t.  { 2 x 1 + x 2 ≤ 10 x 1 + x 2 ≤ 8 x 2 ≤ 7 x 1 , x 2 ≥ 0 \begin{equation} \text { s.t. } \begin{cases} & 2 x_{1}+x_{2} \leq 10 \\ & x_{1}+x_{2} \leq 8 \\ & x_{2} \leq 7 \\ & x_{1}, x_{2} \geq 0 \end{cases} \end{equation}  s.t.  2x1+x210x1+x28x27x1,x20

其中,公式1为目标函数,公式2为约束条件。

为了便于求解,我们可以将公式1和公式2分别写成矩阵形式:

max ⁡ Z = [ 4000 3000 ] ⋅ [ x 1 x 2 ] \begin{equation} \max \quad Z=\begin{bmatrix} 4000 & 3000 \end{bmatrix} \cdot \begin{bmatrix} x_{1} \\ x_{2} \end{bmatrix} \end{equation} maxZ=[40003000][x1x2]
 s.t.  { [ 2 1 1 1 0 1 ] ⋅ [ x 1 x 2 ] ≤ [ 10 8 7 ] x 1 , x 2 ≥ 0 \begin{equation} \text { s.t. } \left\{ \begin{array}{} \begin{bmatrix} 2 & 1 \\ 1 & 1 \\ 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} x_{1} \\ x_{2} \end{bmatrix} \leq \begin{bmatrix} 10 \\ 8 \\ 7 \end{bmatrix} \\ x_{1}, x_{2} \geq 0 \end{array} \right. \end{equation}  s.t.  210111 [x1x2] 1087 x1,x20

为了统一最大目标函数问题和最小目标函数问题,我们将目标函数的符号取反,即:

min ⁡ − Z = [ − 4000 − 3000 ] ⋅ [ x 1 x 2 ] \begin{equation} \min \quad -Z=\begin{bmatrix} -4000 & -3000 \end{bmatrix} \cdot \begin{bmatrix} x_{1} \\ x_{2} \end{bmatrix} \end{equation} minZ=[40003000][x1x2]

公式5和公式4这种形式就满足 MATLAB 线性规划的标准形式:

min ⁡ x f T x  such that  { A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b \min _{x} f^{T} x \text { such that } \left\{ \begin{array}{c} A \cdot x \leq b, &\\ { Aeq } \cdot x={ beq }, &\\ l b \leq x \leq u b & \end{array} \right. xminfTx such that  Axb,Aeqx=beq,lbxub

其中, f T x f^{T}x fTx为目标函数,A为约束条件的系数矩阵,b为约束条件的常数项,Aeq为等式约束条件的系数矩阵,beq为等式约束条件的常数项,lb为变量的下界,ub为变量的上界。

问题转换成标准形式后,我们就可以使用 MATLAB 的 linprog 函数来求解了。

linprog 函数的语法为:

[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub)

其中,x为求解得到的最优解,fval为最优解对应的目标函数值。

最开始的问题就可以用以下代码解决:

f = [-4000 -3000];
A = [2 1; 1 1; 0 1];
b = [10; 8; 7];
lb = [0; 0];

[x, fval] = linprog(f, A, b, [], [], lb, []);
fval = -fval; % 因为目标函数取反了,所以这里要取反

最后得出的结果为:

x =
    2.0000
    6.0000

fval =
    26000

附加题

让我们运用上文的方法求解以下线性规划问题:

max ⁡ Z = 2 x 1 + 3 x 2 + 4 x 3 \begin{equation} \max \quad Z=2 x_{1}+3 x_{2} + 4 x_{3} \end{equation} maxZ=2x1+3x2+4x3
 s.t.  { 2 x 1 + x 2 + 3 x 3 ≤ 36 x 1 + x 2 ≥ 8 x 1 + x 3 ≥ 10 x 1 + x 2 − x 3 = 4 x 1 , x 2 , x 3 ≥ 0 \begin{equation} \text { s.t. } \left\{ \begin{array}{c} 2 x_{1}+x_{2}+3x_{3} \leq 36 &\\ x_{1}+x_{2} \geq 8 &\\ x_{1}+x_{3} \geq 10 &\\ x_{1}+x_{2}-x_{3} = 4 &\\ x_{1}, x_{2}, x_{3} \geq 0 & \end{array} \right. \end{equation}  s.t.  2x1+x2+3x336x1+x28x1+x310x1+x2x3=4x1,x2,x30

首先,我们将问题转换成标准形式:

min ⁡ − Z = − [ − 2 − 3 − 4 ] ⋅ [ x 1 x 2 x 3 ] \begin{equation} \min \quad -Z=-\begin{bmatrix} -2 & -3 & -4 \end{bmatrix} \cdot \begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \end{bmatrix} \end{equation} minZ=[234] x1x2x3
 s.t.  { [ 2 1 3 − 1 − 1 0 − 1 0 − 1 ] ⋅ [ x 1 x 2 x 3 ] ≤ [ 36 − 8 − 10 ] [ 1 1 − 1 ] ⋅ [ x 1 x 2 x 3 ] = [ 4 ] x 1 , x 2 , x 3 ≥ 0 \begin{equation} \text { s.t. } \left\{ \begin{array}{c} \begin{bmatrix} 2 & 1 & 3 \\ -1 & -1 & 0 \\ -1 & 0 & -1 \end{bmatrix} \cdot \begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \end{bmatrix} \leq \begin{bmatrix} 36 \\ -8 \\ -10 \end{bmatrix} &\\ \begin{bmatrix} 1 & 1 & -1 \end{bmatrix} \cdot \begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \end{bmatrix} = \begin{bmatrix} 4 \end{bmatrix} &\\ x_{1}, x_{2}, x_{3} \geq 0 & \end{array} \right. \end{equation}  s.t.  211110301 x1x2x3 36810 [111] x1x2x3 =[4]x1,x2,x30

然后即可代入求解:

f = [-2 -3 -4];
A = [2 1 3; -1 -1 0; -1 0 -1];
b = [36; -8; -10];
Aeq = [1 1 -1];
beq = [4];
lb = [0; 0; 0];

[x, fval] = linprog(f, A, b, Aeq, beq, lb, []);
fval = -fval;

最后得出的结果为:

x =
    2.6667
    8.6667
    7.3333

fval =
    60.6667
  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小嗷犬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值