数学建模社区-数学中国

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

作者: guarguar    时间: 2009-4-22 11:37
标题: 【讨论】新手求助:关于lingo的wrap函数
本帖最后由 厚积薄发 于 2010-1-26 21:10 编辑 & `7 d+ g0 {0 j& Q8 ]" u

' h7 E( J& {" F8 W2 {看到一个题:
9 W+ E- \7 n! K( r职员时序安排模型  7 R" G0 l3 _& I4 `( ]- S% {
一项工作一周 7 天都需要有人(比如**工作) ,每天(周一至周日)所需的最少职员数为 20、16、13、16、19、14 和 12,并要求每个职员一周连续工作 5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。
: Z3 s  m  k9 s/ qmodel:
' f+ Y' R# k% ^5 G' ^1 ?& P+ _sets:
; i; ^6 b5 E% D  days/mon..sun/: required,start; . e) _5 S& u0 x+ V1 V; W
endsets
7 s+ y. Y( n5 D: gdata:
  G, {. o2 o/ I8 X6 o  !每天所需的最少职员数;
  C! p; Z) d0 i  required = 20 16 13 16 19 14 12;  ' w9 o4 g4 T* Y
enddata
6 \3 t# L; F' B; Y!最小化每周所需职员数; 5 H. }9 z4 _/ Y0 ~
  min=@sum(days: start); 0 y4 t& ~. N0 r% q! |
  @for(days(J): 0 Q3 T# u! S  `, E5 k
    @sum(days(I) | I #le# 5:
) i. z9 B$ \% m      start(@wrap(J+I+2,7))) >= required(J)); ! E. _4 S% e6 @/ }* v4 i
end
8 v# Y; n6 Y+ d& p5 _$ V3 z. W- n5 Y) D1 d9 N9 g5 B$ Z$ g, S% Y
其中@sum(days(I) | I #le# 5: ; s* r! w1 h6 C3 @+ n$ ~7 M( P
      start(@wrap(J+I+2,7))) >= required(J)); 是什么意思啊?我知道比如周一要排的人要从上个周四算起,但是不知道wrap中J+I+2和7各代表什么意思啊?还有这个函数怎么用啊?: R0 U7 A" q1 u8 u0 m7 V/ @: Q( _
