线性规划(Matlab)
- 线性规划
- Matlab函数
- Matlab使用例子
线性规划
线性规划:约束条件和目标函数都是线性的。简单点说,所有的决策变量在目标函数和约束条件中都是一次方。
Matlab函数
Matlab函数:
[x, value] = linprog(func, A, b, Aeq, beq ,lb, ub);
参数解释:
- func 表示目标函数。
- A 表示不等式约束条件系数矩阵,b 表示不等式约束条件常数矩阵。
- Aeq 表示等式约束条件系数矩阵,beq 表示等式约束条件常数矩阵。
- lb 表示决策变量的下限数组,ub表示决策变量的上限数组。
- x 表示目标函数 func 取得最小值时的决策变量取值数组。
- value 表示目标函数 func 取得的最小值。
Matlab中线性规划的标准形式:
min
x
c
T
x
\min_x c^Tx
xmincTx
s
.
t
.
{
A
x
⩽
b
A
e
q
⋅
x
=
b
e
q
l
b
⩽
x
⩽
u
b
s.t. \begin{cases} Ax\leqslant b\\ Aeq\cdot x= beq\\ lb\leqslant x\leqslant ub\\ \end{cases}
s.t.⎩
⎨
⎧Ax⩽bAeq⋅x=beqlb⩽x⩽ub
注意:
- 对于不存在的约束用空矩阵[],意思是例如beq条件不存在,但是lb和ub条件存在,可以写成linprog(func, A, b, Aeq, [] ,lb, ub)。如果不是中间某个参数不存在,而是后面都不存在就可以省略,例如lb和ub不存在,可以写成linprog(func, A, b, Aeq, beq)。
- 根据Matlab标准,默认求解最小值,如果要求解最大值,把目标函数变成相反数(系数全部乘以-1);约束条件默认求的都是小于等于或者等号,大于号得转成小于等于。就是说拿到一个目标函数和约束条件,放进Matlab求解前,要先转换为Matlab标准。
Matlab使用例子
步骤:按照数模题目进行建模,得到目标函数和约束条件,然后把目标函数和约束条件化为标准形式,再化成matlab里面矩阵形式,再填入代码中。
目标函数和约束条件:
m
a
x
z
=
x
1
+
x
2
−
3
x
3
max\quad z=x_1+x_2-3x_3
maxz=x1+x2−3x3
s
.
t
.
{
x
1
+
x
2
+
x
3
=
6
x
1
−
x
2
≥
2
x
1
+
x
2
−
2
x
3
≤
5
x
1
,
x
2
,
x
3
≤
15
s.t. \begin{cases} x_1+x_2+x_3=6\\ x_1-x_2\geq2\\ x_1+x_2-2x_3\leq5\\ x_1,x_2,x_3\leq15\\ \end{cases}
s.t.⎩
⎨
⎧x1+x2+x3=6x1−x2≥2x1+x2−2x3≤5x1,x2,x3≤15
根据Matlab标准化后的目标函数和约束条件:
m
i
n
w
=
−
x
1
−
x
2
+
3
x
3
min\quad w=-x_1-x_2+3x_3
minw=−x1−x2+3x3
s
.
t
.
{
x
1
+
x
2
+
x
3
=
6
−
x
1
+
x
2
+
0
∗
x
3
≤
−
2
x
1
+
x
2
−
2
x
3
≤
5
x
1
,
x
2
,
x
3
≤
15
s.t. \begin{cases} x_1+x_2+x_3=6\\ -x_1+x_2+0*x_3\leq-2\\ x_1+x_2-2x_3\leq5\\ x_1,x_2,x_3\leq15\\ \end{cases}
s.t.⎩
⎨
⎧x1+x2+x3=6−x1+x2+0∗x3≤−2x1+x2−2x3≤5x1,x2,x3≤15
约束条件矩阵化:
(
1
−
1
0
1
1
−
2
)
(
x
1
x
2
x
3
)
≤
(
−
2
5
)
\left(\begin {array}{c} 1 &-1 &0 \\ 1 &1 &-2 \\ \end{array}\right) \left(\begin {array}{c} x_1\\ x_2\\ x_3\\ \end{array}\right) \leq \left(\begin {array}{c} -2\\ 5\\ \end{array}\right)
(11−110−2)
x1x2x3
≤(−25)
[
1
1
1
]
⋅
[
x
1
x
2
x
3
]
T
=
6
\left[\begin {array}{c} 1&1&1 \end{array}\right] \cdot {\left[\begin {array}{c} x_1&x_2&x_3 \end{array}\right]}^T=6
[111]⋅[x1x2x3]T=6
[
x
1
x
2
x
3
]
T
≤
[
15
15
15
]
T
{\left[\begin {array}{c} x_1&x_2&x_3 \end{array}\right]}^T\leq{\left[\begin {array}{c} 15&15&15 \end{array}\right]}^T
[x1x2x3]T≤[151515]T
Matlab代码:文章来源:https://uudwc.com/A/y5366
func=[-1;-1;3];
A=[1,-1,0;1,1,-1];
b=[-2;5];
aeq=[1,1,1]
beq=6;
ub=[15;15;15];
[x,value]=linprog(func,A,b,aeq,beq,[],ub);
结果:文章来源地址https://uudwc.com/A/y5366
>> x
x =
-9.5000
15.0000
0.5000
>> value
value =
-4