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