数学建模社区-数学中国

标题: 【讨论】新手求助:关于lingo的wrap函数 [打印本页]

作者: guarguar    时间: 2009-4-22 11:37
标题: 【讨论】新手求助:关于lingo的wrap函数
本帖最后由 厚积薄发 于 2010-1-26 21:10 编辑 0 l- |5 m8 z  C5 q. @
6 J7 }* x) u/ u: _0 T& G
看到一个题:  i3 D7 v! [; d7 L
职员时序安排模型  
% i" c2 `* L, v* |3 O一项工作一周 7 天都需要有人(比如**工作) ,每天(周一至周日)所需的最少职员数为 20、16、13、16、19、14 和 12,并要求每个职员一周连续工作 5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。
2 E: u5 e* W* E% E* Emodel: 1 w$ y' {) n/ S  P
sets:
$ O3 t( |, G" d  ?- o+ v/ n. C3 r  days/mon..sun/: required,start; 0 P; `: U# A3 m  y% w) H+ x$ Z
endsets 3 V* m) {, g3 d& r6 U) s" N/ Q
data:
. b0 {' }! D9 z- ]0 y9 X& {* r7 K# ^  !每天所需的最少职员数; % m/ X) I# U4 s' r& Z
  required = 20 16 13 16 19 14 12;  / _& B; W5 }: Y! k
enddata
5 K7 A! O1 r" W!最小化每周所需职员数; " o' V7 X9 c/ r/ Y) k( q/ o, b
  min=@sum(days: start);
- X0 z7 \; H7 J2 g# X  @for(days(J):   ?& [5 y$ d- ~
    @sum(days(I) | I #le# 5:
7 f0 L# p- L, j. M: M$ _* \1 o      start(@wrap(J+I+2,7))) >= required(J)); ' Q7 f7 q  |: ?- N; I" Y4 @
end
6 b* H' ~) A4 l% C+ r* m6 x# p6 |9 s& ?. }8 w- j
其中@sum(days(I) | I #le# 5:   h" u8 j$ X( v2 f0 T
      start(@wrap(J+I+2,7))) >= required(J)); 是什么意思啊?我知道比如周一要排的人要从上个周四算起,但是不知道wrap中J+I+2和7各代表什么意思啊?还有这个函数怎么用啊?/ @+ @7 M9 o4 i  A% e
请各位帮忙,谢谢了!
作者: 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
5 D/ {4 C" E8 q- v一个员工工作一天算一个工期
3 o! N; ~% o& Y- c8 K所有的天数加起来:总工期
作者: 追梦者    时间: 2009-8-13 10:27
本帖最后由 追梦者 于 2009-8-13 10:37 编辑 5 E& @3 }/ a) b1 H7 ]$ N" w- V. }
@wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~2 F1 u7 j6 b, Q5 ^' Q# i' x
371568491 发表于 2009-4-22 22:35
( l" L0 L+ ]% w4 T) m
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit而不加1。
- K/ n2 |4 b! Q. P你可以运行下面的结论来看一看:
) F: M$ S4 E- ?1 R5 S! x7 K8 ^这是原程序% P5 O; S5 K  a* `2 h# o
model:
2 s. f8 M3 e4 Nsets:" Z5 `$ s: S% B6 o' m
  days/mon..sun/: required,start;. V4 C* n+ Z: m' M( D% F
