数学建模社区-数学中国

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

作者: guarguar    时间: 2009-4-22 11:37
标题: 【讨论】新手求助:关于lingo的wrap函数
本帖最后由 厚积薄发 于 2010-1-26 21:10 编辑
3 W+ O% A, k. H* ^$ m1 x, r2 \' h& v- E% k( R6 J7 t+ r
看到一个题:+ o( ]" q3 |1 m9 J
职员时序安排模型  $ O4 m# M( H+ x% r/ G
一项工作一周 7 天都需要有人(比如**工作) ,每天(周一至周日)所需的最少职员数为 20、16、13、16、19、14 和 12,并要求每个职员一周连续工作 5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。 9 O) P8 ?+ |0 n" q, o8 ]
model:
& {- S/ v, T8 v. b; S: T9 \sets: 2 J) o+ i+ ^5 O% k( j8 k
  days/mon..sun/: required,start;
. Z: p! P& |$ sendsets
5 O+ Q' d6 N; g3 w; xdata:   t9 A/ u1 F! b4 K+ W9 z
  !每天所需的最少职员数;
7 P! M7 E2 H" J5 i  P; E  required = 20 16 13 16 19 14 12;  
5 b' V( g& P. N/ T+ \5 R. \# uenddata
0 s  d  |5 X+ x. o!最小化每周所需职员数; ; U3 _6 S4 E+ d8 t+ X
  min=@sum(days: start); ) k; p3 E  j& z$ B$ V
  @for(days(J): 8 B& B5 O, R/ E- l& x
    @sum(days(I) | I #le# 5: ; s8 y! {# S' X7 c: o! v- Q* j
      start(@wrap(J+I+2,7))) >= required(J)); & u, R5 P) s! ~, V) f
end
; F5 w2 N" t9 e0 [* t1 m% z. X; l" G- T, ]; q
其中@sum(days(I) | I #le# 5:
& B% `9 v2 F9 `5 c; I- {; G      start(@wrap(J+I+2,7))) >= required(J)); 是什么意思啊?我知道比如周一要排的人要从上个周四算起,但是不知道wrap中J+I+2和7各代表什么意思啊?还有这个函数怎么用啊?+ a8 b5 Q- a. j$ `
请各位帮忙,谢谢了!
作者: 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
# u! p9 [% Q8 F' _* g5 c+ z$ A一个员工工作一天算一个工期4 `& r% ?, G% g. H
所有的天数加起来:总工期
作者: 追梦者    时间: 2009-8-13 10:27
本帖最后由 追梦者 于 2009-8-13 10:37 编辑
( t: w& O! F2 z) \- h+ {
@wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~
' X+ b) x3 ~6 R3 _1 M371568491 发表于 2009-4-22 22:35

2 ^2 _; ^2 \8 K* l小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit而不加1。
/ i  x2 H* _  Z# k: F你可以运行下面的结论来看一看:
  B/ N4 X6 R' ^这是原程序4 n& V) a9 R( V0 `4 j2 v8 C
model:7 x" Y3 r- e& l
sets:
$ @% z; C5 K) ]  days/mon..sun/: required,start;0 p3 I% D2 G* k/ T" N6 T
endsets
/ n% j. }* h# N- u$ ^7 C4 m& cdata:
  }1 X- C# [8 R7 P3 @, N% r! w  !每天所需的最少职员数;0 z5 S- s0 h- k$ ~" Y
  required = 20 16 13 16 19 14 12;
# M) y& \  W" w, U* }7 kenddata" I9 ~6 }% U0 d* C0 G
!最小化每周所需职员数;: Q  J, g5 G8 c: q: B) q
  min=
! S- B7 ~$ D8 G2 t. G$ \@sum(days:start);
$ J" l, w0 b! N3 }( V  @for(days(J):
0 |# q; @9 G7 R5 {5 I6 e/ p    @sum(days(I) | I #le# 5:
# Q  c' _/ v: M: |5 _; h      start(@wrap(J+I+2,7))) >= required(J));7 w0 f$ F  X% s/ F* }
!外国人的第一天是星期日;5 ?  L+ D+ f9 F5 r& m; k/ v
end* _; T) R' L0 k
将上面的程序中的集修改为
7 J" v/ @* v$ c1 d) _$ Isets:
+ K: [( ]  n, K) |& w( o, g7 ^days/1 2 3 4 5 6 0/: required,start;
: [) l; b6 {( {9 \) V: E  R$ vendsets
. y# M- w- \/ ]/ O$ q( A在运行效果一样,证明了我的结论。
作者: 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的值; F  l) A3 q0 }. C, U
我个人觉得也不是教程上说的加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。该函数在循环、多阶段计划编制中特别有用。2 I! U/ y3 }' V/ q/ `, S

, u# p+ l- e1 M5 f+ q8 b0 G, I通俗的解释是:用来转换集合两端的索引,在集合的另一端继续索引。也就是说,在集合循环函数中,当达到集合的最后(或第一个)成员后,可以用@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.
' j6 Q( a6 p& J* [( |! l! b2 n6 P7 b0 Q- N- }
@for(days(J): 7 L  ]8 n9 t& B- r" Y
    @sum(days(I) | I #le# 5:
, R. v- k; F3 x5 }, P      start(@wrap(J+I+2,7))) >= required(J));
: q5 c" H  n# ^* l! A8 W7 hday(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:
4 G; c! n7 E0 s2 E, ^3 L( y6 B# gsets:
1 T* ?7 D# {$ {# B# l' I# x7 {days/mon..sun/: required,start; % `% m+ i' M6 C' u
endsets
  y* t; b- C, W  n4 p' ldata:
  z* v5 j4 ?* V) H# L; g, I& n' K!每天所需的最少职员数;
