guarguar 发表于 2009-4-22 11:37

【讨论】新手求助:关于lingo的wrap函数

本帖最后由 厚积薄发 于 2010-1-26 21:10 编辑

看到一个题:
职员时序安排模型  
一项工作一周 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

其中@sum(days(I) | I #le# 5:
      start(@wrap(J+I+2,7))) >= required(J)); 是什么意思啊?我知道比如周一要排的人要从上个周四算起,但是不知道wrap中J+I+2和7各代表什么意思啊?还有这个函数怎么用啊?
请各位帮忙,谢谢了!:)

buct 发表于 2009-4-22 12:31

这个函数比较难。。。。

371568491 发表于 2009-4-22 22:35

@wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~

xieducx7 发表于 2009-7-21 19:12

1# guarguar
一个员工工作一天算一个工期
所有的天数加起来:总工期

追梦者 发表于 2009-8-13 10:27

本帖最后由 追梦者 于 2009-8-13 10:37 编辑

@wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~
371568491 发表于 2009-4-22 22:35 http://www.madio.cn/mcm/images/common/back.gif
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit而不加1。
你可以运行下面的结论来看一看:
这是原程序
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
将上面的程序中的集修改为
sets:
days/1 2 3 4 5 6 0/: required,start;
endsets
在运行效果一样,证明了我的结论。

cuijingbing 发表于 2009-8-19 22:22

wrap函数是wrap(index,limit)让index+ k*limit以达到   返回值变成1-limit中的数

唐超超 发表于 2009-8-20 00:23

好东西!!谢谢!!

phylince 发表于 2009-9-1 21:59

就是1到limit,没有0了,0应该替换成Limit的值
我个人觉得也不是教程上说的加1

sqk20091 发表于 2010-1-20 15:32

运算了t=#wrap(5,7)返回的是5,并不加一

王子面_ 发表于 2010-7-29 16:07

今天看到了,同样很纠结的函数
页: [1] 2 3
查看完整版本: 【讨论】新手求助:关于lingo的wrap函数