lingo中@wrap的用法

来源:互联网 发布:网络售后 编辑:程序博客网 时间:2024/06/04 23:20

在这里纠正下网上部分的理解错误。

 

lingo中的一道经典例题:职员时序安排模型 
一项工作一周7天都需要有人(比如护士工作),每天(周一至周日)所需的最少职员数为20、16、13、16、19、14和12,并要求每个职员一周连续工作5天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。

 

model:
sets:
  days/mon..sun/: required,start;
endsets
data:
  !每天所需的最少职员数;
  required = 20 16 13 16 19 14 12;
enddata
!最小化每周所需职员数;
  min=@sum(days: start);
  @for(days(J):
    @sum(days(I) | I #le# 5:
      start(@wrap(J+I+2,7))) >= required(J));
end

 

解释下:
  @for(days(J):
    @sum(days(I) | I #le# 5:
      start(@wrap(J+I+2,7))) >= required(J));

当day(J)为1时,day(I)=1,2,3,4,5.由于7为循环周期,故@warp(J+I+2)返回的值是4,5,6,7,1的职员和.当day(J)为2时,@warp(J+I+2)返回的值是5,6,7,1,2的职员和,以此类推。

 

网上有一种说法是,英美中星期表示的不同,中国将星期一看成第一天,而国外则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit再加1。将上面的程序中的集修改为


sets:
days/1 2 3 4 5 6 0/: required,start;
endsets

 

在运行效果一样。详见
http://www.madio.net/mcm/redirect.php?fid=495&tid=43018&goto=nextoldset

 

 

我本人的理解是@wrap(index,limit)的用法就是index模limit再加1。其中的1并不是代表的星期一是否为第一天,假如真的像上述说法似地@wrap函数只能用在周数的问题了。0,1代表的是逻辑函数,1就是进行循环周期,0代表不循环周期。上述程序中的循环周期可以是1 2 3 4 5 6 0,可以是1 2 3 4 5 6 7,也可以是2 7 9 5 8 0 1,只要是七位数字即可,运行的效果完全一样。