Matlab中线性规划的标准型为:
所求的线性规划问题为:
m
i
n
c
T
x
min {{c}^{T}}x
mincTx,下列为参数的限制条件
s.t.
{
A
x
≤
b
A
e
q
⋅
x
=
b
e
q
l
b
≤
x
≤
u
b
\text { s.t. }\left\{\begin{array}{l} A x \leq b \\ A e q \cdot x=b e q \\ l b \leq x \leq u b \end{array}\right.
s.t. ⎩⎨⎧Ax≤bAeq⋅x=beqlb≤x≤ub
注意:我们的代码对于第一个条件必须是小于等于的形式,如果我们已知的不等式条件不是该形式需要通过添加负号进行转换
Matlab对于线性规划来讲只能求解最小值,但是很多线性规划问题会要求你求出最大值,此时就需要对该问题转化为最小值来进行Matlab求值。
Matlab求解此类问题的函数为linprog(c, A, b),它的返回值是向量 x 的值(其他的函数调用形式可以在Matlab指令窗运行help linprog命令就可以看到所有的函数调用形式),如:
例1:求解下列线性规划问题:
max
z
=
2
x
1
+
3
x
2
−
5
x
3
\max z=2 x_{1}+3 x_{2}-5 x_{3}
maxz=2x1+3x2−5x3
条件如下:
x
1
+
x
2
+
x
3
=
7
2
x
1
−
5
x
2
+
x
3
≥
10
x
1
+
3
x
2
+
x
3
≤
12
x
1
,
x
2
,
x
3
≥
0
\begin{array}{l} x_{1}+x_{2}+x_{3}=7 \\ 2 x_{1}-5 x_{2}+x_{3} \geq 10 \\ x_{1}+3 x_{2}+x_{3} \leq 12 \\ x_{1}, x_{2}, x_{3} \geq 0 \end{array}
x1+x2+x3=72x1−5x2+x3≥10x1+3x2+x3≤12x1,x2,x3≥0
代码为:
c = [-2; -3; 5]; %c就是标准型中需要求解的问题,由于本题是求
%最大值,而matlab只能求最小值,因此给变量加负号
a = [-2, 5, -1;1, 3, 1]; %这里的a就相当于标准型中的A
b = [-10; 12]; %因为不等式添加负号了,因此右侧的10也要添加负号
aeq = [1, 1, 1];
beq = 7;
x = linprog(-c, a, b, aeq, beq, zeros(3, 1));
value = c' * x; %通过矩阵乘法进行所求表达式值的大小
例2:求解下列线性规划问题:
min
z
=
2
x
1
+
3
x
2
+
x
3
\min z=2 x_{1}+3 x_{2}+ x_{3}
minz=2x1+3x2+x3限定条件如下:
x
1
+
4
x
2
+
2
x
3
≥
8
3
x
1
+
2
x
2
≥
6
x
1
,
x
2
,
x
3
≥
0
\begin{array}{l} x_{1}+4x_{2}+2x_{3}\geq\ 8 \\ 3 x_{1}+2 x_{2} \geq 6 \\ x_{1}, x_{2}, x_{3} \geq 0 \end{array}
x1+4x2+2x3≥ 83x1+2x2≥6x1,x2,x3≥0
题解代码如下:
c = [2; 3; 1];
a = [-1, -4, -2; -3, -2, 0]; %这里的第二维的缺失值必须使用0来进行填充
b = [-8; -6];
[x, y] = linprog(c, a, b, [], [], zeros(3, 1));
本示例参考书籍为:司守奎老师的《数学建模算法与程序》