请各位帮忙,谢谢了!
作者: 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
. H9 [7 z2 q1 P  Q0 I' r一个员工工作一天算一个工期
7 T( e1 Y: ?9 e: E( @$ ?所有的天数加起来:总工期
作者: 追梦者    时间: 2009-8-13 10:27
本帖最后由 追梦者 于 2009-8-13 10:37 编辑 5 d7 |; n" b+ Y8 e$ R/ u
@wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~
, Z+ r3 c  c6 `/ N" m5 W- z# q+ A371568491 发表于 2009-4-22 22:35
; Z- t$ b& I6 x7 Q3 k
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit而不加1。0 S3 h. r4 S4 K' t: ?/ ^0 @* k7 z3 b
你可以运行下面的结论来看一看:
4 U. g% }0 o6 P$ L, ?这是原程序
/ s9 ^1 w6 k& u' \model:; o5 ^4 q8 h2 N, K& j. F' T
sets:
  k, ^+ B, q$ n  ?  days/mon..sun/: required,start;
/ b0 g& j  y+ g9 Vendsets
0 l6 o) _" h' }* ?, D. v- I8 w0 adata:
) F- N3 J. G/ c  !每天所需的最少职员数;
2 }" B0 u5 c. v) ], S  required = 20 16 13 16 19 14 12;
# _! F+ V9 Q; kenddata
, b+ f2 ?" |  f1 r8 I!最小化每周所需职员数;
/ M$ ]9 a7 T" [( x' d  min=% @$ R2 {+ G, j' Q
@sum(days:start);9 u' R. y0 p  C! M; W) Y  P, y+ R
  @for(days(J):
& P( U, e6 z+ }4 t4 f    @sum(days(I) | I #le# 5:# {4 v1 ]) s& Y: E( I" J6 L# J
      start(@wrap(J+I+2,7))) >= required(J));
& V% X2 @1 T. Q5 O9 O!外国人的第一天是星期日;3 G8 }) ?# ]$ q$ b; r) d
end
# A& `5 Y: Q) R1 x7 J" [5 u' L将上面的程序中的集修改为
, e7 F$ [* E3 i; dsets:
) J( Z# m; J6 T. ?+ ]/ `days/1 2 3 4 5 6 0/: required,start;# f; G& w6 A9 r6 H$ r
endsets* d, S6 [4 `( r& S* |6 b' d
在运行效果一样,证明了我的结论。
作者: 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的值, I7 y/ \' e" \6 U2 t: ?* ^+ J5 N
我个人觉得也不是教程上说的加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。该函数在循环、多阶段计划编制中特别有用。$ ?, R' y) F+ w/ N$ H, T! P

( ?9 g9 u% l( o+ W' x/ K通俗的解释是:用来转换集合两端的索引,在集合的另一端继续索引。也就是说,在集合循环函数中,当达到集合的最后(或第一个)成员后,可以用@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./ ?; G8 k9 ~- r- f: q

% M3 E& [6 u9 `( J+ H5 u8 H8 z* i@for(days(J): / @2 B. d5 Q2 L5 L: `. }# D* |6 ?
    @sum(days(I) | I #le# 5: - H3 o8 A* D; L4 q+ p
      start(@wrap(J+I+2,7))) >= required(J)); ( [. t! j1 {0 ~& I5 J2 M) K) `  t
day(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 i* C7 t9 z+ d! h
sets: 9 u( _. ^; i4 Q- [, }  @
days/mon..sun/: required,start; . }. c/ ]$ V% x6 N
endsets ( \' V$ g1 r5 o. m" L9 P) N8 b
data:
# E) B/ L. N3 F9 k9 \!每天所需的最少职员数; & h3 n2 j3 l+ G
required = 20 16 13 16 19 14 12;
% {8 V9 w1 A0 _* s* H9 P- d! _enddata
. D, X4 M0 C0 A' H! u+ H!最小化每周所需职员数; ! j4 J1 u9 p3 E# W; w' K
min=@sum(days: start);
* C! G8 Q! i/ S1 |@for(days(J):
+ p( g2 L* \3 @! |- \    @sum(days(I) | I #le# 5: ; X* m8 q8 v  F# t' P4 p
      start(@wrap(J+I+2,7))) >= required(J));
- V0 G: Z0 R# e7 rend
% V" l3 P8 C/ x& ~8 Z) a
( w! ^5 X5 e4 H( `解释下:6 H* \# R$ ^; t, [+ |
@for(days(J):
3 k9 F" @0 S- ], m1 k2 x& G3 S    @sum(days(I) | I #le# 5: + I  R! l8 |' A1 @% ]
      start(@wrap(J+I+2,7))) >= required(J));
% Q+ n% X  V5 ~& O- m' f: ?
$ ?# Y! ]7 R, N4 r% ]4 E: b7 Y当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的职员和,以此类推。
+ w0 b( q/ J( o) S: V! w& G2 u, `  e1 x% D# h8 \
网上有一种说法是,英美中星期表示的不同,中国将星期一看成第一天,而国外则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit再加1。将上面的程序中的集修改为
% {6 c0 k, R0 o% J/ J- |* t% W4 l
! J5 T7 C: e& P: V( \) h
sets:
! j8 b$ s) C/ h# Ydays/1 2 3 4 5 6 0/: required,start;% K0 T, U, Y3 G) ^) v( H9 k
endsets
5 L8 I" h: E; z  q3 D, ?! ~- @; w2 U- q

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

作者: 无聊2012    时间: 2012-4-9 23:44
刘振 发表于 2011-8-12 20:01 ! C: B5 F: N0 S* Z# `4 a8 \
model:
; U# I/ f" f4 u" s1 B9 {( Osets:
5 b/ R& Y3 C1 k1 J: _! edays/mon..sun/: required,start;
. a: y3 y# ^) {+ O8 n1 v$ F6 ?$ X
对一下做下调整,便于理解
; `/ X( o8 G+ @' z% c- t! Z- M& u0 H; P
model:
5 e' g1 x8 {, c( O% x3 w1 b8 z( m9 rsets: : q  L. A1 w6 `6 d! Z
+ q) X8 V* ?% c  f3 I/ I$ T days/mon..sun/: required,start;
; y7 V! l4 i8 d, P4 uendsets - h  W) ]$ D9 O5 I2 ~) H  K+ K" E7 O2 h2 L0 C9 e' A0 [
data:
3 P* s, I8 L) g!每天所需的最少职员数; ! j# a9 M% I6 J+ K
required = 20 16 13 16 19 14 12; ; }: G' I5 C3 z! F( \' p" b' d2 [( M' ^2 y  z0 ]# t3 Y: O
enddata   ]- t4 R' b. j  e9 q% Z
6 ^6 l4 l3 R/ L3 a" n" l0 S !最小化每周所需职员数; . z4 K' V6 u5 \9 I. X% C0 \& H
; W' c( W- X# `* U, w min=@sum(days: start);
  U8 T2 B2 T- a  l@for(days(J): 9 C7 [, _" A9 ]
    @sum(
7 i# N. F2 r- ?/ _& Q7 R$ t  ~             days(I) | I #le# 5: / O6 s% o; z+ \. q+ t/ {' H
             start(@wrap(J+I+2,7))
8 {- v/ n0 V6 \; K2 b" B             ) >= required(J)); 7 z8 O/ O# L! v, k! G+ u- b
end6 c% G$ Q/ c) C! w% |  R) g) n

3 T' ^$ l' [  e
作者: ganquanlife    时间: 2013-1-30 19:56
追梦者 发表于 2009-8-13 10:27
% p4 j- V$ U2 n+ d( m! X小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...

/ b. f# G7 S  R' d我也觉得不用+1啊,
作者: dirk190    时间: 2014-7-19 22:15
追梦者 发表于 2009-8-13 10:27 , p8 j4 O5 _9 d0 I4 r5 c; N0 i0 G( k6 Q
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...

$ m( h( v7 N8 E7 p) _7 ?换成1到7 结果相同的
作者: enqi999    时间: 2014-12-25 16:26
学习学习,看看
; F  j# T* T. q+ m% g" @" M




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