linprog函数在octave中的使用
octive可以用一个比较好的网站使用:
Octave Online
进入正题:
linprog 函数是matlab中求解线性规划问题所常用到的一个函数,它在octave中仍然适用,接下来就从一个具体的线性规划例子中看它是如何运用的。
在这里补充一下,线性规划是数学规划的一个分支,是研究线性约束条件下线性目标函数的极值问题的数学理论和方法,解决线性规划问题,要标明决策变量,约束条件,目标函数三个要素,从而建立模型解决问题。
例题:
在这个问题中我们设 xi (i=1,2) 为甲乙两个机床的每日生产量,其中 xi 就是决策变量。
根据题意列出约束条件:
{
2
x
1
+
x
2
⩽
10
,
x
1
+
x
2
⩽
8
,
x
2
⩽
7
,
x
i
⩾
0
,
(
i
=
1
,
2
)
\left\{ \begin{matrix} 2 x_1+x_2\leqslant10 , \\ x_1+x_2\leqslant8, \\ x_2\leqslant7, \\ x_i \geqslant \ 0,(i=1,2) \end{matrix} \right.
⎩
⎨
⎧2x1+x2⩽10,x1+x2⩽8,x2⩽7,xi⩾ 0,(i=1,2)
此时可以建立数学模型:
m
a
x
z
=
4
x
1
+
3
x
2
maxz =4x_1+3x_2
maxz=4x1+3x2
s
.
t
.
=
{
2
x
1
+
x
2
⩽
10
,
x
1
+
x
2
⩽
8
,
x
2
⩽
7
,
x
i
⩾
0
,
(
i
=
1
,
2
)
s.t.= \left\{ \begin{matrix} 2 x_1+x_2\leqslant10 , \\ x_1+x_2\leqslant8, \\ x_2\leqslant7, \\ x_i \geqslant \ 0,(i=1,2) \end{matrix} \right.
s.t.=⎩
⎨
⎧2x1+x2⩽10,x1+x2⩽8,x2⩽7,xi⩾ 0,(i=1,2)
其中,
s
.
t
.
s.t.
s.t. (subject to) 表示“受约束为”
建立完数学模型后,,就可以用linprog函数进行解答了
linprog的一般形式为:
[
x
,
f
v
a
l
]
=
l
i
n
p
r
o
g
(
f
,
a
,
b
,
A
e
q
,
B
e
q
,
l
b
,
u
b
)
[x,fval] =linprog(f,a,b,Aeq,Beq,lb,ub)
[x,fval]=linprog(f,a,b,Aeq,Beq,lb,ub)
对应的数学模型为:
寻找x使得
m
i
n
(
f
T
x
)
min(f^Tx)
min(fTx)
s
.
t
.
=
{
a
⋅
x
⩽
b
,
A
e
q
⋅
x
=
B
e
q
,
l
b
⩽
x
⩽
u
b
s.t.= \left\{ \begin{matrix} a\cdot x\leqslant b, \\ Aeq \cdot x=Beq, \\ lb\leqslant x\leqslant ub \end{matrix} \right.
s.t.=⎩
⎨
⎧a⋅x⩽b,Aeq⋅x=Beq,lb⩽x⩽ub
其中x是返回决策向量的取值,fval是返回目标函数的最优值,f为价值向量,a,b是对应线性不等式约束,Aeq和Beq是对应线性等式约束,lb和ub分别对应决策向量的下界向量和上界向量,要注意的是在MATLAB中求解线性规划标准形式为求最小值,所以如果求最大值只需进行变号,变不等式方向即可。
在octave中运用linprog函数时需要先调用,要用pkg load optim
来调用。
此时对 f , a , b , A e q , B e q , l b , u b f,a,b,Aeq,Beq,lb,ub f,a,b,Aeq,Beq,lb,ub赋值
根据不等式得
求
4
x
1
+
3
x
2
4x_1+3x_2
4x1+3x2的最小值,则
f
=
f=
f=
[
4
;
3
]
\begin{bmatrix} 4;3\\ \end{bmatrix}
[4;3]
a
=
a=
a=
[
2
,
1
;
1
,
1
;
0
,
1
]
\begin{bmatrix} 2,1;1,1;0,1\\ \end{bmatrix}
[2,1;1,1;0,1]
b
=
b=
b=
[
10
,
8
,
7
]
\begin{bmatrix} 10,8,7\\ \end{bmatrix}
[10,8,7]
a , b a,b a,b 中一个分号表示一个对应式子
由于此题没有等式限制,则 A e q = B e q = [ ] Aeq=Beq=[ ] Aeq=Beq=[]
l
b
=
[
0
,
0
]
lb=[0,0]
lb=[0,0]
u
b
=
[
10000
,
10000
]
,
ub=[10000,10000],
ub=[10000,10000], ub可以根据题意修改,这里是随便的一个数,
最后求的fval是最小值,所以要求反得到最大值
clear
c=[4;3]
b=[10;8;7]
a=[2,1;1,1;0,1]
lb=zeros(2,1)//2行1列为0
ub=[10000;10000]
[x,FVAL]=linprog(-c,a,b,[ ],[ ],lb,ub)
y=-FVAL
结果加求反为
则答案为
x
1
=
2
,
x
2
=
6
x_1=2,x_2=6
x1=2,x2=6
最大利润为
−
F
V
A
L
=
26
-FVAL=26
−FVAL=26