全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-8 16:07:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-8 16:19 编辑 1 `& v- Q! W% @' V: v: {. @) B' u
6 ]8 s; t8 x: ]" L  l
估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。2 b% C) {0 j3 j  J
QQ群里有人在问某案例如果不用拉式策略该怎么办?5 K2 F6 `3 w% a+ `" m
这是一个很简单但又很经典的一个案例,布局如下:4 q  L4 _1 X* d6 T+ L+ p: l& p

  J, {" ?- b9 {& D8 e) g这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.
  x6 X& `* K) [解决方法1:
( I( z7 V1 T' L/ o( ^: Y1 ^如果使用拉式策略,在处理器中设置拉入条件即可:
+ M+ O! r8 S# s; S% `
4 Z; l+ C0 d0 N" [8 D/ |* `# C: Q$ B; V/ i
解决方法2:
; s1 g/ ?/ `% e
有人坚持要用推式策略 / C- x  ?% o, a) K$ p' u9 Z
在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);
    * w) @7 p. b% t* W* o8 C* M' b
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。
/ e4 T. X5 x! [% E9 C( w) m
但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?
( ~9 [! y0 p7 n' s  y解决方法3:
& ], l2 w8 ~+ g* Y" j: G, B3 o删掉上面那两行代码,输入以下代码:
  1. int totalop;
      t1 q9 R, P. _) N5 Q* U
  2. int startop;5 r' w; J1 f! {1 ^
  3. if (getitemtype(item)==1)   0 N- X" g* U! t- b( I1 p" D& e7 L
  4. { startop=1;
    " q! I  |2 O+ r6 U) M& ~0 [
  5. totalop=2;; p$ U6 ^8 Z9 ]' U1 j
  6. }
    + }4 \* H, e) [/ h0 B7 U
  7. else   
    % O1 S2 N2 E) }7 L; w: O7 }: S
  8. {
    ' A. u$ q8 _5 @2 B7 w; T& Z
  9. startop=3;
    9 o' K$ o- }6 Z  f* k5 ~4 j
  10. totalop=3;
    , T4 [; x, }4 u) d+ w! p
  11. }
    2 k' x2 U, Q7 @5 s9 `
  12. doublearray openports = makearray(totalop);
    / H0 p# Z& w1 B- y! r7 u, _
  13. int nrofportsopen = 0;
    + z5 n: ~- N6 M
  14. for ( int index = startop; index < startop+totalop; index++)
    6 Z7 c# o3 B' E
  15. {
    7 d7 t5 b- {9 q
  16. if (opavailable(current,index)) ' n* c# Q6 Y/ h3 \5 E# m8 g
  17. {8 I9 Z4 Z+ s' U6 v: ^, ]9 ^8 r
  18.   nrofportsopen++;, {4 L0 m0 X) `& G; m6 M/ N
  19.   openports[ nrofportsopen ] = index;
    + a# O" a9 W9 g* I
  20. }4 h9 d" Y6 u, q# L- \
  21. }
    & y; ?. `5 s; U2 M+ Z( ]# \
  22. double returnvalue;( V" [9 t9 Q7 q0 {! \4 _8 |! R
  23. if (nrofportsopen > 0)
    7 Y1 U8 G4 ^  B
  24. {
    7 m/ @$ C, t3 `3 L) P& @
  25. int returnindex = duniform(1, nrofportsopen);
    5 J7 j( d3 w7 Q* _! p" j
  26. returnvalue = openports[returnindex];( u& T* A+ K1 H2 f, x/ W/ j" d
  27. } else# c# p# O; ^( p% J1 r
  28.    returnvalue = duniform(startop,startop+totalop-1);
    # x8 e/ M) d. I  j' v6 b9 K) f
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。
( D$ t5 x5 S; c" ?4 c* Q为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。! V7 B' x, @) M. Q2 p: j
解决方法4:
8 w4 O: ~6 @- ~; X! D8 l
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。' g1 H- W  L/ K8 F
剩余加工时间=安装时间+加工时间+进入时间-当前时间
0 d$ s4 S+ q/ r删掉以上代码,输入以下代码:
  1. int totalop;8 e3 y1 M/ h% s: i/ ~
  2. int startop;
    % s( q" z8 C3 p: M/ i! j' o
  3. if (getitemtype(item)==1)   $ [, M+ i& [7 p# q
  4. {
    , _3 @! ^, n# z) y
  5. startop=1;
    ( y) r1 k& u# e
  6. totalop=2;
    - H/ H# ~' c* [
  7. }
    ' M# N) [! G$ K
  8. else   
    $ w. D: m1 E4 i
  9. {. Q0 P( U# C* ]1 `( @; h* l
  10. startop=3;% b3 ^3 F% j) t; o! J7 r
  11. totalop=3;) V( b$ u! [5 p
  12. }
    , Q4 Y0 v+ V7 s
  13. double minitime= 2147483647;3 b) u5 C4 O3 A" {% l
  14. int returnvalue=0;4 O9 k/ m6 I# k' U3 }' s1 J
  15. for (int i = startop; i < totalop+startop ; i++) ! Y# b( o' X; C
  16. {8 z9 `1 s, M7 k1 M$ T% |
  17. double protime=getitemvar(rank(outobject(current,i),1),2);, G! u0 ^4 x( s9 ]6 A
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);
    , y* a; q9 e( O) E
  19. double entrytime=getentrytime(rank(outobject(current,i),1));3 U9 T, f# B* s
  20. double remainingtime=protime+setuptime+entrytime-time();
      J/ k3 t5 U/ T9 |+ y" [
  21. if (remainingtime<minitime)
      n8 _7 _, S; X7 R7 p
  22. {
    : s9 E0 B7 ]5 R. p
  23.   minitime=remainingtime;
    ( @1 P% F5 {+ B4 M8 F
  24.   returnvalue=i;2 K. p& L  e8 m+ o3 u* q4 ]" O& _
  25. }
    7 W/ g! F4 R8 i, k) u5 K2 I
  26. }
    ! [* }: |) s# ~* |
  27. return returnvalue;. M# \+ g4 Y! a2 \1 G' b5 j6 }
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。
( {2 l  @# X6 r8 d/ }% W
( b# i5 k% }4 O+ k: ^该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!
% o& Z4 R3 h; ^6 C2 b

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-9-6 14:44 , Processed in 0.069097 second(s), 14 queries .

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

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