全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-8 16:07:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-8 16:19 编辑 / l8 K1 _5 O- g. I1 D( u: _
  u( U! v. E  l4 L, q
估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。! @- `# C! ?; m& M7 i
QQ群里有人在问某案例如果不用拉式策略该怎么办?: L" B; J5 z2 \/ t& e8 ]+ j& d% i
这是一个很简单但又很经典的一个案例,布局如下:
2 I& U' Q& {% Z: |3 e2 I! K  r
% v4 j4 q/ K6 _这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.
! N4 K8 M3 S; y) `5 E6 n! Y解决方法1:
% S0 W( r! p' k# {0 F如果使用拉式策略,在处理器中设置拉入条件即可:: S9 G" P" Q1 b" e  }

# D2 B' F$ F1 i) L# r! C$ z, Z6 |3 i
解决方法2:' _$ \# E: E4 d9 z
有人坚持要用推式策略 % `: A+ `! g/ D/ D- o* O5 ?
在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);# ]  J+ a# D$ X1 W( R7 _% ^5 x
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。
; V$ r; a* G( ^$ \
但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?
# r  b; q# G& Y  f, a1 u, @解决方法3:
( t- {* L0 b/ ?. L3 s删掉上面那两行代码,输入以下代码:
  1. int totalop;+ h! P3 K8 U7 s& N5 t0 @
  2. int startop;% U) S6 o! [4 T1 @# V( T
  3. if (getitemtype(item)==1)   
    - k$ z7 d( z$ `7 @; m: u( x. t
  4. { startop=1;) E% Q+ b  `3 E0 ]
  5. totalop=2;
    / A3 ]# p6 ]: D7 ]
  6. }
    9 O& w! J; s6 J! Y/ c0 \# s
  7. else   
    . b( O/ {1 J8 ]' D1 H
  8. {
    & I& l5 N2 I8 b. W" o' R
  9. startop=3;: I  _$ h7 Y* c4 [
  10. totalop=3;
    , F! m& N3 j0 c4 I3 A6 w
  11. }
    9 K4 \1 x# v' h
  12. doublearray openports = makearray(totalop);
    ) p$ |- E( p' d6 W! e4 ?
  13. int nrofportsopen = 0;* g9 w% l; }) @& D8 D& ?' _: d
  14. for ( int index = startop; index < startop+totalop; index++) , D- @+ s% P+ V; k/ \
  15. {
    " H% D8 b1 O% }3 Q
  16. if (opavailable(current,index)) ! A5 A  C5 b* _# r, N' `
  17. {
    3 \" Y* J& J3 D& [
  18.   nrofportsopen++;
    ) Q* H% u% P6 f2 t0 E3 N
  19.   openports[ nrofportsopen ] = index;7 F  Z" s3 r4 k) s5 a
  20. }. Q. R( t. k" e7 _+ s* W3 W
  21. }
    9 p8 X- f! c3 x. p$ J
  22. double returnvalue;
    % {5 x4 d8 ^+ ?* T2 {' K6 \
  23. if (nrofportsopen > 0) " X" ^3 p. L& j; W# m! G* V" u/ R
  24. {6 ]% Q$ \" o5 m! ?
  25. int returnindex = duniform(1, nrofportsopen);
    3 o8 L1 y# N5 J5 Z
  26. returnvalue = openports[returnindex];
    ( z4 ]4 G$ Q' W" w6 e7 @% I
  27. } else
    7 `& C( [/ B) u
  28.    returnvalue = duniform(startop,startop+totalop-1);) _' s. t" H' I5 X, u
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。$ N# m2 Q& t. a* ~- k- M
为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。9 d  f# w* M. j+ s
解决方法4:2 W4 n2 f& Z4 J
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。/ a5 u3 V0 |$ Z; C5 c* J& e* u
剩余加工时间=安装时间+加工时间+进入时间-当前时间5 w& Z' |6 p3 E" |: [  t% {+ |9 P( u
删掉以上代码,输入以下代码:
  1. int totalop;
    & P4 H) ]/ v3 k1 V
  2. int startop;4 z1 T6 F2 X5 Y9 X
  3. if (getitemtype(item)==1)   
    ; S& d, T" d* f- A  _
  4. { - i6 t! J9 `4 e
  5. startop=1;' z% d3 e  [3 R$ i
  6. totalop=2;! S' a0 P, s5 o3 i+ F
  7. }( b2 c3 }0 f7 L7 l7 e7 w. n6 Y1 T
  8. else   & p: k2 w- Y' J1 T) o: T" D
  9. {
    ! B5 ~& b) r5 C" R5 v+ W. O4 T* d( v- L
  10. startop=3;
    3 c; p' F. v; I
  11. totalop=3;
    3 Z( Q, P; D2 o5 b
  12. }% U( V/ J$ x$ A5 ?# w
  13. double minitime= 2147483647;9 l5 J7 [6 o5 o* t
  14. int returnvalue=0;. v% x4 h% p7 O  }7 M$ a
  15. for (int i = startop; i < totalop+startop ; i++)
    7 I6 U% g* H& \. O
  16. {
    2 X& R9 S! U( ?3 _
  17. double protime=getitemvar(rank(outobject(current,i),1),2);/ X' D! R  o  V( N0 {
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);
    # N6 F8 l5 |/ \
  19. double entrytime=getentrytime(rank(outobject(current,i),1));
    % `6 L/ q" w9 Y
  20. double remainingtime=protime+setuptime+entrytime-time();; f7 o! v* Z4 w5 q: ~/ H2 x# S9 t
  21. if (remainingtime<minitime)- W- @$ m8 k4 Z. u# E0 h
  22. {0 w  _- W- G/ z
  23.   minitime=remainingtime;  |6 x1 i7 `9 W
  24.   returnvalue=i;
    2 m5 i5 r+ B, N; ^
  25. }" i& C- R2 r  |/ D: ^
  26. }
    " V7 t9 Q3 h9 l3 K$ W
  27. return returnvalue;
    4 K  g4 K7 @# t, i$ b
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。, r- Q  \' M( ?2 D8 l% l

  D# v9 m2 ~1 G; }6 N5 o% A3 A该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!- p7 q+ W4 E9 s9 V" ?* D4 n

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-7-3 02:04 , Processed in 0.088514 second(s), 14 queries .

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

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