例2.5
??为了生产的需求,某工厂的一条生产线需要每天24h不间断运转,但是每天不同时间段所需要的工人最低数量不同,如表。已知每名工人的连续工作时间为8h。则改工厂应该为该生产线配备多少名工人,才能保证生产线的正常运转?
班次 | 1 | 2 | 3 | 4 | 5 | 6 |
---|
时间段 | 0:00 ~ 4:00 | 4:00~ 8:00 | :800~ 12:00 | 12:00~ 16:00 | 16:00~ 20:00 | 20:00~ 24:00 | 工人数量 | 35 | 40 | 50 | 45 | 55 | 30 |
问题分析
??从降低经营成本的角度来看,为该生产线配备的工人数量越少,工厂所付出的工人薪资之和也就越低。因此,该问题需要确定在每个时间段工作的工人的数量,使其既能满足生产线的生产需求,又能使得雇佣的工人总数最低。
模型假设
(1)每名工人每24h只能工作8h; (2)每名工人只能在某个班次的初始时刻报道。
符号说明
??设
x
i
x_i
xi? 表示第
i
i
i 个班次报道的工人数量,
i
=
1
,
2
,
?
?
,
6
。
i = 1,2,\cdots, 6。
i=1,2,?,6。
模型建立
??该问题的目标函数为雇佣的工人总数最少。约束条件为安排在不同班次上班的工人应该不少于该班次所需的人数,且
x
i
(
i
=
1
,
2
,
?
?
,
6
)
x_i(i = 1,2, \cdots, 6)
xi?(i=1,2,?,6) 为非负整数。 ??数学模型为
min
?
z
=
∑
i
=
1
6
x
i
,
{
x
1
+
x
6
≥
35
,
x
1
+
x
2
≥
40
,
x
2
+
x
3
≥
50
,
x
3
+
x
4
≥
45
,
x
4
+
x
5
≥
55
,
x
5
+
x
6
≥
30
,
x
i
≥
0
且
为
整
数
,
i
=
1
,
2
,
?
?
,
6.
\min z = \sum_{i = 1}^6 x_i, \\ \begin{cases} &x_1 + x_6 \geq 35, \\ &x_1 + x_2 \geq 40, \\ & x_2 + x_3 \geq 50,\\ & x_3 + x_4 \geq 45,\\ & x_4 + x_5 \geq 55,\\ & x_5 + x_6 \geq 30,\\ & x_i \geq 0 \quad 且为整数, i = 1,2,\cdots,6. \end{cases}
minz=i=1∑6?xi?,?????????????????????????x1?+x6?≥35,x1?+x2?≥40,x2?+x3?≥50,x3?+x4?≥45,x4?+x5?≥55,x5?+x6?≥30,xi?≥0且为整数,i=1,2,?,6.? 求得的最优解为
x
1
=
35
,
x
2
=
5
,
x
3
=
45
,
x
4
=
0
,
x
5
=
55
,
x
6
=
0
,
或
x
1
=
35
,
x
2
=
5
,
x
3
=
45
,
x
4
=
25
,
x
5
=
30
,
x
6
=
0
,
x_1 = 35, \quad x_2 = 5, \quad x_3 = 45, \quad x_4 = 0, \quad x_5 = 55, \quad x_6 = 0, \\ 或 \\ x_1 = 35, \quad x_2 = 5, \quad x_3 = 45, \quad x_4 = 25, \quad x_5 = 30, \quad x_6 = 0,
x1?=35,x2?=5,x3?=45,x4?=0,x5?=55,x6?=0,或x1?=35,x2?=5,x3?=45,x4?=25,x5?=30,x6?=0, 目标函数的最优值为140,,即最少需要140人,才能保证生产线正常运转。
python程序
python用到了PuLP库,网址 https://coin-or.github.io/pulp/
from pulp import *
x = [35, 40, 50, 45, 55, 30]
indexs = [i for i in range(1, 7)]
prob = LpProblem("Beer_Distribution_Problem", LpMinimize)
vars = LpVariable.dicts("x", indexs, 0, None, LpInteger)
prob += lpSum(vars)
st = [
[1, 6],
[1, 2],
[2, 3],
[3, 4],
[4, 5],
[5, 6]
]
for index, num in enumerate(st):
prob += (
lpSum( [vars[i] for i in num] ) >= x[index]
)
prob.solve()
prob.writeLP("Model.lp")
print("Status:", LpStatus[prob.status])
for v in prob.variables():
print(v.name, "=", v.varValue)
print(value(prob.objective))
文件如图
matlab程序
clc,clear;
prob = optimproblem;
x = optimvar('x',6, 'Type','integer','LowerBound', 0);
prob.Objective = sum(x);
con = optimconstr(6);
a = [35, 40, 50, 45, 55, 30];
con(1) = x(1) + x(6) >= 35;
for i=1 : 5
con(i + 1) = x(i)+x(i+1) >= a(i+1);
end
prob.Constraints.con = con;
[sol, fval, flag] = solve(prob);
sol.x;
fval;
|