数学建模社区-数学中国

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

作者: guarguar    时间: 2009-4-22 11:37
标题: 【讨论】新手求助:关于lingo的wrap函数
本帖最后由 厚积薄发 于 2010-1-26 21:10 编辑 ) Z5 n% O% f; a$ f2 z
( `" p$ h( `- Q7 A0 L5 X
看到一个题:
3 ?$ p, \  h. @5 b; M0 A$ X职员时序安排模型  : Y/ x& V- W1 q# K7 G
一项工作一周 7 天都需要有人(比如**工作) ,每天(周一至周日)所需的最少职员数为 20、16、13、16、19、14 和 12,并要求每个职员一周连续工作 5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。
$ @; R( a% M* F6 Q2 emodel: & _8 \5 G; N/ W4 E9 _
sets: ( e6 k0 V9 ^$ v9 }7 C7 l1 N- ~2 [
  days/mon..sun/: required,start;
9 y; B- d7 k5 ^5 ^/ \0 nendsets
2 R$ K8 H8 _, M9 R8 T* ydata: * F8 ^2 ^6 j* m5 K* P
  !每天所需的最少职员数;
- k+ b" y- i$ X* j8 o  required = 20 16 13 16 19 14 12;  
9 }& J* j" h' X  s0 ], w7 oenddata % }' ^" Y) _. j: N: P
!最小化每周所需职员数; 7 h5 E' A0 {) A4 L4 [. I
  min=@sum(days: start); " w; B3 X8 p0 U' t& A/ f# s
  @for(days(J):
8 v- u" x- F! O" b: R: C5 K    @sum(days(I) | I #le# 5:   y* d) k. |: C- {& {; G
      start(@wrap(J+I+2,7))) >= required(J)); 0 J8 z4 c' K& |/ R) x
end# @4 O+ [! V  s

& \+ `( N: u( D  ?, m1 W) i' K其中@sum(days(I) | I #le# 5: % d+ m% P7 k) R# Q5 ]7 [# d( T
      start(@wrap(J+I+2,7))) >= required(J)); 是什么意思啊?我知道比如周一要排的人要从上个周四算起,但是不知道wrap中J+I+2和7各代表什么意思啊?还有这个函数怎么用啊?! P! }6 }$ t, V5 `0 v, n0 ?7 ^
请各位帮忙,谢谢了!
作者: 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 1 u' \5 L8 c) A, Y  l5 N
一个员工工作一天算一个工期8 M, i+ z0 @0 a  N
所有的天数加起来:总工期
作者: 追梦者    时间: 2009-8-13 10:27
本帖最后由 追梦者 于 2009-8-13 10:37 编辑
2 H9 l6 G' q9 I% g: S0 b- T2 c
@wrap(index,limit)函数在循环、多阶段计划编程中经常用到!表示index模limit再加1,limit相当于一个周期。~
6 E+ K9 e* m; v371568491 发表于 2009-4-22 22:35
5 Y" w' R7 L6 Y5 v
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit而不加1。1 f) Z+ w) B8 Z6 d7 \
你可以运行下面的结论来看一看:
6 b5 g$ a& j  |% y) |, @这是原程序
% m, c, R8 z& M/ Q- qmodel:
8 Q" C( n* Z  R2 `sets:& I/ ~* u$ J: F3 P
  days/mon..sun/: required,start;
  y* G3 E$ ^  P& t9 \( Bendsets
! F& R6 K7 r+ y8 k* J8 ^( @" x4 e# Ndata:
6 N6 {) m  N1 ~$ [  !每天所需的最少职员数;4 H; B8 o% M: f' r; L
  required = 20 16 13 16 19 14 12;
1 s; J& P, u6 t0 ~) v+ Nenddata" t7 v2 U  C1 D- N% B
!最小化每周所需职员数;
$ @0 D* X/ [6 E: g( K4 R( j% W4 o3 o% \) }  min=
2 O4 m+ r  B$ f@sum(days:start);# M0 ^$ k9 |$ K2 q- u; P
  @for(days(J):8 K4 Y7 Z# g* b+ B: S/ R, Y
    @sum(days(I) | I #le# 5:
6 v' W. j; A, K3 Z* M5 e      start(@wrap(J+I+2,7))) >= required(J));5 z! O- E' y  f* m4 u) g# r
!外国人的第一天是星期日;- A9 c9 m3 t2 g3 W3 B
end9 N/ \0 s- A3 w
将上面的程序中的集修改为
# ^* I  o3 X) s9 fsets:+ T$ |' T2 v2 L% j0 d4 G* ]: j
days/1 2 3 4 5 6 0/: required,start;
) M4 j) `* M6 w9 k- A9 Vendsets9 e9 u. E; v/ q* P* Y5 ?% 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的值
! ?/ L/ E; ~' ?8 g& s' k! T$ e我个人觉得也不是教程上说的加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 B2 u" w6 n7 F  ?# b: L

  e; @- C. A  n0 K- r+ Y通俗的解释是:用来转换集合两端的索引,在集合的另一端继续索引。也就是说,在集合循环函数中,当达到集合的最后(或第一个)成员后,可以用@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.+ a; j' d6 ?8 c& p4 ]' D  r

6 H: g$ i3 R$ A5 M@for(days(J): 9 s- `( b. H" X- [6 R/ t
    @sum(days(I) | I #le# 5: $ p1 B5 W: e* A& o3 N' V8 _+ [  U
      start(@wrap(J+I+2,7))) >= required(J)); 1 \1 e; I7 Y3 B
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:
/ X) u1 C6 n% i9 N. m; Vsets: $ i+ j+ z8 i( \& P- r. x2 a! M- [
days/mon..sun/: required,start; : H- M# g* q) L2 f8 ?7 y1 g
endsets
) k6 x0 L/ R( {* [data: - w1 X3 Q, J. T0 X
!每天所需的最少职员数;
2 R- i. N' A" t" jrequired = 20 16 13 16 19 14 12;
8 k; X- b/ F. j3 d* W5 B5 C3 Ienddata
+ [# z1 z, C/ N0 {9 n+ ]; a5 {!最小化每周所需职员数; - a# a5 @) U$ Q: W( Y  p6 H2 Y
min=@sum(days: start);
/ k# S$ `" r) `4 `: L- N8 \* ~6 U@for(days(J): 6 J" R( k8 W: \- H. ]4 P
    @sum(days(I) | I #le# 5: + R9 y/ c  c. U& S. h4 j( e
      start(@wrap(J+I+2,7))) >= required(J)); ( U3 A5 K0 p; z
end
& F7 X8 C/ e+ o! C8 m& g6 c
, C7 x) P" J! R4 y解释下:( I3 h/ f1 P% t0 {
@for(days(J): " @( i: l: h+ `& ?
    @sum(days(I) | I #le# 5: 4 u. p; ]; w* p
      start(@wrap(J+I+2,7))) >= required(J));
# |+ Z- Z& S$ H5 `( B. ~0 O
' n" x; C0 o& V( B# r' c. s) v+ z当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的职员和,以此类推。- G* d; x* H: ~2 a% i; [! N; }

' L8 t/ j% O+ j& l  P网上有一种说法是,英美中星期表示的不同,中国将星期一看成第一天,而国外则是将星期日看成第一天。在lingo中sun就表示第一天,用数字0标识。因此@wrap(index,limit)的用法就是index模limit再加1。将上面的程序中的集修改为
% D" w* f, n2 g* j- c1 q
1 I& U5 [  D. W; q1 u6 W$ ]9 N2 L' B* `! i  M( ]4 W9 g
sets:0 ^7 k' W8 C  |7 `3 o" Z$ S! W; @+ S
days/1 2 3 4 5 6 0/: required,start;
9 M# X% R" V& I- hendsets
3 \; q3 u$ f1 {0 r$ ^- c) }0 G. i5 b$ r) |

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

作者: 无聊2012    时间: 2012-4-9 23:44
刘振 发表于 2011-8-12 20:01
8 s* D- u1 P9 \) M  W# r4 amodel:
7 U5 H' z+ z" u" C9 Fsets:
2 u9 n" t: d6 e' w" o, Qdays/mon..sun/: required,start;
4 X1 x# `% T$ I
对一下做下调整,便于理解( t3 y: k1 s2 A- }

" }  \' P  f7 q( _model: 4 O, }8 a* V% q* k6 i3 g% u" Z( m
sets: : q  L. A1 w6 `6 d! Z# I' _5 y  R4 N
days/mon..sun/: required,start; ; D* K0 r$ j, y
endsets - h  W) ]$ D9 O5 I2 ~) H  K
! M* P# u# e, n# M! i data:
- Z: ]5 H: r  D" _/ o8 H!每天所需的最少职员数;
/ o, {! J  M: J' h* Q7 [0 Jrequired = 20 16 13 16 19 14 12; ; }: G' I5 C3 z! F( \' p" b2 R, m1 e- X: u( r5 N$ J
enddata   ]- t4 R' b. j  e9 q% Z/ d) a) J( s4 F) O
!最小化每周所需职员数; . z4 K' V6 u5 \9 I. X% C0 \& H
7 O. U1 A7 {) d. M min=@sum(days: start); 6 b6 A4 N( E# r% H& M
@for(days(J):
! H' F2 h3 ]- j# u    @sum(
9 Z2 ?4 _( O: T9 Y8 I- x' y# u             days(I) | I #le# 5: . v  [: ]5 }4 d
             start(@wrap(J+I+2,7))" q: {3 R$ ^/ |. |
             ) >= required(J)); 2 k' a& c% L  C6 z. ^' h6 x
end1 \- m, I+ D  x# f# C) O0 y

7 w# s5 S3 ~* C" ?) Z/ T
作者: ganquanlife    时间: 2013-1-30 19:56
追梦者 发表于 2009-8-13 10:27 $ F5 F8 V0 ]# F, \6 i
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...
) t% e- k' C4 G  O. c
我也觉得不用+1啊,
作者: dirk190    时间: 2014-7-19 22:15
追梦者 发表于 2009-8-13 10:27 # r! i: ^- a, f
小弟与上面这位仁兄的理解稍有不同,英美中星期表示与我们不同,我们将星期一看成第一天,而他们则是将星 ...
2 }- v% I$ d' o/ ^( b  C
换成1到7 结果相同的
作者: enqi999    时间: 2014-12-25 16:26
学习学习,看看
# n6 V1 Q! r6 X; H; T- p




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