数学建模社区-数学中国

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

作者: guarguar    时间: 2009-4-22 11:37
标题: 【讨论】新手求助:关于lingo的wrap函数
本帖最后由 厚积薄发 于 2010-1-26 21:10 编辑 6 r+ J0 ^" u( j) _  K6 L9 Z( t
+ {  V' v4 T4 g% l6 z7 z
看到一个题:$ j6 C$ M, p. C6 s+ y
职员时序安排模型  
# N& X+ P( X$ o# J. T7 r+ J( ?一项工作一周 7 天都需要有人(比如**工作) ,每天(周一至周日)所需的最少职员数为 20、16、13、16、19、14 和 12,并要求每个职员一周连续工作 5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。 0 x. i" ?7 r; ?. y. }
model:
; O8 H. I6 @* |/ ]# ]sets: 6 g! R& ]: H% H7 |$ \6 R4 Y
  days/mon..sun/: required,start;
0 D5 i( W% L, n- h8 Kendsets
. J( n0 t: b: a" f1 tdata: - Z% ^# [/ P6 y6 ?+ n
  !每天所需的最少职员数;
3 X3 c3 n* h- ]  required = 20 16 13 16 19 14 12;  
+ g! T- ^8 s8 d) a2 O5 Fenddata
0 c1 m% ]' _; ]  G- @- u3 q) ~; S!最小化每周所需职员数;
& V, g$ N! ]; w0 P4 c  min=@sum(days: start); 8 P9 W# C7 N( W- Q! v& W
  @for(days(J): % m, p$ q1 N; o/ O7 Q1 L
    @sum(days(I) | I #le# 5: 3 u5 o$ ]+ ]" s( u0 v
      start(@wrap(J+I+2,7))) >= required(J)); 5 a# }. h! Q: y, p* k6 r
end
8 l  ~1 O; @# X8 L* j+ h( Q5 M. N1 W6 L$ i
其中@sum(days(I) | I #le# 5: 6 }8 p% Y% P3 S; L$ Z
      start(@wrap(J+I+2,7))) >= required(J)); 是什么意思啊?我知道比如周一要排的人要从上个周四算起,但是不知道wrap中J+I+2和7各代表什么意思啊?还有这个函数怎么用啊?6 k$ Z2 |. l" G- J4 L
请各位帮忙,谢谢了!
作者: 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 % J0 o2 P% x/ T
一个员工工作一天算一个工期- j0 s: g3 H* S! ]
所有的天数加起来:总工期
作者: 追梦者    时间: 2009-8-13 10:27
本帖最后由 追梦者 于 2009-8-13 10:37 编辑 ' Q0 j' F7 q  h' ?/ c; E8 B
@wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~
3 b" f: \. W( m& }* l' e% X371568491 发表于 2009-4-22 22:35
$ p; w* ~+ S2 s$ m. ~
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit而不加1。
- Y1 T/ I0 W" v& w" I! h% x你可以运行下面的结论来看一看:
9 Z8 j1 m0 Y4 [$ U+ n2 {这是原程序% M  ?; |- f5 v( t3 t* ~
model:1 u  {* I. W3 Q1 H+ n# ~
sets:
; _7 F- E# V1 ?2 O& `  days/mon..sun/: required,start;# s) X% u' w, S) ?6 r7 z& j& V
endsets
# ]0 J3 o- w  L" _$ z, X$ Edata:. d- b) G* n. }2 T$ N, x# I9 h3 _" h
  !每天所需的最少职员数;
' ^0 V; y5 k7 Z. k! b( \  required = 20 16 13 16 19 14 12;
* ~! J" b5 g9 Yenddata
& T! W1 m0 t- ~( t6 {+ N!最小化每周所需职员数;2 p, s8 D' i5 M
  min=
- o5 g+ r/ m& H) t@sum(days:start);
# P* v; }9 L3 Q* q6 }  @for(days(J):. P: r3 m+ c/ p5 W. M
    @sum(days(I) | I #le# 5:
2 o$ k/ P. L& O- W% s$ n      start(@wrap(J+I+2,7))) >= required(J));
  ~: w0 ?- O, q6 t8 w!外国人的第一天是星期日;) w- g! M- s$ C+ X3 R: {, D7 l+ y9 g' B$ a
end* h0 a- b+ [, f7 Y6 o2 U5 y  _# A
将上面的程序中的集修改为
* }3 `' h* }: p# v, _, isets:
9 z8 X. m% t. L& e; f9 t! ]days/1 2 3 4 5 6 0/: required,start;9 d4 W8 \/ a/ G, A4 ~
endsets$ X% V: u, \8 E. @  i/ X
在运行效果一样,证明了我的结论。
作者: 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的值% t% K! Q8 C, e/ x
我个人觉得也不是教程上说的加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。该函数在循环、多阶段计划编制中特别有用。' m9 y+ X/ f* _: a: w
9 {5 ^  d; K% D6 J, f0 u
通俗的解释是:用来转换集合两端的索引,在集合的另一端继续索引。也就是说,在集合循环函数中,当达到集合的最后(或第一个)成员后,可以用@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.
: H6 M: a4 Z" f. I) m: |
' M. ?  d8 C! r3 P( w@for(days(J): % i9 G7 z. T2 L  G8 R; ~3 H
    @sum(days(I) | I #le# 5: ' Q1 l" b- m* m5 c; i4 e9 z
      start(@wrap(J+I+2,7))) >= required(J));
1 r/ Z+ @% p" J, eday(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:
7 o" s# w1 M% N  Ksets:
! \1 Y4 C; ^9 f( o. g8 H! l! _days/mon..sun/: required,start;
7 j& f3 `* ~9 ?; v* H# Sendsets
6 ~( u5 F  x& ]data:
2 Z" e: C' `8 o5 y* q! j!每天所需的最少职员数; 8 @% @; p7 M0 b( W
required = 20 16 13 16 19 14 12;
& ]) o& o" o3 H2 @  Jenddata 8 D7 [4 E$ v. j+ ~
!最小化每周所需职员数;
1 P8 o" s0 S, s9 x6 e$ n0 gmin=@sum(days: start); 8 W& r1 ~+ ~: |2 d
@for(days(J): 5 n" a9 V8 |. ~) X+ w* B
    @sum(days(I) | I #le# 5: : Y" m/ Y4 w) E8 V! U
      start(@wrap(J+I+2,7))) >= required(J)); 1 A* d2 Z% K4 z1 r# _
end
$ l: j; B, L, L8 a6 L( K% }1 }) r0 `# U' n& }2 q& \
解释下:/ s5 P+ ~  t4 \  }5 S/ }: N
@for(days(J):
# a8 ]* g1 |1 G; R$ h    @sum(days(I) | I #le# 5: . m  U' F" s9 E% E  d% b
      start(@wrap(J+I+2,7))) >= required(J));" V/ l) z+ M* u5 Z# T% v

' |, j4 h$ u& a) E% R当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的职员和,以此类推。8 L5 g: ?, O1 W( n+ u) A

9 W6 ^/ R0 p3 {9 Q网上有一种说法是,英美中星期表示的不同,中国将星期一看成第一天,而国外则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit再加1。将上面的程序中的集修改为, l4 y( k( s' f& Y0 a, R) o

; u2 M8 H2 F/ {5 E& U3 t: U; V
- O8 V- o/ f  t2 \sets:" ?- @  x3 p7 ~* `) n
days/1 2 3 4 5 6 0/: required,start;
: z! r) S0 Z% _0 b7 B" D. n, i1 rendsets
% h, V0 U6 n: X7 N1 D& Y2 }9 ]& V1 C

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

