数学建模社区-数学中国

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

作者: guarguar    时间: 2009-4-22 11:37
标题: 【讨论】新手求助:关于lingo的wrap函数
本帖最后由 厚积薄发 于 2010-1-26 21:10 编辑   C! \0 Z( ^  g
9 g) ^' k9 ^( }# j6 J2 N0 E
看到一个题:5 o% M9 A$ p7 j& h! b, T
职员时序安排模型  + m# j- w% e! x/ c$ G1 m5 R& `5 {2 o
一项工作一周 7 天都需要有人(比如**工作) ,每天(周一至周日)所需的最少职员数为 20、16、13、16、19、14 和 12,并要求每个职员一周连续工作 5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。 / X7 H  t, V' P4 ?! L
model:
2 r1 N8 X, j$ L, B* b2 Lsets:   d8 O3 M: N0 |$ Y
  days/mon..sun/: required,start; " V! U7 v1 ?( B, {
endsets
. U; C1 q! L  ?4 Hdata:
  G% j1 z+ ~% Q; L  !每天所需的最少职员数;
6 V9 R, s; O  P9 L  required = 20 16 13 16 19 14 12;  & B# {5 u4 H/ k, z) ~% a
enddata
+ Y, b1 c1 |2 A) U4 e2 Y  N!最小化每周所需职员数; ) b: f5 p, g3 {6 c
  min=@sum(days: start);
$ m( D) K  \) P/ U. r8 ^3 A4 X) \  @for(days(J):
8 E: M7 Y! Z, b: V1 S. ^$ \  t    @sum(days(I) | I #le# 5: + y! ~4 i: D! u' L3 U; K5 @+ w
      start(@wrap(J+I+2,7))) >= required(J));
