奶制品的生产销售计划一 (粗加工)
1 桶牛奶 { 12 h ⟶ 3 k g A 1 ⟶ 获利 24 元 / k g 8 h ⟶ 4 k g A 2 ⟶ 获利 16 元 / k g 1 \ \text{桶牛奶} \begin{cases} 12 \ \mathrm{h} \longrightarrow 3 \ \mathrm{kg} \ A_1 \longrightarrow \text { 获利 } 24 \text { 元} / \mathrm{kg}\\ 8 \ \mathrm{h} \longrightarrow 4 \ \mathrm{kg} \ A_2 \longrightarrow \text { 获利 } 16 \text { 元} / \mathrm{kg}\\ \end{cases} 1 桶牛奶{12 h⟶3 kg A1⟶ 获利 24 元/kg8 h⟶4 kg A2⟶ 获利 16 元/kg
每天 50 桶牛奶, 时间 480 h, 至多加工 100 kg A 1 A_1 A1.
- 制订生产计划, 使每天获利最大;
- 35 元可买到 1 桶牛奶, 买吗? 若买, 每天最多买多少?
- 可聘用临时工人,付出的工资最多是每小时几元?
- A 1 A_1 A1 的获利增加到 30 元/kg, 应否改变生产计划?
1. 制订生产计划, 使每天获利最大
设
x
1
x_1
x1 桶生产
A
1
A_1
A1,
x
2
x_2
x2 桶生产
A
2
A_2
A2, 建立线性规划模型
max
z
=
72
x
1
+
64
x
2
s
.
t
.
{
(
1
1
12
8
)
⋅
(
x
1
x
2
)
⩽
(
50
480
)
0
⩽
(
x
1
x
2
)
⩽
(
1000
3
+
∞
)
\begin{gathered} \max z=72 x_{1}+64 x_{2} \\ s.t. \begin{cases} \left( \begin{matrix} 1& 1\\ 12& 8\\ \end{matrix} \right) \cdot \left( \begin{array}{c} x_1\\ x_2\\ \end{array} \right) \leqslant \left( \begin{array}{c} 50\\ 480\\ \end{array} \right) \\ \mathbf{0} \leqslant \left( \begin{array}{c} x_1\\ x_2\\ \end{array} \right) \leqslant \left( \begin{array}{c} \frac{1000}{3}\\ + \infty \\ \end{array} \right) \end{cases} \end{gathered}
maxz=72x1+64x2s.t.⎩
⎨
⎧(11218)⋅(x1x2)⩽(50480)0⩽(x1x2)⩽(31000+∞)
用 scipy.optimize.linprog 函数求解
from scipy.optimize import linprog
c=[-72, -64] #目标向量
A=[[1, 1],[12, 8]]; b=[[50],[480]]
bound=((0,100/3.0),(0,None))
res=linprog(c,A,b,None,None,bound,method='simplex')
print('最优值:',res.fun)
print('最优解:',res.x)
最优值: -3360.0
最优解: [20. 30.]
即最优解为 x 1 = 20 , x 2 = 30 x_{1}=20, x_{2}=30 x1=20,x2=30, 最大收益为 3360 元
2. 35 元可买到 1 桶牛奶, 买吗? 若买, 每天最多买多少?
设买 x 3 x_3 x3 桶, 模型变为
max z = 72 x 1 + 64 x 2 − 35 x 3 s . t . { ( 1 1 − 1 12 8 0 ) ⋅ ( x 1 x 2 x 3 ) ⩽ ( 50 480 ) 0 ⩽ ( x 1 x 2 x 3 ) ⩽ ( 1000 3 + ∞ + ∞ ) \begin{gathered} \max z=72 x_{1}+64 x_{2}-35 x_3 \\ s.t. \begin{cases} \left( \begin{matrix} 1& 1& -1\\ 12& 8& 0\\ \end{matrix} \right) \cdot \left( \begin{array}{c} x_1\\ x_2\\ x_3\\ \end{array} \right) \leqslant \left( \begin{array}{c} 50\\ 480\\ \end{array} \right) \\ \mathbf{0} \leqslant \left( \begin{array}{c} x_1\\ x_2\\ x_3\\ \end{array} \right) \leqslant \left( \begin{array}{c} \frac{1000}{3}\\ + \infty \\ + \infty \\ \end{array} \right) \end{cases} \end{gathered} maxz=72x1+64x2−35x3s.t.⎩ ⎨ ⎧(11218−10)⋅ x1x2x3 ⩽(50480)0⩽ x1x2x3 ⩽ 31000+∞+∞
from scipy.optimize import linprog
c=[-72, -64, 35] #目标向量
A =[[1, 1, -1],[12, 8, 0]]; b=[[50],[480]]
bound=((0,100/3.0),(0,None),(0,None))
res=linprog(c,A,b,None,None,bound,method='simplex')
print('最优值:',res.fun)
print('最优解:',res.x)
最优值: -3490.0
最优解: [ 0. 60. 10.]
所以应该买 10 桶, 最大收益 3490 元
3. 可聘用临时工人,付出的工资最多是每小时几元?
计算间增加 1 单位的利润增长
from scipy.optimize import linprog
c=[-72, -64] #目标向量
A =[[1, 1],[12, 8]]
b1=[[50],[480]]
bound=((0,100/3.0),(0,None))
res1=linprog(c,A,b1,None,None,bound,method='simplex')
b2=[[50],[480+1]]
bound=((0,100/3.0),(0,None))
res2=linprog(c,A,b2,None,None,bound,method='simplex')
print(res1.fun-res2.fun)
2.0
即时间增加 1 单位, 利润增长 2 元, 所以聘用临时工人付出的工资最多每小时 2 元.
4. A 1 A_1 A1的获利增加到 30 元/kg, 应否改变生产计划?
将目标函数变为 max z = 90 x 1 + 64 x 2 \max z=90 x_{1}+64 x_{2} maxz=90x1+64x2 再次求解
from scipy.optimize import linprog
c=[-90, -64] #目标向量
A=[[1, 1],[12, 8]]; b=[[50],[480]]
bound=((0,100/3.0),(0,None))
res=linprog(c,A,b,None,None,bound,method='simplex')
print('最优值:',res.fun)
print('最优解:',res.x)
最优值: -3720.0
最优解: [20. 30.]
最优解仍为 x 1 = 20 x_{1}=20 x1=20, x 2 = 30 x_{2}=30 x2=30, 无需改变生产计划.
奶制品的生产销售计划二 (深加工)
1 桶牛奶 → { → 12 h 3 k g A 1 → { 获利 24 元 / k g → 1 k g , 2 h , 3 元 0.8 k g B 1 → 获利 44 元 / k g → 8 h 4 k g A 2 → { 获利 16 元 / k g → 1 k g , 2 h , 3 元 0.75 k g B 2 → 获利 32 元 / k g 1 \ \text{桶牛奶} \rightarrow \begin{cases} \xrightarrow{12 \ \mathrm{h}} 3 \ \mathrm{kg} \ A_1 \rightarrow \begin{cases} \text { 获利 } 24 \text {元} / \mathrm{kg}\\ \xrightarrow{1 \ \mathrm{kg}, \ 2 \ \mathrm{h}, \ 3 \text{元}}0.8 \ \mathrm{kg} \ {B}_{1} \rightarrow \text { 获利 } 44 \text { 元 } / \mathrm{kg} \end{cases} \\ \xrightarrow{8 \ \mathrm{h}} 4 \ \mathrm{kg} \ A_2 \rightarrow \begin{cases} \text { 获利 } 16 \text {元} / \mathrm{kg}\\ \xrightarrow{1 \ \mathrm{kg}, \ 2 \ \mathrm{h}, \ 3 \text{元}}0.75 \ \mathrm{kg} \ {B}_{2} \rightarrow \text { 获利 } 32 \text { 元 } / \mathrm{kg} \end{cases} \end{cases} 1 桶牛奶→⎩ ⎨ ⎧12 h3 kg A1→{ 获利 24元/kg1 kg, 2 h, 3元0.8 kg B1→ 获利 44 元 /kg8 h4 kg A2→{ 获利 16元/kg1 kg, 2 h, 3元0.75 kg B2→ 获利 32 元 /kg
每天 50 桶牛奶, 时间 480 h, 至多加工 100 kg A 1 A_1 A1.
- 制订生产计划, 使每天净利润最大;
- 30 元可增加 1 桶牛奶, 3 元可增加 1 h 时间, 应否投资?
- 现投资 150 元, 可赚回多少?
- B 1 , B 2 B_1, B_2 B1,B2 的获利经常有 10% 的波动, 对计划有无影响?
- 每天销售 10 kg A 1 A_1 A1 的合同必须满足, 对利润有什么影响?
1. 制订生产计划, 使每天净利润最大
设出售 x 1 kg A 1 , x 2 kg A 2 x_{1} \operatorname{kg} A_{1}, x_{2} \operatorname{kg} A_{2} x1kgA1,x2kgA2, x 3 kg B 1 , x 4 kg B 2 x_{3} \operatorname{kg} B_{1}, x_{4} \operatorname{kg} B_{2} x3kgB1,x4kgB2,. x 5 kg A 1 x_{5} \operatorname{kg} A_{1} x5kgA1 加工 B 1 B_{1} B1, x 6 kg A 2 x_{6} \operatorname{kg} A_{2} x6kgA2 加工 B 2 B_{2} B2
有 x 5 = x 3 0.8 \displaystyle{x_5=\frac{x_3}{0.8}} x5=0.8x3, x 6 = x 4 0.75 \displaystyle{x_6=\frac{x_4}{0.75}} x6=0.75x4
建立线性规划模型
max
z
=
24
x
1
+
16
x
2
+
44
x
3
+
32
x
4
−
3
x
5
−
3
x
6
s
.
t
.
{
x
1
+
x
5
3
+
x
2
+
x
6
4
≤
50
4
(
x
1
+
x
5
)
+
2
(
x
2
+
x
6
)
+
2
x
5
+
2
x
6
≤
480
x
1
+
x
5
≤
100
x
i
≥
0
\begin{gathered} \max \quad z=24 x_{1}+16 x_{2}+44 x_{3}+32 x_{4}-3 x_{5}-3 x_{6} \\ s.t. \begin{cases} \displaystyle{\frac{x_{1}+x_{5}}{3}+\frac{x_{2}+x_{6}}{4} \leq 50} \\ 4\left(x_{1}+x_{5}\right)+2\left(x_{2}+x_{6}\right)+2 x_{5}+2 x_{6} \leq 480\\ x_{1}+x_{5} \leq 100 \\ x_i \geq 0 \end{cases} \end{gathered}
maxz=24x1+16x2+44x3+32x4−3x5−3x6s.t.⎩
⎨
⎧3x1+x5+4x2+x6≤504(x1+x5)+2(x2+x6)+2x5+2x6≤480x1+x5≤100xi≥0
⟹
\Longrightarrow
⟹
max
z
=
24
x
1
+
16
x
2
+
161
4
x
3
+
28
x
4
s
.
t
.
{
(
1
3
1
4
5
12
1
3
4
2
15
2
16
3
1
0
5
4
0
)
(
x
1
x
2
x
3
x
4
)
⩾
(
50
480
100
)
(
x
1
x
2
x
3
x
4
)
⩾
0
\begin{gathered} \max \quad z=24 x_{1}+16 x_{2}+\displaystyle{\frac{161}{4}} x_{3}+28 x_{4} \\ s.t.\begin{cases} \left( \begin{matrix} \frac{1}{3}& \frac{1}{4}& \frac{5}{12}& \frac{1}{3}\\ 4& 2& \frac{15}{2}& \frac{16}{3}\\ 1& 0& \frac{5}{4}& 0\\ \end{matrix} \right) \left( \begin{array}{c} x_1\\ x_2\\ x_3\\ x_4\\ \end{array} \right) \geqslant \left( \begin{array}{c} 50\\ 480\\ 100\\ \end{array} \right) \\ \left( \begin{array}{c} x_1\\ x_2\\ x_3\\ x_4\\ \end{array} \right) \geqslant \mathbf{0} \end{cases} \end{gathered}
maxz=24x1+16x2+4161x3+28x4s.t.⎩
⎨
⎧
3141412012521545313160
x1x2x3x4
⩾
50480100
x1x2x3x4
⩾0
用 scipy.optimize.linprog 函数求解
from scipy.optimize import linprog
c=[-24, -16, -161/4, -28] #目标向量
A =[[1/3, 1/4, 5/12, 1/3],[4, 2, 15/2, 16/3],[1, 0, 5/4, 0]]
b=[[50],[480],[100]]
Lb=[0]*4; Ub=[None]*4
bound=tuple(zip(Lb, Ub))
res=linprog(c,A,b,None,None,bound,method='simplex')
print('最优值:',res.fun)
print('最优解:',res.x)
最优值: -3460.8
最优解: [ 0. 168. 19.2 0. ]
每天销售 168 kg A 2 A_2 A2 和 19.2 kg B 1 B_1 B1, 利润 3460.8 元
2. 30 元可增加 1 桶牛奶, 3 元可增加 1 h 时间, 应否投资?
# 增加牛奶
from scipy.optimize import linprog
c=[-24, -16, -161/4, -28] #目标向量
A =[[1/3, 1/4, 5/12, 1/3],[4, 2, 15/2, 16/3],[1, 0, 5/4, 0]]
b1=[[50],[480],[100]]
Lb=[0]*4; Ub=[None]*4
bound=tuple(zip(Lb, Ub))
res1=linprog(c,A,b1,None,None,bound,method='simplex')
b2=[[50+1],[480],[100]]
res2=linprog(c,A,b2,None,None,bound,method='simplex')
print(res1.fun-res2.fun)
37.91999999999962
即增加 1 桶牛奶使收益增长 37.92 元
# 增加时间
from scipy.optimize import linprog
c=[-24, -16, -161/4, -28] #目标向量
A =[[1/3, 1/4, 5/12, 1/3],[4, 2, 15/2, 16/3],[1, 0, 5/4, 0]]
b1=[[50],[480],[100]]
Lb=[0]*4; Ub=[None]*4
bound=tuple(zip(Lb, Ub))
res1=linprog(c,A,b1,None,None,bound,method='simplex')
b2=[[50],[480+1],[100]]
res2=linprog(c,A,b2,None,None,bound,method='simplex')
print(res1.fun-res2.fun)
3.2600000000002183
即增加 1 h 时间使收益增长 3.26 元
3. 现投资 150 元, 可赚回多少?
相同投资增加牛奶的收益 ( 37.92 30 = 1.264 \frac{37.92}{30}=1.264 3037.92=1.264) 大于增加时间的收益 ( 3.26 3 = 1.087 \frac{3.26}{3}=1.087 33.26=1.087), 所以投资 150 元增加 5 桶牛奶, 可赚回 189.6 元
4. B 1 , B 2 B_1, B_2 B1,B2 的获利经常有 10% 的波动, 对计划有无影响?
目标函数变为 max z = 24 x 1 + 16 x 2 + 44 ( 1 ± 0.1 ) x 3 + 32 ( 1 ± 0.1 ) x 4 − 3 x 5 − 3 x 6 \max \, z=24 x_{1}+16 x_{2}+44(1\pm 0.1) x_{3}+32(1\pm 0.1) x_{4}-3 x_{5}-3 x_{6} maxz=24x1+16x2+44(1±0.1)x3+32(1±0.1)x4−3x5−3x6, x 5 = x 3 0.8 \displaystyle{x_5=\frac{x_3}{0.8}} x5=0.8x3, x 6 = x 4 0.75 \displaystyle{x_6=\frac{x_4}{0.75}} x6=0.75x4, 分别求解
from scipy.optimize import linprog
c0=[-24, -16, -161/4, -28] #目标向量
A =[[1/3, 1/4, 5/12, 1/3],[4, 2, 15/2, 16/3],[1, 0, 5/4, 0]]
b=[[50],[480],[100]]
Lb=[0]*4; Ub=[None]*4
bound=tuple(zip(Lb, Ub))
res0=linprog(c0,A,b,None,None,bound,method='simplex')
# B1 增加 10%
c11=[-24, -16, -893/20, -28]
res11=linprog(c11,A,b,None,None,bound,method='simplex')
# B1 减少 10%
c12=[-24, -16, -717/20, -28]
res12=linprog(c12,A,b,None,None,bound,method='simplex')
# B2 增加 10%
c21=[-24, -16, -161/4, -156/5]
res21=linprog(c21,A,b,None,None,bound,method='simplex')
# B2 减少 10%
c22=[-24, -16, -161/4, -124/5]
res22=linprog(c22,A,b,None,None,bound,method='simplex')
print('原始方案',res0.x)
print('B1增加10%',res11.x)
print('B1减少10%',res12.x)
print('B2增加10%',res21.x)
print('B2减少10%',res22.x)
原始方案 [ 0. 168. 19.2 0. ]
B1增加10% [ 0. 168. 19.2 0. ]
B1减少10% [ 0. 160. 0. 30.]
B2增加10% [ 0. 160. 0. 30.]
B2减少10% [ 0. 168. 19.2 0. ]
B 1 B_1 B1 获利下降 10%, B 2 B_2 B2 获利上升 10%时对计划有影响, 所以浮动对计划有影响
5. 每天销售 10 kg A 1 A_1 A1 的合同必须满足, 对利润有什么影响?
增加约束条件 x 1 ≥ 10 x_1 \geq 10 x1≥10, 再次求解
from scipy.optimize import linprog
c=[-24, -16, -161/4, -28] #目标向量
A =[[1/3, 1/4, 5/12, 1/3],[4, 2, 15/2, 16/3],[1, 0, 5/4, 0]]
b=[[50],[480],[100]]
Lb0=[0]*4; Ub=[None]*4
Lb=[10,0,0,0]
bound0=tuple(zip(Lb0, Ub))
bound=tuple(zip(Lb, Ub))
res0=linprog(c,A,b,None,None,bound0,method='simplex')
res=linprog(c,A,b,None,None,bound,method='simplex')
print('最优值:',res.fun)
print('利润减少:',res0.fun-res.fun)
最优值: -3444.0
利润减少: -16.800000000000182
所以利润减少16元