作者: 无聊2012    时间: 2012-4-9 23:44
刘振 发表于 2011-8-12 20:01
/ K% d( ~0 {* Mmodel:
, J. K! `9 s$ b% b+ c5 I7 F; Msets: : E) i1 e5 h' |4 a/ W2 y7 ]
days/mon..sun/: required,start;
( g" F+ R' m/ u4 r) o
对一下做下调整,便于理解
8 a& M% u/ B  K0 j; v
1 L/ T9 H) u8 U  u  E+ gmodel:
: ~+ h5 a* W8 z  v9 S0 [sets: : q  L. A1 w6 `6 d! Z' T5 h8 b( o: }9 C5 C) e; v9 u8 H+ U0 X
days/mon..sun/: required,start; 9 L& D+ U  P/ B# A
endsets - h  W) ]$ D9 O5 I2 ~) H  K
$ u! N  ^/ H# Q( }8 c, R- w data: . {6 R! t1 V" [6 v4 V
!每天所需的最少职员数;
7 N; O- q+ x8 i- qrequired = 20 16 13 16 19 14 12; ; }: G' I5 C3 z! F( \' p" b. T! [0 k3 k7 ?
enddata   ]- t4 R' b. j  e9 q% Z
+ n5 _8 P% s& _4 R. I% j !最小化每周所需职员数; . z4 K' V6 u5 \9 I. X% C0 \& H
& \' y6 u& N1 m min=@sum(days: start);
; k2 Z6 K" x/ ?@for(days(J): + b8 R+ `+ ]$ B4 W' x
    @sum(
2 [2 L+ B* W1 O, v             days(I) | I #le# 5:
8 p3 n- ?- A( R( O             start(@wrap(J+I+2,7))
7 P% Q) D1 N: y0 \             ) >= required(J));
' T! T- f* E, A; Oend
5 I* p: y; j& K7 B7 K 8 \# S: `7 o2 U8 W

作者: ganquanlife    时间: 2013-1-30 19:56
追梦者 发表于 2009-8-13 10:27
& q6 p, |5 s6 b8 K; k小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...
' A) {3 v9 ^; h8 ^
我也觉得不用+1啊,
作者: dirk190    时间: 2014-7-19 22:15
追梦者 发表于 2009-8-13 10:27 & m. l: e: U% D9 S& b, q1 G
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...

, ^, Q9 W' v5 Z$ _3 k* O2 a8 c: G换成1到7 结果相同的
作者: enqi999    时间: 2014-12-25 16:26
学习学习,看看
# X# R; U; Y8 T" F) j, E




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