数学建模社区-数学中国

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

作者: guarguar    时间: 2009-4-22 11:37
标题: 【讨论】新手求助:关于lingo的wrap函数
本帖最后由 厚积薄发 于 2010-1-26 21:10 编辑
8 d7 \0 e' k& E- a  G4 X( @4 b
看到一个题:
4 T* q% R* t9 L: Z" G职员时序安排模型  
$ v" m- p: @2 u' t* B3 ?* @1 g6 p一项工作一周 7 天都需要有人(比如**工作) ,每天(周一至周日)所需的最少职员数为 20、16、13、16、19、14 和 12,并要求每个职员一周连续工作 5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。
  q9 ]8 a5 j2 s! ~# ]8 C3 }9 {model: ; r- }; z3 K; F4 z* V0 ^9 _
sets: ) r3 ^1 h& G* }4 G& C* `- Z1 Q6 G
  days/mon..sun/: required,start; ' d3 l9 J0 E* v3 G1 `  u
endsets
3 R( T3 G! q7 H0 x3 n  @9 Odata: 9 a& b5 l5 X. r: \
  !每天所需的最少职员数;
. n6 i  W; o) U, a  c% H  required = 20 16 13 16 19 14 12;  + k8 i8 p# o  }, i- ^
enddata
, R' M( k/ o8 X# s- \!最小化每周所需职员数;
* n. ?, y/ Z" G6 r0 ]  min=@sum(days: start); ' d# q) x6 M  M
  @for(days(J): ! K& T" u+ U5 O! K5 S+ ~/ M
    @sum(days(I) | I #le# 5: - F! B1 C% w/ ~8 y
      start(@wrap(J+I+2,7))) >= required(J));
1 k- _2 e% z4 A. ^$ O' Wend
7 j0 H. B5 q0 i2 _5 F# `* [! {" [- B) g: L! k/ G5 {" q* I
其中@sum(days(I) | I #le# 5:
6 h$ X+ N  x% `4 z' G" {0 t      start(@wrap(J+I+2,7))) >= required(J)); 是什么意思啊?我知道比如周一要排的人要从上个周四算起,但是不知道wrap中J+I+2和7各代表什么意思啊?还有这个函数怎么用啊?
) i# M7 t" G2 V1 ]. g! }  {% I. ~请各位帮忙,谢谢了!
作者: 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 # a- U# R# u: M; q) V
一个员工工作一天算一个工期
9 x8 j+ I" q' W* O所有的天数加起来:总工期
作者: 追梦者    时间: 2009-8-13 10:27
本帖最后由 追梦者 于 2009-8-13 10:37 编辑
+ J- f7 p( X  Y' l7 @: @, F. z
@wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~
6 ?" O) y5 E2 S371568491 发表于 2009-4-22 22:35
: R3 V6 P" [" v% `$ M# h# B
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit而不加1。5 u) T8 a1 }6 ?% R* @+ c4 ~5 i& a
你可以运行下面的结论来看一看:. }% e5 e4 B) k" B: Q! O! W
这是原程序, v) B8 T' D- Y* m7 p
model:
9 _2 m9 |  v8 b6 g  A) ssets:. @  ?  O+ V# S
  days/mon..sun/: required,start;
) s1 \2 p+ M9 E* y) Xendsets3 h, W- y1 i% F$ d' c/ p# }6 Y- O
data:6 C8 `& A( [  q* [; |) I- k
  !每天所需的最少职员数;
3 G' i  D0 D6 r" G; D0 I1 ^* s  required = 20 16 13 16 19 14 12;
1 I# |% @: E- ]5 D  xenddata
2 }9 f' P" e3 @!最小化每周所需职员数;3 ~/ j- Z7 d- c% J& \
  min=
- f" M6 o9 ^( E3 Q4 B@sum(days:start);
, \: l' V9 T; L9 i  @for(days(J):' x! C" p0 Z* x9 Y/ C! C. u
    @sum(days(I) | I #le# 5:0 ]+ _; C3 E8 u, z! K6 d
      start(@wrap(J+I+2,7))) >= required(J));+ R  ~  h, O) R$ E* ^+ t6 V  Q
!外国人的第一天是星期日;
, k7 F! e% M: ^end& t6 A3 f: q4 [$ p) G- F( t6 E/ D
将上面的程序中的集修改为 + C$ p& R& ^8 V! B7 q; A; a
sets:
( y  c$ B0 O2 V! Z6 p5 ]" M' sdays/1 2 3 4 5 6 0/: required,start;
8 i# a. S$ D9 s8 C6 c; u$ u* U8 Eendsets" Z, ?8 d5 Q3 z1 l
在运行效果一样,证明了我的结论。
作者: 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的值
$ Y. m- D3 r" |& V3 J5 v我个人觉得也不是教程上说的加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。该函数在循环、多阶段计划编制中特别有用。
9 t+ g0 Z4 G' E5 F% U
3 @( T$ }4 e; U3 `+ h通俗的解释是:用来转换集合两端的索引,在集合的另一端继续索引。也就是说,在集合循环函数中,当达到集合的最后(或第一个)成员后,可以用@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.: C& J+ P2 h" Y7 d. g( B4 \5 V. X* p

