全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-8 16:07:19 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-8 16:19 编辑 6 L4 s0 j" P2 t$ n- ^. v: D8 f# ^
. Z0 W  u/ ~7 ?. ?! w
估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。
0 s( l% M+ k  J4 X3 P7 R* X, D) o! R% uQQ群里有人在问某案例如果不用拉式策略该怎么办?
5 g) Y) F1 v4 M这是一个很简单但又很经典的一个案例,布局如下:- c- x, b' C$ N4 K( S0 g5 b: j

" Q; N3 `, V( s- V5 D# H9 V. X这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.: J- @  b$ G) F5 \3 E6 B# P. N3 ~/ W
解决方法1:* x! i0 G) r2 J, b* Q& _7 m
如果使用拉式策略,在处理器中设置拉入条件即可:
$ h. O" |* m+ I: X, C$ R* k8 K# j6 T2 l% q
, c0 o9 T; B/ s2 v+ H8 T( e- b* I( ]  P
解决方法2:( M% C: q2 z* M; Z  Q1 Q
有人坚持要用推式策略
, O0 e3 e4 M8 Y8 k# d1 c在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);
    ; q& ?/ P0 x! C, c- B: v
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。
0 N2 s, R/ Y& ^( ]5 ~) q
但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?, q0 y  }7 e$ f
解决方法3:
% {! b9 x0 u. o$ Y: Q删掉上面那两行代码,输入以下代码:
  1. int totalop;
    * ]0 d+ @% l: r
  2. int startop;
    5 A7 s" }; t  z- X: F9 U" A$ s4 z
  3. if (getitemtype(item)==1)   
    , X( w: }5 Z4 I
  4. { startop=1;- l4 @) z0 B- J9 o
  5. totalop=2;% F: ~. X# Z# V, g
  6. }4 Q2 g0 j7 {/ G% Z/ D$ C
  7. else   1 W) O8 m( H4 p4 [9 t$ v+ t
  8. {
    ' E. ~' Q- z4 i7 V$ r# M) J( C
  9. startop=3;% c' \0 n& w3 V7 w! Q
  10. totalop=3;6 @- m5 o7 Q: ?( @! d5 o) w
  11. }7 @  r7 _& }+ w" n7 p8 l
  12. doublearray openports = makearray(totalop);" b1 C! O* ?/ Z% `
  13. int nrofportsopen = 0;
    * w8 n0 z2 R2 d6 ~3 v+ M
  14. for ( int index = startop; index < startop+totalop; index++) & W: q4 U0 H* O3 M/ Q( b# f
  15. {
    9 Q9 }. D# K0 N& N" @$ D- v
  16. if (opavailable(current,index)) . T1 o, b! K9 Y5 R8 @/ ~; |$ |
  17. {; K5 L, d3 L/ e6 Q, J7 l* {4 a( }
  18.   nrofportsopen++;
    2 V1 S# v7 [* W1 r' t$ N
  19.   openports[ nrofportsopen ] = index;* ?9 N. C3 x! S9 `9 |4 h5 E9 O: d, p
  20. }
    ; a) `: `( m8 G3 T
  21. }" B. g2 V0 z$ y+ \) \/ H
  22. double returnvalue;
    6 r5 T# d; \; A8 o; w
  23. if (nrofportsopen > 0) ! Y9 N& T* s1 T0 V0 x4 |6 X
  24. {
    ! d( [* E2 ]) v' n, Q
  25. int returnindex = duniform(1, nrofportsopen);, W5 s& X3 |; d  i
  26. returnvalue = openports[returnindex];& v5 L" i, s' x
  27. } else
    + g  `/ @% V! U
  28.    returnvalue = duniform(startop,startop+totalop-1);
    , U( r% X0 A1 ^
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。
; x) h* s$ r' r! l7 B5 |3 q为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。
3 g8 U. [4 d# P6 Z" m7 H) w  S2 Z解决方法4:- h* q9 }9 P0 v# k- x
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。
+ q) H9 m$ n2 t9 K剩余加工时间=安装时间+加工时间+进入时间-当前时间! u$ @4 v' Q. c5 X: K
删掉以上代码,输入以下代码:
  1. int totalop;
    6 u, [* \) E" _  M' L
  2. int startop;: E7 o7 W8 s0 J9 j
  3. if (getitemtype(item)==1)   " i* O$ f0 ~: z7 M
  4. {
    ! j9 f  ~0 L: U5 X
  5. startop=1;
    ) q& w# i6 y# ~) U7 o. R& ~; `9 `
  6. totalop=2;8 Q3 [& L% s! S' p  y% b; M
  7. }
    & b; g8 v! O9 A4 T- D  R
  8. else   
    + E+ m, _, _$ J; H2 }  z* M  T
  9. {7 r; Z( L$ k0 I
  10. startop=3;1 h. \5 V3 h+ a
  11. totalop=3;' p' y+ y' b' m
  12. }
    : ~( x+ g6 }; V  ?( X( |9 ^% r1 Z
  13. double minitime= 2147483647;2 n2 b- D. \  I$ k2 d' g6 L
  14. int returnvalue=0;2 l  y$ n- o3 A/ {* u: F
  15. for (int i = startop; i < totalop+startop ; i++)
    4 I1 i* I$ m& D9 U) r- m
  16. {1 z1 Z; q, E8 J% f7 D. D! b* l
  17. double protime=getitemvar(rank(outobject(current,i),1),2);+ n' C9 _7 q' u- t+ k/ g
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);9 h. U2 a. @% A; x: G; `
  19. double entrytime=getentrytime(rank(outobject(current,i),1));! O, i: v. G3 M  d: t
  20. double remainingtime=protime+setuptime+entrytime-time();
    . z6 r4 i1 L8 n! y4 O
  21. if (remainingtime<minitime)2 r; S- C5 c. b; `& l) B. R
  22. {3 G, r) b* p9 ~+ L' K
  23.   minitime=remainingtime;% D+ c1 [0 ^6 a8 ^& D
  24.   returnvalue=i;
    ) a1 r1 r1 E& T4 s
  25. }- a' }- g- D$ U; b$ Y
  26. }
    ; f, h% |1 j0 C  @  Y2 W
  27. return returnvalue;
    0 k: `; U! B/ }4 W
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。
( b$ @4 }7 Y- M( D
. U1 ]( v' q6 q该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!( f( v: O) S' o% d3 f

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-7-1 19:03 , Processed in 0.088342 second(s), 15 queries .

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

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