endsets  @: C! ]0 n3 b( A+ p% l
data:
( B" s; v3 e7 O( q  !每天所需的最少职员数;% Y4 c7 N- R; N* e7 S
  required = 20 16 13 16 19 14 12;
! E5 f' j' Y$ [5 G* H5 j) H. G1 J. \% penddata) G) P' h# m6 B6 ]- w6 n
!最小化每周所需职员数;
( o. g. d* A$ {; J2 D$ Y  min=
' C/ V  _( M1 d0 r, Z6 `@sum(days:start);5 f4 k; c! E5 l7 Q; q+ |  H3 g4 H. M( [
  @for(days(J):& i1 b# s) ?3 j" l. N8 L! i
    @sum(days(I) | I #le# 5:
9 I# Q( e' |2 Q) [      start(@wrap(J+I+2,7))) >= required(J));
, h5 h9 U0 k" w, I4 n& }! L!外国人的第一天是星期日;
  n3 Z, ~7 f0 n# |% Qend
$ i0 J1 F3 u; y8 W5 J将上面的程序中的集修改为 ; A8 F( z0 a1 I7 j" M& o+ H: ~
sets:1 j3 _, Y( N* V$ U& d2 ^! A( ~
days/1 2 3 4 5 6 0/: required,start;& K. s& M8 q6 i% H) P8 n
endsets
" M% V; n2 m& ~) {在运行效果一样,证明了我的结论。
作者: 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的值' ~$ v$ a: u. n& d2 ?
我个人觉得也不是教程上说的加1
作者: sqk20091    时间: 2010-1-20 15:32
运算了t=#wrap(5,7)返回的是5,并不加一
作者: 王子面_    时间: 2010-7-29 16:07
今天看到了,同样很纠结的函数
作者: Super_xu    时间: 2011-7-2 10:31
不错,不错。。。
作者: 吴楚    时间: 2011-8-4 17:54
该函数返回j=index-k*limit,其中k 是一个整数,取适当值保证j 落在区间[1,limit]内。该函数相当于index 模limit 再加1。该函数在循环、多阶段计划编制中特别有用。8 Z1 B) h) j* x1 o
. ]1 \  b" |! i  q8 B( q3 _# q6 Y
通俗的解释是:用来转换集合两端的索引,在集合的另一端继续索引。也就是说,在集合循环函数中,当达到集合的最后(或第一个)成员后,可以用@WRAP函数把索引转到集合的第一个(或最后一个)成员。在数学上@WRAP(I,N)的返回值当I位于区间[1,N]内时返回I,否则返回J=I-N*K,K为整数,且J位于区间[I,N]内。如@WRAP(3,10)返回值为3, @WRAP(35,10)返回值为5, @WRAP(40,8)返回值为8, @WRAP(9,7)返回值为2.
0 b0 m, m: y' b4 {1 W: r) g
+ ?/ S9 r) f3 w( _1 k( s@for(days(J):
6 A6 ^8 M, b* t    @sum(days(I) | I #le# 5:
$ m3 B: O$ o7 F& c( v      start(@wrap(J+I+2,7))) >= required(J));
, o; h: d' v. J5 Rday(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的职员和,以此类推。
作者: 刘振    时间: 2011-8-12 20:01
model: , B( c4 {' h/ z* w3 [
sets: 7 N* a' f; [/ ~3 @/ Y
days/mon..sun/: required,start; ; q; J+ e0 j7 k
endsets
  j. d, I" O8 U# ndata: 5 ~+ o, b" B% F+ e
!每天所需的最少职员数;
4 Q* R' x8 z, y" S% O: K6 e+ Rrequired = 20 16 13 16 19 14 12;
( c/ Y) K' ~" `$ Oenddata 8 I0 h* \7 K# |$ N6 X- {2 d
!最小化每周所需职员数;
0 h) [0 J& Y% \! ^  lmin=@sum(days: start); 3 ]1 ^3 ~( y6 L
@for(days(J):
( _3 g/ [# ]/ {0 A5 U  f    @sum(days(I) | I #le# 5: 3 I# r" L$ l5 l% W) C
      start(@wrap(J+I+2,7))) >= required(J)); 1 @7 g! d& Y7 \8 K+ P( H
end2 }9 d1 [( e4 M4 X

+ j+ v& S8 ?. C1 D  @9 ?解释下:  q: {. b; k% U' W( A% {* g" R
@for(days(J):
9 R+ R+ X# o8 [# h( |* i    @sum(days(I) | I #le# 5:   L# g* S! C# d; C* W# X( Z' ^
      start(@wrap(J+I+2,7))) >= required(J));
; Q1 m; O; r3 x8 W" ]  d* y' R: r) F$ F; t; `
当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的职员和,以此类推。, I- m/ Q, D! ~9 C( B

9 ?6 i2 f9 y7 C* Y" _$ }网上有一种说法是,英美中星期表示的不同,中国将星期一看成第一天,而国外则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit再加1。将上面的程序中的集修改为& H# @# l1 F4 m$ n. P

/ }4 s" D9 H. u/ ]+ k- h6 X& D4 P8 c4 }! R) r- q
sets:, O; n9 X0 X3 J
days/1 2 3 4 5 6 0/: required,start;- r; S7 y0 q/ q: B
endsets3 _  c. W& G. i' ?' j. p5 h4 N# ]
- O2 `( z  P- W5 \. u

作者: 刘振    时间: 2011-8-12 20:02
这个我也不懂,那位仁兄出来具体介绍一下
作者: 成城    时间: 2011-9-8 21:41
我就是再问啊
作者: cmd2.com电影    时间: 2011-11-30 03:35
挺好的,顶顶,新手还没有分呢,多回个贴
作者: ehi28    时间: 2011-12-18 10:41
嗯,不错,支持一下.3 `  @7 M! @$ O7 x

作者: 无聊2012    时间: 2012-4-9 23:44
刘振 发表于 2011-8-12 20:01
( `, `0 V% s* i- Zmodel:
8 k3 g& W- @1 |7 n( f% `, t. hsets:
( n6 T' v" W1 ndays/mon..sun/: required,start;
/ c, X3 {! L& B. o" V
对一下做下调整,便于理解, C  z( e1 q) t; P7 E' [* z9 A8 y0 R

7 l& a+ _( j+ w2 Q! @model:
- P" s# D0 @# D1 f/ `6 jsets: : q  L. A1 w6 `6 d! Z/ s/ q- B9 h* x4 \  _, V
days/mon..sun/: required,start;
, T3 I  Z' x, s9 a+ mendsets - h  W) ]$ D9 O5 I2 ~) H  K5 a0 u; C7 w4 @# p+ d
data:
0 M; Y  {; p, d7 S!每天所需的最少职员数; ; N" F7 L6 @5 M3 e3 d; h1 W
required = 20 16 13 16 19 14 12; ; }: G' I5 C3 z! F( \' p" b
8 _' R) B, a$ T! D4 S3 n enddata   ]- t4 R' b. j  e9 q% Z
+ |5 S: A( r6 {3 G$ Y0 r !最小化每周所需职员数; . z4 K' V6 u5 \9 I. X% C0 \& H
, f3 F0 T4 g8 g3 c# f- k' e min=@sum(days: start);
9 Z% G( Z  N5 i& K+ K@for(days(J):
6 i! A( g) L! J, G1 N+ U( S; }    @sum(
" z  B5 U; z) S) \0 G             days(I) | I #le# 5: 1 c* V' {- E6 q9 Y9 ?2 u* }
             start(@wrap(J+I+2,7))
& e' j* u* C5 A' J) k& L3 ], N             ) >= required(J));
  f7 t4 R+ l2 L* k3 H5 gend
. ~4 y. B$ P6 a: S/ d $ [$ q( K7 u$ I" E. p% X

作者: ganquanlife    时间: 2013-1-30 19:56
追梦者 发表于 2009-8-13 10:27 , X1 w5 v1 a$ T2 O1 V- H
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...

; H* ~4 _/ [# z1 I我也觉得不用+1啊,
作者: dirk190    时间: 2014-7-19 22:15
追梦者 发表于 2009-8-13 10:27
+ U0 l  M/ Q/ u. g小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...
8 V, N6 p. f( ]6 M2 X
换成1到7 结果相同的
作者: enqi999    时间: 2014-12-25 16:26
学习学习,看看1 f7 I$ \1 H) L6 R8 v# t





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5