不错,不错。。。
该函数返回j=index-k*limit,其中k 是一个整数,取适当值保证j 落在区间内。该函数相当于index 模limit 再加1。该函数在循环、多阶段计划编制中特别有用。
通俗的解释是:用来转换集合两端的索引,在集合的另一端继续索引。也就是说,在集合循环函数中,当达到集合的最后(或第一个)成员后,可以用@WRAP函数把索引转到集合的第一个(或最后一个)成员。在数学上@WRAP(I,N)的返回值当I位于区间内时返回I,否则返回J=I-N*K,K为整数,且J位于区间内。如@WRAP(3,10)返回值为3, @WRAP(35,10)返回值为5, @WRAP(40,8)返回值为8, @WRAP(9,7)返回值为2.
@for(days(J):
@sum(days(I) | I #le# 5:
start(@wrap(J+I+2,7))) >= required(J));
day(I)=1,2,3,4,5不变(因为每个人都要连续工作5天,这里的脚码表示取值的顺序,并不是返回值)。当day(J)为1时,由于7为循环周期,故@warp(J+I+2)返回的值是4,5,6,7,1的职员和;当day(J)为2时,@warp(J+I+2)返回的值是5,6,7,1,2的职员和,以此类推。
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
这个我也不懂,那位仁兄出来具体介绍一下
我就是再问啊
挺好的,顶顶,新手还没有分呢,多回个贴
嗯,不错,支持一下.
刘振 发表于 2011-8-12 20:01 static/image/common/back.gif
model:
sets:
days/mon..sun/: required,start;
对一下做下调整,便于理解
model:
sets: : q L. A1 w6 `6 d! Z
days/mon..sun/: required,start;
endsets - h W) ]$ D9 O5 I2 ~) H K
data:
!每天所需的最少职员数;
required = 20 16 13 16 19 14 12; ; }: G' I5 C3 z! F( \' p" b
enddata ]- t4 R' b. j e9 q% Z
!最小化每周所需职员数; . z4 K' V6 u5 \9 I. X% C0 \& H
min=@sum(days: start);
@for(days(J):
@sum(
days(I) | I #le# 5:
start(@wrap(J+I+2,7))
) >= required(J));
end
追梦者 发表于 2009-8-13 10:27 static/image/common/back.gif
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...
我也觉得不用+1啊,
追梦者 发表于 2009-8-13 10:27 static/image/common/back.gif
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...
换成1到7 结果相同的