全球FlexSim系统仿真中文论坛

标题: 【琢磨琢磨推拉】该用推式还是拉式? [打印本页]

作者: zorsite    时间: 2016-5-8 16:07
标题: 【琢磨琢磨推拉】该用推式还是拉式?
本帖最后由 zorsite 于 2016-5-8 16:19 编辑 5 ~! j( V" i  A2 G& [! z

! |% z9 V/ k8 t; Y) q估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。& I7 N9 m3 h! k) ^
QQ群里有人在问某案例如果不用拉式策略该怎么办?0 `- s3 D5 T# v; w# X" x
这是一个很简单但又很经典的一个案例,布局如下:
0 B+ |4 Z; E# ?8 ~5 V" ]8 F[attach]3084[/attach]5 D! V5 E. w) ?3 s
这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.+ ?3 A) [( t) H2 {# W& a
解决方法1:- ~& ^9 I- B! c* L! A
如果使用拉式策略,在处理器中设置拉入条件即可:
' _9 z- y* k' M1 F: A[attach]3085[/attach]
* D1 C( K  L! b1 [# M8 w' p- n0 b5 X3 \3 g( s. k& J
解决方法2:' G/ D6 @) m) S/ n- B
有人坚持要用推式策略
: V$ S8 l" ], `4 v6 p6 t! N在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);4 Y5 X+ e: v* B: b5 `
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。

) t) j2 C5 {- s5 B+ G. @但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?" O- e$ h/ Q( j( R1 x6 ~( G- S/ i
解决方法3:0 x: l+ L% e6 Q9 W$ `6 ?. V
删掉上面那两行代码,输入以下代码:
  1. int totalop;$ e6 [4 b& C  }! L) h# p$ J
  2. int startop;; }- {0 _1 ^$ e1 x  d# x2 W- V
  3. if (getitemtype(item)==1)   9 k+ w3 Q/ S# ~. w% \+ L9 k
  4. { startop=1;
    . f; k1 L, |- R, ]2 f
  5. totalop=2;; g) F7 P' \- F" r
  6. }9 f0 w" L6 F' S! D& T& L& O- d
  7. else   * i4 |! B( Y* O" o- m8 I8 q
  8. {$ `  \& b/ o& }7 \: K4 Y2 n
  9. startop=3;
    7 @5 ?$ `* h1 n; J/ r' A  R3 k
  10. totalop=3;4 A: m% Y8 V9 ~. N8 u
  11. }
    - v5 D& D; d8 x2 \; V) v$ R+ v
  12. doublearray openports = makearray(totalop);
    1 H' X/ n0 s. Z7 R% a, L
  13. int nrofportsopen = 0;
    2 b* B/ Q% L- t. J
  14. for ( int index = startop; index < startop+totalop; index++) 9 ^4 Z! D+ l! g! Z. L
  15. {9 r$ b* t2 @' Y. j, \( C- @7 l
  16. if (opavailable(current,index)) - J+ R* o' H& x+ B8 d4 B$ o! v
  17. {( M" T7 V8 w; }4 {9 n
  18.   nrofportsopen++;
    5 ]# B% {& c9 J' J( G3 O1 p4 q+ B
  19.   openports[ nrofportsopen ] = index;
    ) p( [2 _$ o+ r, ~1 t# a" O
  20. }+ K  \  X+ @5 Q- T6 C5 m
  21. }
    3 N& h9 Q9 l, L4 P4 l8 t$ U2 G' s
  22. double returnvalue;
    2 f; h" L8 F# B) @; I1 z
  23. if (nrofportsopen > 0)
    2 c; e; j  R% j; l3 m& r
  24. {
    : ^# @" g2 I  F9 _! c1 ~  M( k
  25. int returnindex = duniform(1, nrofportsopen);
    ; e3 B' p+ C$ q  U
  26. returnvalue = openports[returnindex];
    ; }- t0 ?' \' `8 `9 Z' P! [# U
  27. } else. A! R' ]  E; W0 W+ \" M; D( _9 f
  28.    returnvalue = duniform(startop,startop+totalop-1);
    5 h. i" _4 H+ \- K6 }# }
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。
5 N( f" m" a7 Q3 @, m) p1 I为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。! j- Y) S2 u. M6 u. |$ R, O
解决方法4:8 I( a" l% t7 y: A: ?
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。
# ~% a# s& h5 A9 u/ O& l* K! e剩余加工时间=安装时间+加工时间+进入时间-当前时间
& J! D8 R- t+ O2 `" k删掉以上代码,输入以下代码:
  1. int totalop;
    1 N* O) u; R' h/ N" @
  2. int startop;
    0 _* w/ _4 L$ m% ]) P: F
  3. if (getitemtype(item)==1)   / |; X7 F: i# T4 Z, f3 u" e, k! F
  4. {
    + F0 m  ]. a  }0 {5 c
  5. startop=1;
    8 E! N: k1 a& O- X, G
  6. totalop=2;
    3 I3 J' z0 t2 k9 b" f+ F4 A
  7. }) S$ t' B" v# K* @
  8. else   ( P9 H. W; T7 |
  9. {
    " x, N  \; M- F2 A& k
  10. startop=3;
    1 u8 S* [# H5 n% Q9 {$ h8 F
  11. totalop=3;& ?7 k! n  }6 l4 f$ [' X
  12. }  C9 V8 h* \" ?6 }$ s4 ^* b
  13. double minitime= 2147483647;
    3 L0 B: \. f% g1 u8 y
  14. int returnvalue=0;
    7 l0 `/ c5 V+ A4 n
  15. for (int i = startop; i < totalop+startop ; i++) . T& e" E& L0 |3 j9 D4 Z' J8 u
  16. {
    ; G. N' N5 h1 _# o
  17. double protime=getitemvar(rank(outobject(current,i),1),2);9 Y' I5 P$ s6 d# l
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);
    ( q, a, P( I+ `5 X- N& @5 F
  19. double entrytime=getentrytime(rank(outobject(current,i),1));* b0 |6 z4 I4 V) f
  20. double remainingtime=protime+setuptime+entrytime-time();
    $ x2 a. j0 s$ g0 u
  21. if (remainingtime<minitime)- B; W8 \( {7 A5 v) I
  22. {
    ! n& ^3 G' k5 `' z; g! x- j
  23.   minitime=remainingtime;
    ) H$ ]! U) p' p) i
  24.   returnvalue=i;- @2 L% c; x" p/ O, X2 i4 o
  25. }
    5 w2 F5 S+ p7 s7 c
  26. }3 O8 x8 [+ G0 l$ U, b; J
  27. return returnvalue;) Z/ x8 p2 c9 A' z* i9 n; E
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。. u5 a& P! d5 e9 h
- ?1 k# t1 M; n, w
该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!
0 a5 ^/ f6 k% t4 H[attach]3086[/attach]

