全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-8 16:07:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-8 16:19 编辑
4 l0 ]  x+ f) g5 \) d+ ^8 i
" U  j+ _) @/ M4 T. S- Y估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。8 W9 m, \/ w7 O- K4 P
QQ群里有人在问某案例如果不用拉式策略该怎么办?
; D2 b% f. Z1 t7 W这是一个很简单但又很经典的一个案例,布局如下:
8 H7 f7 g% f: u( Q" G% U$ y: i
这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.
7 v8 T# m6 D$ F  o6 r. A2 ?+ F解决方法1:6 U" ]1 y% v4 e
如果使用拉式策略,在处理器中设置拉入条件即可:
& ?% N5 r" Z& r2 j6 G* y) e5 h* M' O: \" q9 {4 a7 i( _$ D4 [

) @5 \  K; e" h' `/ u" u' a解决方法2:
: @* G& e+ w3 q3 v+ g
有人坚持要用推式策略
- g& Y- P6 f# _+ J! Q+ J在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);4 V  V/ R) l- w. Z! V
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。
& L# X6 N/ \4 J0 m1 e
但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?3 K- M* N4 u% _: E* C
解决方法3:$ W4 s9 h1 l/ N
删掉上面那两行代码,输入以下代码:
  1. int totalop;% U. @' f  {! ]& A! A
  2. int startop;8 ]0 I, l0 ^8 f  c( ^
  3. if (getitemtype(item)==1)   
    6 v: Z; i+ E7 J2 v9 V- B6 ?+ m; {
  4. { startop=1;
      i$ `% R- N2 s6 r* Y% G3 O
  5. totalop=2;8 o+ W* B2 [0 {1 l: S' K6 E
  6. }# }! U/ \3 D8 E. k
  7. else   # ?. q% D- T! X) c  Q# K
  8. {
    * \' v& L" `8 u$ U3 X
  9. startop=3;
    1 j1 L4 ^5 L6 n* W
  10. totalop=3;
    2 C" b! F) p3 ?3 a
  11. }1 _0 V, n  f& z& B
  12. doublearray openports = makearray(totalop);
    $ x$ B% J( s9 G/ ~# U: D1 O5 Q
  13. int nrofportsopen = 0;
    1 u7 J9 P' p% ?/ ?2 c+ _; r: M
  14. for ( int index = startop; index < startop+totalop; index++)
    $ j) Y) B: J8 X" p
  15. {
    - F0 d$ m/ F+ n+ `6 a
  16. if (opavailable(current,index))
    : d9 y" v- _! m' y- u
  17. {; @# ?4 b( P! s* a9 U1 w
  18.   nrofportsopen++;: {2 S! Q$ {& l. @4 d
  19.   openports[ nrofportsopen ] = index;) B* K* D/ U+ I+ |. p  Y% N) P6 [  Y
  20. }. a+ l' o. r6 R; l* M
  21. }; o( ~/ J, t( G, z& }* M! o! D+ `) O
  22. double returnvalue;
    $ A. Y/ a' s) Q8 t, w, C3 i
  23. if (nrofportsopen > 0)
    , b. s: D) V# U; r8 f  ~
  24. {+ _9 T4 u/ G9 w6 G8 [
  25. int returnindex = duniform(1, nrofportsopen);
    / e; q+ y% ~# V0 R+ |
  26. returnvalue = openports[returnindex];3 C6 X4 W- L! G4 X( n
  27. } else
    1 d1 z. \, u6 @: Q# P  \
  28.    returnvalue = duniform(startop,startop+totalop-1);) v8 K. y5 b: O8 i+ o! s4 {
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。% _2 X# X. S1 w) H0 U- D
为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。
  d1 Q4 y/ j: O1 S" E# J* d  F解决方法4:
& b; C7 m6 d( L- ~$ b( {+ _9 u8 H5 Z
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。
# y' @8 t. M+ O! y4 k剩余加工时间=安装时间+加工时间+进入时间-当前时间* C, W5 G9 u9 ^6 \8 W/ b" G
删掉以上代码,输入以下代码:
  1. int totalop;5 u; L0 J( J! P9 R4 [: F) L
  2. int startop;" H+ u8 I) i- n! s
  3. if (getitemtype(item)==1)   ( I) `6 J, I: c$ V, q) p  j2 _1 `' [
  4. {
    $ f+ X- r6 q5 B' C
  5. startop=1;& d. P0 E3 E5 Y* o' P
  6. totalop=2;. q& i5 K/ T: v+ M5 e% ~) \9 B
  7. }
    ' _! g4 I  M9 V0 S$ v
  8. else   
    6 ^0 ~3 K* n% U! R" X, a
  9. {0 Z- X5 X/ V7 s+ c7 N+ X  q
  10. startop=3;! y% i% k( I  k: l9 B
  11. totalop=3;* ?1 Q! W2 i, r0 _9 h/ |9 j
  12. }
    ' p( U5 \, x& I+ R! D+ m
  13. double minitime= 2147483647;
    ! @7 D8 i4 K4 u: a0 B# L, n
  14. int returnvalue=0;' u6 r$ N8 a! B/ p+ D# @9 x
  15. for (int i = startop; i < totalop+startop ; i++)
    : p1 I+ t' d3 e8 [( @) F
  16. {: Q9 t4 @& j  [6 o* U
  17. double protime=getitemvar(rank(outobject(current,i),1),2);
    ; [- l6 w6 S# Z- v/ h/ c$ w; @
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);% ]7 {+ s3 q% ~  J% e, b2 U
  19. double entrytime=getentrytime(rank(outobject(current,i),1));
    , D" i, S; p& C) `1 \1 v/ V
  20. double remainingtime=protime+setuptime+entrytime-time();! G3 Y- [9 E0 y+ S2 B' q% s9 _. W
  21. if (remainingtime<minitime)
    4 |5 U- B8 x* E+ h/ R% M2 U
  22. {& c$ z4 ~: P1 }! o6 r
  23.   minitime=remainingtime;1 M& x: t. S; O) M( j- g6 Y) `% q
  24.   returnvalue=i;
    2 b4 o9 O+ q- `, e/ \) \; |
  25. }( c; Q; W% p) Z7 [2 {  }, `# `" ^9 P
  26. }% r( s; ~+ F( R4 U
  27. return returnvalue;
    ' s9 X$ w1 k/ U
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。  J2 |2 C3 x) N* }- @( K7 j, [
9 V( l; O* u; D  j. d
该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!
: f3 u7 R. p7 p' L$ u( \( }) @

本帖子中包含更多资源

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

x
2#
Kimver 发表于 2016-5-8 22:30:41 | 只看该作者
我也想过这个问题,学习了,点个赞
3#
慧娴亚伦 发表于 2016-5-9 09:22:02 | 只看该作者
用 FlexSim建模要重点领会flex这个词。4 t! v1 _% t5 P+ P/ `  k1 r
在FlexSim仿真世界中,抵达一个目的地有无数条路,对于实际建模需求而言,只要能够抵达,那么这条“路”就不孬。但是选择一条更好的更快捷的“路”是一个仿真建模师从入门到精通必须要掌握的一个过程,也是真正区分高手的方法。8 I, K6 K& ?9 i7 j  t
加老师给出的思考过程,对于深入学习FlexSim是非常重要的,学习仿真过程中提出“能不能用其他方式来完成这个建模要求”只是第一步,更为关键的是能不能通过进一步的思考和测试,通过自己的力量去实现新的解决方式。0 ]" ~( ^7 g' x
但是在这个过程中,千万不要“钻牛角尖”,作为学习是可以尝试各种不同的方法,但是在实际应用中请务必使用最简单最直观的方法。此外,也不要想着一口气就将所有的原理弄透,把一些暂时无法理解的东西记录下来,只要坚持学习使用,就会在逐步深入的过程中“顿悟”原先那些看上去非常不合理的存在。! ]" }. ^& I; J1 N9 u

/ \. x) F0 q0 B" e感谢加老师分享。
4#
ldl89772962 发表于 2016-9-30 10:52:40 | 只看该作者
感谢老师分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-6 10:12 , Processed in 0.061584 second(s), 14 queries .

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

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