全球FlexSim系统仿真中文论坛

搜索
查看: 4103|回复: 3
打印 上一主题 下一主题

【琢磨琢磨推拉】该用推式还是拉式?

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-8 16:07:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-8 16:19 编辑
  o9 Q$ i5 r8 d, T" s
% L2 l' I- ]: y. ]0 S估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。) Q/ [4 E  z  i2 |. e; \
QQ群里有人在问某案例如果不用拉式策略该怎么办?$ d4 b1 P" i6 [, O7 h6 |3 C
这是一个很简单但又很经典的一个案例,布局如下:
/ J) m! J% b+ h6 a4 W, w; j" M* S7 z) @: `
这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.
6 c$ s1 a% x3 O解决方法1:! X" m7 T% z4 P+ n  z
如果使用拉式策略,在处理器中设置拉入条件即可:
; W; I8 t* d% k0 H/ o; `" g0 h3 B
: T! ~, K! Z. E* y& [1 l% U+ x" `# }) j4 @4 [, L
解决方法2:
: `/ b7 A" V+ v. s+ I6 X
有人坚持要用推式策略
# P) Y+ P) @; n1 d4 z' [9 N在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);
    ) G- }! g0 R1 C+ f; X) E1 [4 }+ O
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。

, k, F( B3 q9 H2 `6 s4 Q但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?
8 P5 U" \$ S- t/ Z2 Z1 J2 C解决方法3:
' k8 V* r, Y1 T删掉上面那两行代码,输入以下代码:
  1. int totalop;! W& s4 g7 A1 C' U
  2. int startop;! c) Q4 k" ^  j
  3. if (getitemtype(item)==1)   
    0 F9 W% v6 z8 a: r
  4. { startop=1;) ~! i% i; r9 w, I* r) m
  5. totalop=2;
    ( G/ B9 c2 l& y: ~) n, Y. O1 {$ j! ~& }
  6. }
    , i4 e/ D  d  A" d; P% {
  7. else   0 J9 F$ D5 e, l$ F5 O/ W( d: W7 q
  8. {6 E5 E# q. C* Q4 K- U
  9. startop=3;
    % a. g+ t6 ^. W5 w
  10. totalop=3;8 |0 Z" [; m/ ~' D% I
  11. }6 s9 g7 {6 d2 g
  12. doublearray openports = makearray(totalop);: T. M. n9 j+ u" N: a- z
  13. int nrofportsopen = 0;; \4 }/ E3 Q4 B
  14. for ( int index = startop; index < startop+totalop; index++)
    " _0 c% c, B+ T+ w
  15. {" c( M( t% v; u
  16. if (opavailable(current,index)) ' k" S% d2 s- ^" k& O% d* I) C* I( c
  17. {2 x4 g  B7 N; B6 M  x
  18.   nrofportsopen++;
    - X: M" D6 o6 \* s2 G/ H' y  c
  19.   openports[ nrofportsopen ] = index;
    3 Q6 g4 l- @" n9 A5 f' \! M
  20. }
    6 g, {# J. U8 K) K
  21. }8 j& K: w, M; }
  22. double returnvalue;
    ; \- _0 `3 b, n; j* L) r$ Q% m
  23. if (nrofportsopen > 0) 4 M/ x. s: g# b+ a# j
  24. {
    3 j" U8 X( ]# c
  25. int returnindex = duniform(1, nrofportsopen);- L7 V: Z5 [4 W3 S, H% t
  26. returnvalue = openports[returnindex];$ I, D: h9 W* n+ V1 o- Y6 y: N
  27. } else
    # C/ K# G* Y. J6 y2 D
  28.    returnvalue = duniform(startop,startop+totalop-1);
    ' j$ X2 ^& s0 _) N6 R
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。4 @5 K; T6 N. @; I
为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。
! ?# C3 {7 l" c- B$ R7 _( R解决方法4:
) {% y0 o; G! ]
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。
6 p' e& R' F$ \0 Y2 g4 z剩余加工时间=安装时间+加工时间+进入时间-当前时间$ r% J" |0 Q+ S, x! b
删掉以上代码,输入以下代码:
  1. int totalop;
    , b" A! L# r  r  y& D# z/ H
  2. int startop;) o) ?, b) _3 r0 k8 v
  3. if (getitemtype(item)==1)   " v$ }+ _8 I: |4 O+ T+ G0 v
  4. {
    / o) {: d7 j" M/ ?
  5. startop=1;
    , V8 G; U" e! u
  6. totalop=2;
    / L7 k. R& t0 }
  7. }
    3 ^% R1 A& K+ s: P% e; j7 o6 l7 c
  8. else   
    - m* M, p4 Y0 D( v
  9. {
    , C% j( S! `4 E1 K$ f, u9 \
  10. startop=3;1 j# L- g8 y, {+ m. L2 Y
  11. totalop=3;
    9 d2 Y# R8 {+ O% T
  12. }& Y: Y9 O/ f) @" b
  13. double minitime= 2147483647;/ R, |" `5 W  p+ b
  14. int returnvalue=0;
    - E1 h; X- q# c2 [4 U* u+ r% L7 l
  15. for (int i = startop; i < totalop+startop ; i++) $ G. n$ D) Z: z! }  ^
  16. {
    3 L; K3 t/ g9 X5 N2 G, B
  17. double protime=getitemvar(rank(outobject(current,i),1),2);
    7 K. E1 G6 T! f( K+ `' ^: H
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);
    9 m3 P) Z: p+ c8 Q- ?' ], r
  19. double entrytime=getentrytime(rank(outobject(current,i),1));
    ) I; c. n+ y% M: A
  20. double remainingtime=protime+setuptime+entrytime-time();- o- Z4 ]# o3 M. j8 w0 z* k& x
  21. if (remainingtime<minitime)
    , J. G/ h4 @5 O! G$ z! e
  22. {% d+ F+ O' s+ G
  23.   minitime=remainingtime;4 L$ O- k/ y3 P" P
  24.   returnvalue=i;
    $ G% J& y5 q. Y4 Y  R
  25. }4 V% s5 g3 O! `( ^
  26. }
    ( p( ^1 p+ Z; ?3 r& P  J+ ?
  27. return returnvalue;
    0 H# J1 K8 p) v& K2 r
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。
( E6 t/ t2 \* d' ?
% ?* x/ [! ]2 I9 W该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!
6 L- H& \1 f5 J3 Q" t1 B

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
2#
Kimver 发表于 2016-5-8 22:30:41 | 只看该作者
我也想过这个问题,学习了,点个赞
3#
慧娴亚伦 发表于 2016-5-9 09:22:02 | 只看该作者
用 FlexSim建模要重点领会flex这个词。% A' P! X; S4 P
在FlexSim仿真世界中,抵达一个目的地有无数条路,对于实际建模需求而言,只要能够抵达,那么这条“路”就不孬。但是选择一条更好的更快捷的“路”是一个仿真建模师从入门到精通必须要掌握的一个过程,也是真正区分高手的方法。
4 B8 T1 F& p' s: T  a3 z7 |$ T加老师给出的思考过程,对于深入学习FlexSim是非常重要的,学习仿真过程中提出“能不能用其他方式来完成这个建模要求”只是第一步,更为关键的是能不能通过进一步的思考和测试,通过自己的力量去实现新的解决方式。
; k1 Y2 H( e' i但是在这个过程中,千万不要“钻牛角尖”,作为学习是可以尝试各种不同的方法,但是在实际应用中请务必使用最简单最直观的方法。此外,也不要想着一口气就将所有的原理弄透,把一些暂时无法理解的东西记录下来,只要坚持学习使用,就会在逐步深入的过程中“顿悟”原先那些看上去非常不合理的存在。
! }7 ~& l& M4 L. `" W
) T+ C# J$ ]) L感谢加老师分享。
4#
ldl89772962 发表于 2016-9-30 10:52:40 | 只看该作者
感谢老师分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|全球FlexSim系统仿真中文论坛 ( 京ICP备14043114号-2 )

GMT+8, 2025-6-29 21:06 , Processed in 0.088390 second(s), 14 queries .

Powered by Discuz! X3.3© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表