⎨⎧2x1+x2≤10x1+x2≤8x2≤7x1,x2≥0其中,公式1为目标函数,公式2为约束条件。
为了便于求解,我们可以将公式1和公式2分别写成矩阵形式:
maxZ=[40003000]⋅[x1x2]
s.t. ⎩⎨⎧210111⋅[x1x2]≤1087x1,x2≥0
为了统一最大目标函数问题和最小目标函数问题,我们将目标函数的符号取反,即:
min−Z=[−4000−3000]⋅[x1x2]
公式5和公式4这种形式就满足 MATLAB 线性规划的标准形式:
xminfTx such that ⎩⎨⎧A⋅x≤b,Aeq⋅x=beq,lb≤x≤ub
其中,fTx为目标函数,A
为约束条件的系数矩阵,b
为约束条件的常数项,Aeq
为等式约束条件的系数矩阵,beq
为等式约束条件的常数项,lb
为变量的下界,ub
为变量的上界。
问题转换成标准形式后,我们就可以使用 MATLAB 的 linprog
函数来求解了。
linprog
函数的语法为:
1
| [x,fval] = linprog(f,A,b,Aeq,beq,lb,ub)
|
其中,x
为求解得到的最优解,fval
为最优解对应的目标函数值。
最开始的问题就可以用以下代码解决:
1 2 3 4 5 6 7
| 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;
|
最后得出的结果为:
1 2 3 4 5 6
| x = 2.0000 6.0000
fval = 26000
|
附加题
让我们运用上文的方法求解以下线性规划问题:
maxZ=2x1+3x2+4x3
s.t. ⎩⎨⎧2x1+x2+3x3≤36x1+x2≥8x1+x3≥10x1+x2−x3=4x1,x2,x3≥0
首先,我们将问题转换成标准形式:
min−Z=−[−2−3−4]⋅x1x2x3
s.t. ⎩⎨⎧2−1−11−1030−1⋅x1x2x3≤36−8−10[11−1]⋅x1x2x3=[4]x1,x2,x3≥0
然后即可代入求解:
1 2 3 4 5 6 7 8 9
| 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;
|
最后得出的结果为:
1 2 3 4 5 6 7
| x = 2.6667 8.6667 7.3333
fval = 60.6667
|
小嗷犬
分享技术,记录生活
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小嗷犬!