5 y) {* ^! k- b: Y/ eend, [3 b& D( ~3 m# l& B# w1 I
5 {: f% \4 E+ U5 n5 |
其中@sum(days(I) | I #le# 5: 5 H3 u+ N, k7 X9 x7 Z
      start(@wrap(J+I+2,7))) >= required(J)); 是什么意思啊?我知道比如周一要排的人要从上个周四算起,但是不知道wrap中J+I+2和7各代表什么意思啊?还有这个函数怎么用啊?
/ F6 S2 \' @* w" |6 p0 F! V请各位帮忙,谢谢了!
作者: 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 ) y# M6 G/ E4 r; G( p
一个员工工作一天算一个工期& m& G# `5 q  J+ Z
所有的天数加起来:总工期
作者: 追梦者    时间: 2009-8-13 10:27
本帖最后由 追梦者 于 2009-8-13 10:37 编辑 * C7 c" B6 j  H: i8 [$ f
@wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~" |2 s  E: t+ I# v9 [8 o3 P
371568491 发表于 2009-4-22 22:35
9 F$ E- T/ w$ ?3 [4 b
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit而不加1。. ?( S( y  D6 U' Y! V
你可以运行下面的结论来看一看:' t6 h6 w0 ?/ ^
这是原程序
3 L  y/ R) `3 c% S, w3 Q! r* Cmodel:  D  ]! \$ S; n4 g2 k! _. Z$ R. T9 j
sets:' V  m- b8 E2 d6 C; f  \, n
  days/mon..sun/: required,start;5 h0 C  ^7 z! u7 @3 a: o
endsets  ]" X5 ]) p$ ^9 }0 a
data:5 L: o& n& }/ b! H! O$ w
  !每天所需的最少职员数;, X4 e6 Z+ |" [* i1 ~/ Z  k! r! j$ B
  required = 20 16 13 16 19 14 12; 1 f7 A3 Q* ~+ W7 U: @
enddata, n0 \% n' N$ B+ ?7 X+ \; ?
!最小化每周所需职员数;8 R5 f8 Z( r/ ?7 r2 ~
  min=; s. s9 x# t1 c. c5 W, M
@sum(days:start);
' o4 ]* Z& E* V2 }/ R1 L, M  @for(days(J):! m5 }5 }  M  _! b& y
    @sum(days(I) | I #le# 5:/ Y% b2 E3 Q# Y  o
      start(@wrap(J+I+2,7))) >= required(J));
0 D, @$ u* k# O) c* c5 M' E+ `( s!外国人的第一天是星期日;
+ s! L' i3 s* O" B. @/ |end
, y' |' K6 L  A. V/ u* ?* K8 Q1 I将上面的程序中的集修改为   o1 H* l9 r5 j- g' U# ]8 n
sets:
7 t2 t/ T* L9 zdays/1 2 3 4 5 6 0/: required,start;( d' g8 ?$ F2 d) h" K
endsets& Z4 w, }& M& y9 p" Y! T, [& m: K1 C
在运行效果一样,证明了我的结论。
作者: 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的值
! `7 U& ], u9 _% q$ D6 [1 ]  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。该函数在循环、多阶段计划编制中特别有用。
* Z% ?) L. m6 O, y
5 L+ z5 \6 j9 j- `- m通俗的解释是:用来转换集合两端的索引,在集合的另一端继续索引。也就是说,在集合循环函数中,当达到集合的最后(或第一个)成员后,可以用@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.
% T, T4 e3 k5 D+ _0 [2 P  b' H( n( Q, P' C0 ~+ @# y2 L
@for(days(J): & Y$ x" W8 }/ u& h. K
    @sum(days(I) | I #le# 5:
0 d* p4 C$ d2 o" h2 g7 V: P2 j      start(@wrap(J+I+2,7))) >= required(J));
- k" g. J7 K/ V( c' Q: z3 Sday(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: 8 p5 s$ r- K; ]8 M: }) y/ t# v
sets: + E  u. v8 R! x. W. ?
days/mon..sun/: required,start;
. }( ^' P& ]! C0 u2 bendsets $ G, i. l" k; U( w1 g
data:
5 B1 i- I* |3 P!每天所需的最少职员数; " B8 q; `6 u+ R! D% G9 R
required = 20 16 13 16 19 14 12; # A/ l6 n- v  J7 h* [
enddata 9 X- c7 v/ @; b+ i( B  I( a
!最小化每周所需职员数;
$ W& x& x/ z8 S0 X  J! w: ]0 p' ]min=@sum(days: start);
9 u. X6 v5 D. [  |, a2 P1 V@for(days(J):   ?- w8 A' d- T/ H( U3 n  d7 h
    @sum(days(I) | I #le# 5:
! }, [4 |- U" L8 P; S( I2 u5 Y$ e* f      start(@wrap(J+I+2,7))) >= required(J));
6 P$ \8 n. v- C! J# S' oend  K: Q& J% T& v$ _

2 p7 X- ]+ W) X3 h  c解释下:
) `. c5 y* k) h! b+ i/ j( U( Z6 m@for(days(J): & w. F4 o9 Z' c0 O0 n, |
    @sum(days(I) | I #le# 5:
& T6 ?' [* T8 v7 t5 ]# ~      start(@wrap(J+I+2,7))) >= required(J));
$ e. h$ U) @& H! J6 t( ?7 v; q. Y: n; o! d9 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的职员和,以此类推。
) t5 g9 x7 R% d7 j  d  v3 B! q$ F; ?2 a( C- H
网上有一种说法是,英美中星期表示的不同,中国将星期一看成第一天,而国外则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit再加1。将上面的程序中的集修改为8 b1 j+ @7 h. \

4 O& u" I1 P) L$ {) B/ h. ^$ r6 [5 z) ^  N- ~
sets:
  O* e1 e3 t' k7 g: z- kdays/1 2 3 4 5 6 0/: required,start;- s) A2 g0 b0 q7 p* y: L
endsets( z2 H! w# \! j( `- H  m! k! R
2 w  C2 _7 O# Q0 U

作者: 刘振    时间: 2011-8-12 20:02
这个我也不懂,那位仁兄出来具体介绍一下
作者: 成城    时间: 2011-9-8 21:41
我就是再问啊
作者: cmd2.com电影    时间: 2011-11-30 03:35
挺好的,顶顶,新手还没有分呢,多回个贴
作者: ehi28    时间: 2011-12-18 10:41
嗯,不错,支持一下.2 U: d* C6 D: @6 _& O' D1 @% H* P

作者: 无聊2012    时间: 2012-4-9 23:44
刘振 发表于 2011-8-12 20:01 / p  Q) l4 l4 ~
model: ) B1 U* M" [( I
sets:
& C9 T# [6 L; q* P/ Idays/mon..sun/: required,start;
- _; {. G7 Z0 K, v3 b$ D
对一下做下调整,便于理解) X# U7 S. q  z0 r6 U+ D5 U

9 d8 n4 O4 H& h& h: N; xmodel:
, x3 H6 _3 a  x7 N- u* @, gsets: : q  L. A1 w6 `6 d! Z5 s2 U2 E8 X4 ^& u
days/mon..sun/: required,start;
4 d0 q$ {, _& t" F5 fendsets - h  W) ]$ D9 O5 I2 ~) H  K
5 O$ C! g( l2 w! B' G0 a. f3 c0 v data: " R" @  W- t/ p+ Q% n) A( W5 Y
!每天所需的最少职员数;
8 Q) N" r: g# lrequired = 20 16 13 16 19 14 12; ; }: G' I5 C3 z! F( \' p" b
: t4 n# c# q5 `# j6 m6 Y enddata   ]- t4 R' b. j  e9 q% Z; c6 C; g; [( _  g
!最小化每周所需职员数; . z4 K' V6 u5 \9 I. X% C0 \& H
! H/ q' r2 G* A6 I7 |, x3 ~/ g min=@sum(days: start); / y1 y3 o% G, w& s; V& [+ P  N
@for(days(J): % X$ ?& i* ^( ?
    @sum(
. {- f: `  y3 I             days(I) | I #le# 5: 5 j" \* |, X1 b: t# O! [  g
             start(@wrap(J+I+2,7))
, _8 A# b  ^* V- u6 ^8 I6 U             ) >= required(J)); . G1 f: \% Q: E. U
end* W+ p0 C$ n# n$ Y/ V+ {- a0 h0 q# z
2 m% y3 ]# ~5 m: s8 t& _& e) Z- _

作者: ganquanlife    时间: 2013-1-30 19:56
追梦者 发表于 2009-8-13 10:27
  m" w, K( d6 l8 l& g4 }小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...
0 ~; V- C' v# ^0 o9 b% O$ S- |
我也觉得不用+1啊,
作者: dirk190    时间: 2014-7-19 22:15
追梦者 发表于 2009-8-13 10:27
$ s) y% h/ ]  R. e5 [( c4 N小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...

5 l5 a, f) ~4 P5 \& _* @换成1到7 结果相同的
作者: enqi999    时间: 2014-12-25 16:26
学习学习,看看
4 e* d# v5 ~# F! Y! K2 P/ {4 s




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