作者: Kimver    时间: 2016-5-8 22:30
我也想过这个问题,学习了,点个赞
作者: 慧娴亚伦    时间: 2016-5-9 09:22
用 FlexSim建模要重点领会flex这个词。
7 i; Y2 ^" Q# A: a在FlexSim仿真世界中,抵达一个目的地有无数条路,对于实际建模需求而言,只要能够抵达,那么这条“路”就不孬。但是选择一条更好的更快捷的“路”是一个仿真建模师从入门到精通必须要掌握的一个过程,也是真正区分高手的方法。; C9 |/ n# H* `5 A: W
加老师给出的思考过程,对于深入学习FlexSim是非常重要的,学习仿真过程中提出“能不能用其他方式来完成这个建模要求”只是第一步,更为关键的是能不能通过进一步的思考和测试,通过自己的力量去实现新的解决方式。2 p1 t0 r0 @8 ~) {
但是在这个过程中,千万不要“钻牛角尖”,作为学习是可以尝试各种不同的方法,但是在实际应用中请务必使用最简单最直观的方法。此外,也不要想着一口气就将所有的原理弄透,把一些暂时无法理解的东西记录下来,只要坚持学习使用,就会在逐步深入的过程中“顿悟”原先那些看上去非常不合理的存在。. z5 a  a6 @; Y& I* b" f! G
# ~8 a+ U* L0 m  y
感谢加老师分享。
作者: ldl89772962    时间: 2016-9-30 10:52
感谢老师分享




欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) Powered by Discuz! X3.3