+ r3 r4 Z' k, G7 g" Q: Q* }3 n@for(days(J):
2 ^: d, h+ d# z% z9 [' [  E; ^2 v+ R    @sum(days(I) | I #le# 5:
4 ^- i; D9 e$ k6 w      start(@wrap(J+I+2,7))) >= required(J)); 6 q4 M2 E6 w1 u  L2 m. Z1 c# C
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:
  v* C( R- G7 w- @  y( s+ w1 t" Zsets: ( W* W7 S  J; y$ {
days/mon..sun/: required,start;
2 c. O5 G+ L# ?0 Kendsets
/ a. T8 E) k. qdata: 7 H" X; e6 G/ l- K
!每天所需的最少职员数;
6 c4 p- I* e" J; Irequired = 20 16 13 16 19 14 12; 8 i! Q2 n! I( U! o& N, U8 n" V0 v
enddata 5 N5 K0 F" y. @7 u) w4 @4 L1 ]
!最小化每周所需职员数;
7 g4 D- M, g# ?- Omin=@sum(days: start); ; z! Q0 q6 ~5 F" |$ y4 R# C
@for(days(J): . O2 G1 S  c* [' {6 A; }& F
    @sum(days(I) | I #le# 5: : Y. g2 _6 ^4 z6 B# P% k3 I3 O
      start(@wrap(J+I+2,7))) >= required(J)); # P8 k) j1 J8 G8 m9 ]$ f
end
  x6 }  L* R# v$ K( y
  w! n$ |8 w% L9 T: \) d* s解释下:
% V" |: y; P) K" J# X" B@for(days(J):
6 [1 o: e- x* X8 V, {9 \    @sum(days(I) | I #le# 5:
: b9 w. ~2 ]0 m/ V( C/ F2 s% c4 H' J      start(@wrap(J+I+2,7))) >= required(J));8 y% t. w  |* h" h8 X2 E
* h# P( z3 S, {# S: L0 S
当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的职员和,以此类推。
( x8 d* K- \/ |0 O6 e$ J! ?8 w. n- [1 [0 J+ u
网上有一种说法是,英美中星期表示的不同,中国将星期一看成第一天,而国外则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit再加1。将上面的程序中的集修改为
. t1 d5 _6 n) m3 x1 m& X5 ~$ ?1 q& q. i' c% s/ c3 ^+ E- G
- Z6 d0 O& E% a+ E; G
sets:, V7 S5 @% q1 P! a2 U% B' l( b
days/1 2 3 4 5 6 0/: required,start;8 N  x0 c: h- c3 ~( \
endsets
0 _4 h3 R7 ?0 ]; r4 w
1 ]% z0 }4 j/ s8 S
作者: 刘振    时间: 2011-8-12 20:02
这个我也不懂,那位仁兄出来具体介绍一下
作者: 成城    时间: 2011-9-8 21:41
我就是再问啊
作者: cmd2.com电影    时间: 2011-11-30 03:35
挺好的,顶顶,新手还没有分呢,多回个贴
作者: ehi28    时间: 2011-12-18 10:41
嗯,不错,支持一下./ ^1 Q7 `9 Y& D' R: H: J

作者: 无聊2012    时间: 2012-4-9 23:44
刘振 发表于 2011-8-12 20:01 8 ?& F: @& n% d7 ~
model: # a, K* b# @2 M- ^; C
sets: $ o2 N4 J! e6 p" h( }* F  V
days/mon..sun/: required,start;

) j: A2 u2 J$ ]& o对一下做下调整,便于理解
$ a6 ?+ [5 B% O' \
2 O% J1 i. n* Z; W6 L) p1 o) x/ U' Dmodel: - j7 a9 f; ?) O/ O- d# E# ?
sets: : q  L. A1 w6 `6 d! Z
" m: O8 {/ Z2 p2 R  G  ]' U days/mon..sun/: required,start; . E. D; X9 n, K. v( Q0 A
endsets - h  W) ]$ D9 O5 I2 ~) H  K4 m8 D6 R" P1 K- v7 P9 V, p
data:
* r' p6 F2 R0 Q  x+ J!每天所需的最少职员数;
6 u% E) |0 a4 o) y' ?required = 20 16 13 16 19 14 12; ; }: G' I5 C3 z! F( \' p" b
3 L* e2 r4 _9 b& n enddata   ]- t4 R' b. j  e9 q% Z( }% s/ V5 V- Q$ d
!最小化每周所需职员数; . z4 K' V6 u5 \9 I. X% C0 \& H
* m  N; f- A3 j9 d/ h! v% Y min=@sum(days: start); 6 O% b3 I) f9 t
@for(days(J):
) @! Q7 [& `1 v1 V    @sum(: Q, X1 H/ ?! N
             days(I) | I #le# 5:
/ C% G$ s, l, ~2 j5 r$ z, u2 P9 A             start(@wrap(J+I+2,7))
: f7 `% w) k) `& B4 V9 R             ) >= required(J)); " s* i! G8 e1 r1 a1 B+ m
end! W( K: C, l9 _9 s

8 s- ?& G$ p$ @. z4 d1 n! ?/ [
作者: ganquanlife    时间: 2013-1-30 19:56
追梦者 发表于 2009-8-13 10:27
" ?+ p% G) ^/ L& Z8 f小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...
: a  r: t0 d& J
我也觉得不用+1啊,
作者: dirk190    时间: 2014-7-19 22:15
追梦者 发表于 2009-8-13 10:27 6 N* D3 T, ^" B9 f% o8 A
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...
1 a- s$ j+ _$ ^9 ?  y# ]# O# Z
换成1到7 结果相同的
作者: enqi999    时间: 2014-12-25 16:26
学习学习,看看$ j: J) F7 {& U: S3 k' P





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