数学建模社区-数学中国

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

作者: guarguar    时间: 2009-4-22 11:37
标题: 【讨论】新手求助:关于lingo的wrap函数
本帖最后由 厚积薄发 于 2010-1-26 21:10 编辑 % Z( M3 `) F- p% l$ z# p5 I# D9 H
* F1 j2 {) |# r' N
看到一个题:; U: O) N* o, l3 L( L
职员时序安排模型  4 q0 A3 L8 X4 |: N; ~( ?
一项工作一周 7 天都需要有人(比如**工作) ,每天(周一至周日)所需的最少职员数为 20、16、13、16、19、14 和 12,并要求每个职员一周连续工作 5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。
# i& t( I& _4 Vmodel: ' O& z0 m3 K" ?5 l  t5 x( S. ]
sets:
7 W# J# s3 B7 o1 E& N: F  days/mon..sun/: required,start;
4 U. s/ [; d* y+ e% o! Gendsets 1 m! s1 T/ u: [! l) ^
data:
6 Q2 @& x8 |3 @+ W  !每天所需的最少职员数; 2 [- B7 Z1 F: Z8 c+ K9 h
  required = 20 16 13 16 19 14 12;  ' \) D6 K( \( F1 ~0 Z& U) o
enddata
, E! P, A, N1 d' O3 m!最小化每周所需职员数; # O5 m+ S2 ^/ ?, }- }/ g: j% m% ^
  min=@sum(days: start);
- A" @( f' a* t0 A4 a! t  @for(days(J):
- z7 i, D7 F& m4 _: W    @sum(days(I) | I #le# 5:
! u$ N. B8 y& M; u      start(@wrap(J+I+2,7))) >= required(J));
% `9 M" Y  |2 p( k) s) q( oend
0 `  X/ n+ k, u3 ]. U4 y, o7 P4 X% M5 V) H3 J& ~
其中@sum(days(I) | I #le# 5: * c9 \/ y, c, D& s0 L
      start(@wrap(J+I+2,7))) >= required(J)); 是什么意思啊?我知道比如周一要排的人要从上个周四算起,但是不知道wrap中J+I+2和7各代表什么意思啊?还有这个函数怎么用啊?* m0 h, j+ w/ P) K& F" Z
请各位帮忙,谢谢了!
作者: 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 ) V/ L$ L3 |7 o( V7 @# ^# r. p* N
一个员工工作一天算一个工期. G9 O" `5 T. N  a+ M
所有的天数加起来:总工期
作者: 追梦者    时间: 2009-8-13 10:27
本帖最后由 追梦者 于 2009-8-13 10:37 编辑 7 e& I8 A" }6 B/ u# S
@wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~# K' n8 C! K+ o2 I. _& {
371568491 发表于 2009-4-22 22:35

, w# l- E. @6 c9 L小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit而不加1。
" l& G4 {- _) H5 P. [( {0 }& v( O' t. ~你可以运行下面的结论来看一看:, Z7 `, w4 r. x/ c0 R! i# s
这是原程序2 \9 H# J6 X* B/ T3 q
model:- y. @0 l/ u3 v
sets:
6 `: f  k) l" c  O  days/mon..sun/: required,start;
; w' a# Y, @* s" j* Lendsets
% n( j6 G4 m( ^* ]) Tdata:
& t* V7 i0 D% T2 s$ R: x  !每天所需的最少职员数;8 V% P+ I; O; k7 P& e" L
  required = 20 16 13 16 19 14 12;
# }/ O- H6 e! s/ m+ W. i/ \enddata
  n; Q: k! X1 v. R* {" ]!最小化每周所需职员数;
0 _4 x! i" j) H% R! ~  min=' t& q- d. F( n, L+ |# y2 h3 h% [
@sum(days:start);
! Q3 o4 |1 r* n5 q. \6 n  @for(days(J):& e4 C7 a" Y; x/ D% z
    @sum(days(I) | I #le# 5:+ b+ a1 r- [9 w9 {2 \
      start(@wrap(J+I+2,7))) >= required(J));
; j2 @1 j# `3 q  k!外国人的第一天是星期日;  l0 |/ t; a8 Y4 }
end4 E5 G8 t" I9 D3 |
将上面的程序中的集修改为
7 @, G5 X. t1 n. g0 n  r* Lsets:. _0 X, u# j, p1 E- A
days/1 2 3 4 5 6 0/: required,start;1 K: X6 l0 p6 d. N* _4 t: f
endsets
) C8 W+ x2 r% ]在运行效果一样,证明了我的结论。
作者: 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的值
2 m3 X! Y, A, g! \$ o我个人觉得也不是教程上说的加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。该函数在循环、多阶段计划编制中特别有用。
& W1 P; L+ `2 z; N% j( n! O, p3 S: ^6 M8 G! \) J
通俗的解释是:用来转换集合两端的索引,在集合的另一端继续索引。也就是说,在集合循环函数中,当达到集合的最后(或第一个)成员后,可以用@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.
" P- x+ q" y, E% i/ D; E. o+ V, f& ~$ f0 b
@for(days(J):
8 ?! D$ G) [1 h+ R8 g1 D    @sum(days(I) | I #le# 5:
' r9 K* @% ^  f, R6 b( U2 C      start(@wrap(J+I+2,7))) >= required(J));
% l( E2 f. ]# {8 Jday(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: ( A7 J: i3 e# {8 a0 E& e* v* [4 R8 |
sets:
! L$ U, p$ \, n" ?% u/ j5 E1 D' L1 fdays/mon..sun/: required,start; , d; Z1 H' c8 E) s! ?
endsets
! ]$ i1 j* V/ `( bdata:
& a- q- K3 N4 z: J5 H8 ~6 Q0 K!每天所需的最少职员数; ( U5 D8 l$ k- z, W) R% S' m$ u
required = 20 16 13 16 19 14 12;
! P" }3 \5 t# y( {% V) Denddata
* {3 K+ F! T: d7 C, C  z!最小化每周所需职员数; / Y" |% n: a( J& Q3 y
min=@sum(days: start); " B, c- l. K  T: B$ f0 E7 Y
@for(days(J): + N+ \# {2 s6 x1 L/ ?' t7 W. N
    @sum(days(I) | I #le# 5:
' [$ j  @! w3 e9 }* ]7 v; Z      start(@wrap(J+I+2,7))) >= required(J)); 3 Z4 Y9 K  }8 ?2 M6 {. O- f1 J
end0 q3 ^3 P( w8 g3 A

- Q; {8 R' `- s1 ]. Q解释下:' q3 ^* e/ b' L: K% m: }2 H
@for(days(J):
& k8 e+ j/ ~8 c    @sum(days(I) | I #le# 5: 1 J9 P$ f( n  b# R- z3 v" W! E
      start(@wrap(J+I+2,7))) >= required(J));; A5 a$ J2 T1 t6 c, P& I
+ i% ?8 C! p6 f+ Z8 ]7 A! C
当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的职员和,以此类推。. Q; L' ?% Y: M' P; L  A2 |
6 X3 L  S6 U( j7 y% G
网上有一种说法是,英美中星期表示的不同,中国将星期一看成第一天,而国外则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit再加1。将上面的程序中的集修改为2 w, U$ S& a  ]+ L- ?$ Q& s

6 Q$ K! f$ J  ^  Z4 c2 J1 H
  L# p8 X4 V% r$ ?6 Y  U- {5 tsets:0 |* G# z; S, Y. t) P
days/1 2 3 4 5 6 0/: required,start;
/ K% Q; V# Z; R( F& v, Fendsets
& j1 ?! [$ V- b0 P
2 _6 o$ |) ^- M- E2 z: {0 j+ K
作者: 刘振    时间: 2011-8-12 20:02
这个我也不懂,那位仁兄出来具体介绍一下
作者: 成城    时间: 2011-9-8 21:41
我就是再问啊
作者: cmd2.com电影    时间: 2011-11-30 03:35
挺好的,顶顶,新手还没有分呢,多回个贴
作者: ehi28    时间: 2011-12-18 10:41
嗯,不错,支持一下.
1 s( f; `4 b8 ~4 N
作者: 无聊2012    时间: 2012-4-9 23:44
刘振 发表于 2011-8-12 20:01 & q+ z+ m& `+ y3 c2 Y
model: / R( w( W1 |. d/ L% X! m
sets: + G9 r  l" ]& t- W/ }9 V
days/mon..sun/: required,start;
1 R0 s$ O% Z1 ?  |  c/ W/ w+ C
对一下做下调整,便于理解
& A! P7 A$ {/ I( P8 G
/ y6 q" b" N1 t( `' wmodel:
! c: P: W, V" J1 R0 s% ^sets: : q  L. A1 w6 `6 d! Z4 P4 P1 l# p3 g3 M0 ~
days/mon..sun/: required,start;
% v: h( O8 r. w7 X) Cendsets - h  W) ]$ D9 O5 I2 ~) H  K# G( d" F3 W! \  T) T
data:
/ P2 t; A( S0 Y' v$ ^" k!每天所需的最少职员数; 1 Y4 m6 j& m( P9 }5 ~( ]; j
required = 20 16 13 16 19 14 12; ; }: G' I5 C3 z! F( \' p" b! B5 C' d5 u' a% C% F
enddata   ]- t4 R' b. j  e9 q% Z3 ^! N  W6 `' a
!最小化每周所需职员数; . z4 K' V6 u5 \9 I. X% C0 \& H1 m3 K6 k4 ]8 y
min=@sum(days: start);
& a1 Q6 _  P/ D, i2 e* N' m@for(days(J): 7 F. P% M; k" y2 p
    @sum(
) k  @- Z, z4 z             days(I) | I #le# 5:
% O: @$ h% o$ a. C& c. N% J: V             start(@wrap(J+I+2,7))
5 F; N* ]1 u$ A- v             ) >= required(J));
1 y# N; E9 w' V+ ^end% o' ]! z! @/ O: |& @5 [
$ G  z7 v% I, _- w+ o

作者: ganquanlife    时间: 2013-1-30 19:56
追梦者 发表于 2009-8-13 10:27
* r/ c( G6 y! y1 U! |小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...
4 H& q7 b% X& p! t+ V' {, O: s
我也觉得不用+1啊,
作者: dirk190    时间: 2014-7-19 22:15
追梦者 发表于 2009-8-13 10:27 8 K, f% G/ h* \. \
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...

7 f& `5 A" N) O: e# u) B" Y换成1到7 结果相同的
作者: enqi999    时间: 2014-12-25 16:26
学习学习,看看+ n1 c& R% ?4 i3 r* K





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