【讨论】新手求助:关于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各代表什么意思啊?还有这个函数怎么用啊?
请各位帮忙,谢谢了!:) 这个函数比较难。。。。 @wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~ 1# guarguar
一个员工工作一天算一个工期
所有的天数加起来:总工期 本帖最后由 追梦者 于 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
在运行效果一样,证明了我的结论。 wrap函数是wrap(index,limit)让index+ k*limit以达到 返回值变成1-limit中的数 好东西!!谢谢!! 就是1到limit,没有0了,0应该替换成Limit的值
我个人觉得也不是教程上说的加1 运算了t=#wrap(5,7)返回的是5,并不加一 今天看到了,同样很纠结的函数