8 A" g8 w3 x# L+ i- q& Zrequired = 20 16 13 16 19 14 12;
9 B" r/ }- W1 a7 d  n( \- Venddata
! |" a& C8 {$ O9 N!最小化每周所需职员数; . z4 F! U0 l# x+ \! C  Q
min=@sum(days: start); 8 m# o2 V) j! j( {. M
@for(days(J):
: n; |  H+ E# E, N5 W3 U    @sum(days(I) | I #le# 5:
: ?+ L& ]- @* z5 k      start(@wrap(J+I+2,7))) >= required(J));
! |9 Y4 r# F; s2 pend4 ?( W" D' ?9 K6 U/ c! c. p3 ^3 k
; f! h% g& @  N2 N+ Q0 b
解释下:# Z( k% o( M4 n) B
@for(days(J): 5 ?$ K9 R9 L9 U* _" \3 S! ~) ]
    @sum(days(I) | I #le# 5: 0 k, ^. k& h$ \
      start(@wrap(J+I+2,7))) >= required(J));
; \3 C* R# W3 r& W3 b( m- s! _' |
+ _( ?% D! k4 r' i, 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的职员和,以此类推。
( X. ]. ?& I  M) j  ?2 Q" z# m( F9 u1 s. e' q3 A' a
网上有一种说法是,英美中星期表示的不同,中国将星期一看成第一天,而国外则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit再加1。将上面的程序中的集修改为
. x& p& U( \" }) d, |& _) g# w( n" r5 t

( c7 `/ G! U7 N( ^  R8 r; {, psets:
# }4 u6 u9 S2 V' C: S$ e" t% ]days/1 2 3 4 5 6 0/: required,start;
7 i  P/ J) {$ X8 J) zendsets  N0 \9 O; |6 E  G4 _

" M( d6 U( |$ Y6 V' y9 @0 z$ M: j
作者: 刘振    时间: 2011-8-12 20:02
这个我也不懂,那位仁兄出来具体介绍一下
作者: 成城    时间: 2011-9-8 21:41
我就是再问啊
作者: cmd2.com电影    时间: 2011-11-30 03:35
挺好的,顶顶,新手还没有分呢,多回个贴
作者: ehi28    时间: 2011-12-18 10:41
嗯,不错,支持一下.0 n0 E8 I! Q+ @) e

作者: 无聊2012    时间: 2012-4-9 23:44
刘振 发表于 2011-8-12 20:01 ! l( U4 l3 p# w
model:
- O5 Z: j0 I- Ksets:
* S1 c9 N, `/ U; r# X" x+ F4 vdays/mon..sun/: required,start;

  N0 F9 n. _# F& N对一下做下调整,便于理解% q* }& I/ E0 a( X; M1 Z0 |( y

: O3 N7 d& Y# A8 w- Amodel: ! ], Q  k8 @6 p# z6 E% S8 L
sets: : q  L. A1 w6 `6 d! Z
, o. y# N- s" r6 H0 X days/mon..sun/: required,start;
* k& @$ \  u. C7 Y+ H* f: u6 N& e# uendsets - h  W) ]$ D9 O5 I2 ~) H  K- }% p% V* f# M$ d
data: ) ~# s  D1 \' [2 x
!每天所需的最少职员数;
' h. B* I( ?! W! J; ]% _2 N# ~' B& Yrequired = 20 16 13 16 19 14 12; ; }: G' I5 C3 z! F( \' p" b3 }# L9 j* g- A2 e
enddata   ]- t4 R' b. j  e9 q% Z6 H. h- |5 u1 b6 i( B8 |8 ?
!最小化每周所需职员数; . z4 K' V6 u5 \9 I. X% C0 \& H
8 h8 _6 E6 \" ` min=@sum(days: start);
* K, n- m  G2 g& f$ C@for(days(J):
" b5 `6 I1 ~2 X& c- N+ k5 U4 ^" I    @sum(
5 b$ l- A; o; E2 O4 \* b5 t             days(I) | I #le# 5: + p& g$ ^' Q+ y# B
             start(@wrap(J+I+2,7))
& w0 ?! |$ k' G; `, H9 D, N9 J  @# u             ) >= required(J));
+ e0 Z4 S: B) {( P, }end
$ {* n: ^7 ^6 X. D
! V5 t, I) V( v& [
作者: ganquanlife    时间: 2013-1-30 19:56
追梦者 发表于 2009-8-13 10:27 2 {- d% ]4 K) k* M& V8 u
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...

' f: u& a7 A; J% `4 w2 C我也觉得不用+1啊,
作者: dirk190    时间: 2014-7-19 22:15
追梦者 发表于 2009-8-13 10:27
. E0 A2 t+ i* q( O% v5 y8 T; a! y小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...

! i& Q: C% B5 M- U换成1到7 结果相同的
作者: enqi999    时间: 2014-12-25 16:26
学习学习,看看
1 s2 M" [8 t7 n) r1 E




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