全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-8 16:07:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-8 16:19 编辑 - N8 g5 ^$ k3 C" z4 T

$ @0 C2 Q- ]8 @1 w/ ?* C, }估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。
$ x( r0 ?0 {' W! H! U$ R5 Y. O, {QQ群里有人在问某案例如果不用拉式策略该怎么办?1 L+ E& T6 F9 L9 r) Y! J
这是一个很简单但又很经典的一个案例,布局如下:
: R4 o. K7 J0 W+ J
0 y3 \% U6 B  B' @这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.
6 U9 X1 A& z/ |/ b解决方法1:
% G# P, V3 {7 N$ C0 K如果使用拉式策略,在处理器中设置拉入条件即可:
3 y) a% L* x( r1 f+ X
% q9 O( H( [% S# |) N
- h! k" h. w6 o8 R0 w解决方法2:
8 N4 g% a- r' [/ u
有人坚持要用推式策略
# c9 z& f8 C( i6 k在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);
    , X% Z4 N. \+ d
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。

2 w6 N8 b, p' U5 R+ d2 A4 O1 o$ s; D! w但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?5 W6 F& y7 A* Q: U
解决方法3:  D- c' P  U2 j" ]/ i
删掉上面那两行代码,输入以下代码:
  1. int totalop;; L1 D6 G* @5 E# f+ D7 B4 ~, M
  2. int startop;
    * w$ i9 K% F4 e/ ]! y3 ^
  3. if (getitemtype(item)==1)   . q' @. K0 V, l
  4. { startop=1;/ H9 H5 S$ c( f
  5. totalop=2;
    - Q5 z3 K. W4 c8 U# b
  6. }
    ; `. N/ |# P. r6 @% M3 H
  7. else   - W6 v' f) H9 O' a
  8. {
    6 u& W2 Z5 t" S
  9. startop=3;/ I" w5 _% X7 G& Q3 ~) q' j9 q
  10. totalop=3;
    ' g0 x: s4 e2 o. M: \$ S. Z/ h
  11. }+ f8 E0 c! w1 \: L# W" G9 x8 X
  12. doublearray openports = makearray(totalop);' D1 N8 @3 G+ C
  13. int nrofportsopen = 0;0 L: h5 I5 t3 S1 A3 h
  14. for ( int index = startop; index < startop+totalop; index++)
    7 V2 K* r; I7 l) j% \+ W) x6 J
  15. {# ^3 D) E2 |9 O% a1 f& {$ L
  16. if (opavailable(current,index))
    4 |; ~  n0 f3 J0 v% g# p
  17. {/ \" k" e1 A0 J) c3 |4 t* f0 k4 a
  18.   nrofportsopen++;
    # u5 i2 X; ]; I5 @% M
  19.   openports[ nrofportsopen ] = index;
    ' ^, g2 A* n7 ~) G- E, ?- ?0 b3 l
  20. }- ?. l& k1 ~+ h: f# _
  21. }
    2 z6 A# f2 G/ {1 ^+ z
  22. double returnvalue;1 ~% N9 I) o7 P# T! r% I
  23. if (nrofportsopen > 0)
    . u$ M+ W9 s8 t( q
  24. {
    9 N  ?2 r! w  G) _7 }* f
  25. int returnindex = duniform(1, nrofportsopen);+ T# q7 {6 |( M: D0 E6 _  L
  26. returnvalue = openports[returnindex];
    / |1 g" H+ d  Y8 }/ U
  27. } else; e3 w9 e# z2 R) g7 R
  28.    returnvalue = duniform(startop,startop+totalop-1);( J6 x+ w+ G8 ?6 W7 {. [
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。
0 R4 a( X- t! l( U2 ~为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。
$ A1 U) ~, c0 B& a9 i7 x/ L解决方法4:3 [+ r# H$ j" `8 h( d+ e# ~
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。" C# Y( w1 V  B( H3 q
剩余加工时间=安装时间+加工时间+进入时间-当前时间
& M, X; ^- O+ o4 C0 o删掉以上代码,输入以下代码:
  1. int totalop;
    $ _  w" j# \1 U0 J5 B
  2. int startop;2 w6 r. u3 i: ]7 n5 i* r9 T& l  z/ L
  3. if (getitemtype(item)==1)   ; u9 A6 `+ G, \# h: ~
  4. { $ W/ D( r4 x7 d5 y) ~/ Z
  5. startop=1;, ?3 s; a1 ^" N3 I$ g
  6. totalop=2;
    ' u" t" ~% q* |. H7 ^
  7. }
    , h2 N' h2 S4 }3 e7 e2 `
  8. else   9 e- Z5 S0 \1 @
  9. {
    # a* F8 I! |# a+ a; H& ^
  10. startop=3;
    ! l- M3 k: F: U) S" c) P
  11. totalop=3;
    2 |& s; C- [5 X% |" N( k
  12. }
      a+ h9 C, N" k5 Y, w
  13. double minitime= 2147483647;
    ( ]% o" ^4 z' E' e! G4 D6 A
  14. int returnvalue=0;& l  W4 Z" V' h5 h5 d
  15. for (int i = startop; i < totalop+startop ; i++) ! z- h6 G+ j( ?2 h
  16. {! l1 Q; w, k" G; W2 l- v# ^( c; \. E7 \
  17. double protime=getitemvar(rank(outobject(current,i),1),2);
    % @% w. Z' Z$ s2 [
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);4 ^+ }5 |& c$ I; I
  19. double entrytime=getentrytime(rank(outobject(current,i),1));
    ! h9 b( k% l$ J7 B. q9 K: y
  20. double remainingtime=protime+setuptime+entrytime-time();
    $ Q4 @+ I+ k& y2 h
  21. if (remainingtime<minitime)
    & j& n9 p$ c1 ^
  22. {1 N9 {- d* T( ^/ Q/ `
  23.   minitime=remainingtime;7 H& [% p: m* u* o2 X) }
  24.   returnvalue=i;% ~1 U/ ]9 R, J: X( T9 R
  25. }
    6 e, Q7 U9 D3 n! V2 ~$ ~* t5 O
  26. }
    ' O" X8 R2 @8 j# Y: {
  27. return returnvalue;
    $ j9 a, U; j. l. L% _/ [( r
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。. ?* x* Z2 a2 k. _# H

6 J9 \1 f( w* b' X4 U4 I, S7 q该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!! S% T. v5 z' {, ~, o' A( i8 Z

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-9-6 12:29 , Processed in 0.089976 second(s), 13 queries .

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

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