某工厂需要利用三种原材料(分别记为1 , 2 ,3 )混合调配出三种不同的产品(甲,乙,丙)。具体要求及产品利润如下表所示,请建立数学模型,为该厂安排生产规划,使其利润最大
产品名称 | 规格要求 | 售价(元/Kg) |
---|---|---|
甲 | 原料 1 >= 50% 原料 2<=25% | 50 |
乙 | 原料 1 >= 25% 原料 2<=50% | 35 |
丙 | 不限 | 25 |
原材料名称 | 每天最多供应量 | 成本 (元/Kg) |
---|---|---|
1 | 100 | 65 |
2 | 100 | 25 |
3 | 60 | 35 |
分析问题,建立模型
> 1. 决策变量:
(1). 甲产品中原料一的部分,原料二的部分,原料三的部分
(2). 乙产品中原料一的部分,原料二的部分,原料三的部分
(3). 丙产品中原料一的部分,原料二的部分,原料三的部分
以上决策变量分别设为 x1, x2, x3; x4, x5, x5;x7, x8, x9 ;
2. 目标函数:
根据利润和成本的关系:
得出利润 = 50( x1 + x2 + x3 )+ 35( x4 + x5 + x6 ) + 25 ( x7 + x8 + x9)
-65( x1 + x4 + x7)- 25( x2 + x5 + x8 ) – 35( x3 + x6 + x9 )
= -15 x 1 + 25 x 2 + 15 x 3 – 30 x 4+10 x 5 - 0 x 6 – 40 x 7 + 0 x 8 - 10 x 9
3. 约束条件:
甲中原料比例限制
x1 >= ( x1 + x2 + x3 ) / 2
x2 <= ( x1 + x2 + x3 ) / 4
乙中原料比例限制
x4 >= ( x4 + x5 + x6 ) / 4
x5 <= ( x4 + x5 + x6 ) / 2
三种原料总量限制
x1 + x4 + x7 <= 100
x2 + x5 + x8 <= 100
x3 + x6 + x9 >= 60
常识限制
X1 >= 0 , x2 >= 0 , x3 >= 0…….x9 >= 0
4 . 线性规划模型:
Max z = -15x1 + 25x2 + 15x3–30x4 + 10x5 - 0x6–40x7 + 0x8 - 10x9
x1 >= ( x1 + x2 + x3 ) / 2
x2 <= ( x1 + x2 + x3 ) / 4
x4 >= ( x4 + x5 + x6 ) / 4
x5 <= ( x4 + x5 + x6 ) / 2
x1 + x4 + x7 <= 100
x2 + x5 + x8 <= 100
x3 + x6 + x9 >= 60
xi >= 0 , i from 1 : 9
5 . 模型求解:
f = [ 15 ; -25 ; -15 ; 30 ; -10 ; 0 ; 40 ; 0 ; 10 ] ;
A = [ -1 1 1 0 0 0 0 0 0 ;
-1 3 -1 0 0 0 0 0 0 ;
0 0 0 -3 1 1 0 0 0 ;
0 0 0 -1 1 -1 0 0 0 ;
1 0 0 1 0 0 1 0 0 ;
0 1 0 0 1 0 0 1 0 ;
0 0 1 0 0 1 0 0 1 ] ;
b = [ 0 ; 0 ; 0 ; 0 ; 100 ; 100 ; 60 ] ;
lb = [ 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ] ;
[ x , fval , exitflag , output , lambda ] = linprog ( f , A , b , [] , [] , lb ) ;
程序运行结果
变量 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 |
---|---|---|---|---|---|---|---|---|---|
取值 | 100 | 50.000 | 50.000 | 0 | 0 | 0 | 0 | 0 | 0 |
最佳方案:
fval = - 500.000
100 kg 原料一, 50kg 原料二,50kg 原料三用于生产甲, 其余原料不用于生产乙和丙,这样收益最大,每天 500 元。
更简便的思路
可以观察到, 产品丙售价才 25, <= 于每一种原料的成本, 所以说, 出售丙绝对不会赚钱, 所以最优解中, 和丙有关的项, 肯定都是 0, 这些项可以不考虑, 只考虑甲和乙的情况。模型中剔除 x7, x8, x9 , 只需要考虑其余变量。
Matlab 程序修改如下 :
f = [ 15 ; -25 ; -15 ; 30 ; -10 ; 0 ] ;
A = [ -1 1 1 0 0 0 ;
-1 3 -1 0 0 0 ;
0 0 0 -3 1 1 ;
0 0 0 -1 1 -1 ;
1 0 0 1 0 0 ;
0 1 0 0 1 0 ;
0 0 1 0 0 1 ] ;
b = [ 0 ; 0 ; 0 ; 0 ; 100 ; 100 ; 60 ] ;
lb = [ 0 ; 0 ; 0 ; 0 ; 0 ; 0 ] ;
[ x , fval , exitflag , output , lambda ] = linprog ( f , A , b , [] , [] , lb ) ;