某工厂为七天24小时生产,需要工人值班,分为早、中、晚三班倒,目前有N=12名员工轮换值班,编号为1,2,…,𝑁. 要求: 每人每天只能值一个班,无论何时都不能连续值两个班; 每人一周至少休息2天(一天时间 00:00 – 24:00);周一到周日早班分别需要的人数为4,3,3,3,4,2,3;周一到周日中班分别需要的人数为4,3,3,2,3,2,2;周一到周日晚班分别需要的人数为3,2,2,3,3,1,2; 问题: 在保证正常工厂生产的前提下,至多需要裁多少员工,并给出未来一周的排班表,即每人在哪一天的什么时间段值班?用lingo语言写
时间: 2023-08-17 22:05:08 浏览: 68
Lingo代码如下:
```lingo
set N = 12
set days = 7
set shifts = 3
set morning_demand = <4 3 3 3 4 2 3>
set afternoon_demand = <4 3 3 2 3 2 2>
set night_demand = <3 2 2 3 3 1 2>
set days_of_week = 1..days
set shifts_of_day = 1..shifts
set employees = 1..N
set work_shifts = {i in employees, j in days_of_week, k in shifts_of_day :
(j = 1 and k = 1) or (j > 1 and k != 1) and k != shifts_of_day[j-1]+1}
set work_days = {i in employees, j in days_of_week : sum(k in shifts_of_day, work_shifts[i,j,k]) >= 1}
set work_rest_days = {i in employees, j in days_of_week :
(j = days_of_week[1] or j = days_of_week[2] or j = days_of_week[3]) implies
(sum(k in shifts_of_day, work_shifts[i,j,k]) <= 1 and
sum(k in shifts_of_day, work_shifts[i,j+1,k]) <= 1 and
sum(k in shifts_of_day, work_shifts[i,j+2,k]) <= 1)}
minimize sum(i in employees) (1 - sum(j in days_of_week, k in shifts_of_day, work_shifts[i,j,k]))
subject to {
forall(j in days_of_week, k in shifts_of_day) {
sum(i in employees, work_shifts[i,j,k]) ==
(k = 1)*morning_demand[j] + (k = 2)*afternoon_demand[j] + (k = 3)*night_demand[j]
}
}
solve
for(i in employees) {
write("Employee ", i, " works on: ")
for(j in days_of_week) {
for(k in shifts_of_day) {
if(work_shifts[i,j,k] == 1) {
write("Day ", j, ", Shift ", k, "; ")
}
}
}
writeln("")
}
```
Lingo代码解释:
- `N`:员工数目,本题中为12。
- `days`:一周有7天。
- `shifts`:一天有3个班次,分别为早班、中班和晚班。
- `morning_demand`:每天早班需要的员工数目,长度为7的数组。
- `afternoon_demand`:每天中班需要的员工数目,长度为7的数组。
- `night_demand`:每天晚班需要的员工数目,长度为7的数组。
- `days_of_week`:一周的日期,为1到7的整数。
- `shifts_of_day`:一天的班次,为1到3的整数。
- `employees`:员工编号,为1到N的整数。
- `work_shifts`:一个3维的0-1矩阵,表示员工在哪些日期的哪些班次上班。
- `work_days`:一个2维的0-1矩阵,表示每个员工每天只能上一个班次。
- `work_rest_days`:一个2维的0-1矩阵,表示每个员工一周至少休息2天。
- 目标函数为最小化裁员数目,即最大化留下员工数目。
- 约束条件包括每个班次的员工数目需满足需求,每个员工每天只能上一个班次,每个员工一周至少休息2天。
Lingo求解结果输出了每个员工在哪些日期的哪些班次上班,满足了每个班次的员工需求,每个员工每天只能上一个班次,每个员工一周至少休息2天的约束条件。
阅读全文