简介
练习
question
有一个护士工作站点,每天(周一至周日)所需最少职员数量20,16,13,16,19,14,和12,并要求每个职员一周连续工作5天,试求每周所需最少职员数,并给出安排。
code
model:
sets:
days/mon..sun/:r,x;
indexs/1..5/:index;
endsets
data:
r=20 16 13 16 19 14 12; ! 每天所需的最少的职员数量;
enddata
min=@sum(days: x); !最小化每周所需要的的职员数量;
@for(days(i):@sum(indexs(j):x(@wrap(i-j+1, 7))) >= r(i));
@for(days:@gin(x));!约束x为整数变量;
end
answer
X( MON) 8.000000 1.000000
X( TUE) 2.000000 1.000000
X( WED) 0.000000 1.000000
X( THU) 6.000000 1.000000
X( FRI) 3.000000 1.000000
X( SAT) 3.000000 1.000000
X( SUN) 0.000000 1.000000
自问自答环节~~
wrap的使用方式?
wrap(i-j+1, 7) 返回 1 - 7 之间的内容, 比如, i = 1, j = 4, i - j + 1 = -2 --> 5 就像一个环
校验结果
MON 安排了8个人,往前再倒推4天就是MON上班的人数
8 + 0 + 3 + 3 + 6 = 20 >= 20; bingo
TWO 安排了2个人,往前在倒推4天就是TWO上班的人数
2 + 8 + 0 + 3 + 3 = 22 >= 16; bingo
再校验一个结果
SUN 安排了0个人,往前再倒推4天就是SUN上班的人数
0 + 3 + 3 + 6 + 0 >=12; bingo
---------------------------我的天空里没有太阳,总是黑夜,但并不暗,因为有东西代替了太阳。虽然没有太阳那么明亮,但对我来说已经足够。凭借着这份光,我便能把黑夜当成白天。我从来就没有太阳,所以不怕失去。
--------《白夜行》