题目:
某大学计算机实验室聘用4名大学生(代号1、2、3、4)和2名研究生(代号5、6)值班答疑。已知每人从周一至周五每天最多可安排的值班时间及每人每h值班报酬如下表所示:
学生代号 | 报酬(元/h) | 每人最多可安排的值班时间 | ||||
周一 | 周二 | 周三 | 周四 | 周五 | ||
1 | 10.0 | 6 | 0 | 6 | 0 | 7 |
2 | 10.0 | 0 | 6 | 0 | 6 | 0 |
3 | 9.9 | 4 | 8 | 3 | 0 | 5 |
4 | 9.8 | 5 | 5 | 6 | 0 | 4 |
5 | 10.8 | 3 | 0 | 4 | 8 | 0 |
6 | 11.3 | 0 | 6 | 0 | 6 | 3 |
该实验室开放时间为上午8:00至晚上10:00,开放时间内须有且仅须有一名学生值班。规定大学生每周值班不少于8h,研究生每周值班不少于7h,每名学生每周值班不超过3次,每次值班不少于2h,每天安排值班的学生不超过3人,且其中必须有一名研究生。施为该实验室安排一张人员值班表,使总支付的报酬为最少。
model:
!大学生值班问题;
sets:
students1/stu1..stu4/:;
students2/stu5,stu6/:;
students/stu1..stu6/:;
weeks/w1..w5/:;
sw(students,weeks):c,times,yi,ai;
endsets
!目标函数;
min=@sum(sw: c*times);
!约束条件;
!不超过可安排时间;
@for(weeks(J):@for(students(I):times(I,J)>=2*yi(I,J)));
@for(weeks(J):@for(students(I):times(I,J)<=ai(I,J)*yi(I,J)));
!大学生每周值班不少于8h;
@for(students1(I):@sum(weeks(J):times(I,J))>=8);
!研究生每周值班不少于7h;
@sum(weeks(J):times(5,J))>=7; @sum(weeks(J):times(6,J))>=7;
!实验室每天开放14h;
@for(weeks(J):@sum(students(I):times(I,J))=14);
!每名学生一周值班不超过3次;
@for(students(I):@sum(weeks(J):yi(I,J))<=3);
!每天值班不超过3人;
@for(weeks(J):@sum(students(I):yi(I,J))<=3);
!每天有一名研究生值班;
@for(weeks(J):yi(5,J)+yi(6,J)>=1);
!非零约束;
@for(weeks(J):@for(students(I):times(I,J)>=0));
!0-1变量;
@for(sw:@bin(yi));
data:
c=10 10 10 10 10
10 10 10 10 10
9.9 9.9 9.9 9.9 9.9
9.8 9.8 9.8 9.8 9.8
10.8 10.8 10.8 10.8 10.8
11.3 11.3 11.3 11.3 11.3;
ai=6 0 6 0 7
0 6 0 6 0
4 8 3 0 5
5 5 6 0 4
3 0 4 8 0
0 6 0 6 3;
enddata
end
最终结果:
学生代号 | 报酬(元/h) | 每人最多可安排的值班时间 | ||||
周一 | 周二 | 周三 | 周四 | 周五 | ||
1 | 10.0 | 6 |
| 6 |
| 7 |
2 | 10.0 |
| 4 |
| 6 |
|
3 | 9.9 |
| 8 |
|
| 5 |
4 | 9.8 | 5 |
| 6 |
|
|
5 | 10.8 | 3 |
| 2 | 5 |
|
6 | 11.3 | 0 | 2 |
| 3 | 2 |