全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-8 16:07:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-8 16:19 编辑 / B+ j4 T/ ]1 v/ C' x1 G5 x
  e$ ]9 O9 u6 ~3 B, F) M5 |
估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。
& M' d' r1 m  c  R& o' C* MQQ群里有人在问某案例如果不用拉式策略该怎么办?5 m$ ~4 _, u! p2 _
这是一个很简单但又很经典的一个案例,布局如下:
/ i( w9 R4 P! Z- i; s- q  T6 n
! D6 f0 I9 L" W( x5 {$ q% O$ l, Q: e9 K这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.
! X6 Y$ W- ?3 i4 p* o# c8 k解决方法1:8 Z- c* t' [: ~# H
如果使用拉式策略,在处理器中设置拉入条件即可:, G. z, {4 i! H1 U) U

% `# J0 Z0 L) P
0 B# T" F( M4 j4 C解决方法2:
$ C/ Q1 s  x0 ]
有人坚持要用推式策略 ) V1 L: P! A4 x( m  z4 _; q
在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);% j* q- x& p% F. T) _* r
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。

  t$ I/ E' ]% F/ P1 o) \9 j: X但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?; @6 X4 _2 O$ s4 i6 U/ G
解决方法3:
4 Q% k8 s3 D. i* E. c删掉上面那两行代码,输入以下代码:
  1. int totalop;
    ) f+ n  ]1 Z5 f* c- Q3 `
  2. int startop;0 a& M1 {. Y+ x" }- p* g( `( R
  3. if (getitemtype(item)==1)   
    2 b" p' Y8 K- w+ @% Y, y* n
  4. { startop=1;; A4 a, `1 o. o7 T" k' u; Y3 v) }
  5. totalop=2;
    8 `" [1 x! v1 Q9 `1 U1 ^+ N% {
  6. }
    / U( w9 \# B4 `: m/ {& o0 u+ d
  7. else   , X$ i5 [( p: U5 L7 c. R2 M0 ]; x& Q( W
  8. {
    8 S( p9 ~! O$ W! w! l
  9. startop=3;5 L1 n. Z6 C" Z) f" `
  10. totalop=3;
    - Q4 v- g" p1 s  D: R
  11. }$ V3 A" J* \6 D% ?
  12. doublearray openports = makearray(totalop);
    . o5 g, {7 \/ @4 s
  13. int nrofportsopen = 0;8 ?8 V$ G: y0 |" K7 R
  14. for ( int index = startop; index < startop+totalop; index++) 7 d' T; {7 b- P6 R! N* q
  15. {
    6 \8 w& `% Z5 ~) H8 w; c
  16. if (opavailable(current,index)) ! v/ G7 t! M# f+ V- i5 n' j
  17. {( L& p0 y3 z6 [; w; g7 c
  18.   nrofportsopen++;
    , a3 c# I/ G( c/ L3 X7 n
  19.   openports[ nrofportsopen ] = index;5 ?/ D, E# }0 [+ G5 y' P
  20. }2 p* X3 o3 I% a' U) `+ o7 V6 l# l
  21. }' O; b7 u4 G1 q  M; ~1 M9 t7 i8 q
  22. double returnvalue;% @9 s) r2 s! F, T. l5 U- j$ H# I
  23. if (nrofportsopen > 0)
    - L. \; l. @2 q. i5 ]
  24. {
    ! H' \; J' q; B9 [& E
  25. int returnindex = duniform(1, nrofportsopen);
    ' u. w- G  n+ B7 S. I
  26. returnvalue = openports[returnindex];
    * Q  N( G& I! v( @  t
  27. } else/ K/ m. f7 G8 T  Y4 i, b9 u$ T# w
  28.    returnvalue = duniform(startop,startop+totalop-1);
    , R4 w- D4 ?! V- C7 M2 M6 w
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。: u5 h: m& }& Y+ H5 k% u5 m
为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。
6 D: [* _3 B3 ]解决方法4:. I, P+ @( V) A& h6 J/ w* H. u
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。# Y5 L8 E& R# W8 c" M- |
剩余加工时间=安装时间+加工时间+进入时间-当前时间
  B4 E$ \; Q9 _  J6 K8 X. x/ o( Z删掉以上代码,输入以下代码:
  1. int totalop;
    : g6 e  A. n' W) P% \& c. M
  2. int startop;
    + ^/ w: T9 v& K- z, Y& q4 p: R) H8 S
  3. if (getitemtype(item)==1)   6 h# [& H) k. I* H# U0 X
  4. { + H- N2 ?! e  t
  5. startop=1;
    8 V1 I+ e  \+ ?0 c  s' T+ Z) \
  6. totalop=2;
    4 V' {# P; C$ I+ K* E. q
  7. }9 r$ Q( q" H2 ?& I5 t# k
  8. else   
    # M" M4 A" j1 i' ?
  9. {- I7 f8 h" F3 o$ R
  10. startop=3;' |- p0 x- X1 {5 P, _
  11. totalop=3;  ]; _. r- _3 @( s8 M
  12. }
    1 y1 k+ C" k% f. ~
  13. double minitime= 2147483647;6 E3 b: j9 e3 |" R/ J# `5 v
  14. int returnvalue=0;
    " c* u4 l8 B0 g' X  K' d' H
  15. for (int i = startop; i < totalop+startop ; i++) 9 J! J+ G& E; F0 E
  16. {
    ' A: I1 v& A$ W4 ^3 w. t3 w
  17. double protime=getitemvar(rank(outobject(current,i),1),2);
    ! G4 j8 ~$ `( C. v8 e# L4 Z; t
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);" @+ C$ v$ y& `* x
  19. double entrytime=getentrytime(rank(outobject(current,i),1));
    8 @9 S: i  x$ Q" A" K2 _5 F
  20. double remainingtime=protime+setuptime+entrytime-time();
    + P& h1 ^1 k, G; H
  21. if (remainingtime<minitime)7 _. m$ T& j8 [7 t3 E, [( T) w
  22. {9 T* w3 e3 d+ K+ U7 d, y# |# @
  23.   minitime=remainingtime;
    - k+ c' K1 Y0 t+ z$ _3 m6 W: I3 L& F
  24.   returnvalue=i;, s) N) |$ L8 {; P/ d/ W
  25. }
    " A9 [* J. Z# ?
  26. }
      ]$ H3 K" Y" o" f: `' N
  27. return returnvalue;
    + L) s& Y7 Z1 R6 E% R, }
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。) D7 q2 s* O: W* P0 N4 {
: _, G  ^% ^+ K+ t
该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!
3 l8 \; v( `* s% P+ {. c

本帖子中包含更多资源

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

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

本版积分规则

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

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

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

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