全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-8 16:07:19 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-8 16:19 编辑
8 g! `+ u3 j; R5 W5 n# Z+ q1 _2 W
( `$ i/ r( N0 ^& O1 Y! h9 ?6 L估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。
4 @) K% ~( y7 ^# O7 x( L5 Z" yQQ群里有人在问某案例如果不用拉式策略该怎么办?
% s# S- Y! j' U' n, }* X这是一个很简单但又很经典的一个案例,布局如下:
" a! X% m  v- O( G% M) r) U& j2 Y4 f
这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.
. m7 A7 l4 a5 Z" N. F4 C1 y' d解决方法1:; }2 a' S( W2 b" @
如果使用拉式策略,在处理器中设置拉入条件即可:7 j1 I- F6 r6 @2 C* `/ z3 o
" X- [! p  k- L) Y. \$ d6 r, G

' ~+ T: x( J# U1 Z解决方法2:
/ K% B4 K2 \) |# |! |
有人坚持要用推式策略
9 U1 I  ~/ w) L' T! w+ e在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);
    0 r" m0 e* e7 G
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。
" d# _# w$ l9 V& V
但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?9 H3 H5 z- y4 g) u
解决方法3:
- v. {0 K; ?8 _5 P; Q  r2 k1 T删掉上面那两行代码,输入以下代码:
  1. int totalop;" }& M! g' f' x8 l: ]1 ]4 O
  2. int startop;
    , x+ G; O+ g* R
  3. if (getitemtype(item)==1)   
    + j; m; V4 x6 C5 ]2 X
  4. { startop=1;6 B* d  j. B4 n/ d' T: U8 O$ Z* L7 b
  5. totalop=2;& C" w# W( N1 `! D/ t' }
  6. }- S2 J  O! q0 |# Q
  7. else   : y# b) f3 U7 r) C. R3 _7 T
  8. {
    1 j& Y* X! I: l4 a' ~" T5 B
  9. startop=3;
    2 q; \' g9 D7 |
  10. totalop=3;
    4 ?# M$ y+ `" i7 `8 n* Q
  11. }: J$ T9 H/ |7 X7 L1 P1 J# w
  12. doublearray openports = makearray(totalop);8 H$ G6 k* \# X$ ~
  13. int nrofportsopen = 0;
    ; O: H1 Y: C7 y# p
  14. for ( int index = startop; index < startop+totalop; index++)
    " |) @- s- `# I) R, H+ x4 i
  15. {
    ! M. p# ~6 c9 L/ Z# t6 M
  16. if (opavailable(current,index)) % D+ j# O! d' y
  17. {$ Y7 c/ q, I7 }# _  n
  18.   nrofportsopen++;4 \& F# F  C' Y' h) H$ Q
  19.   openports[ nrofportsopen ] = index;  v# K+ u- i4 n: U* A5 G+ `
  20. }2 A2 c: L' ?! o4 e" m3 A2 |0 \
  21. }7 c2 _% g! f/ ~+ ~; _, g0 x
  22. double returnvalue;3 N4 R& J" _/ `0 {  T) B/ _" x
  23. if (nrofportsopen > 0)
    . q$ @  o+ I2 w+ U1 w
  24. {3 ?( p7 h; E  {9 z
  25. int returnindex = duniform(1, nrofportsopen);4 o7 K8 A3 C$ z) x0 f% m1 o
  26. returnvalue = openports[returnindex];  t! }0 h7 \( ^! u
  27. } else
    ; K3 G- [4 K  C$ U5 A  x4 ?* O
  28.    returnvalue = duniform(startop,startop+totalop-1);7 M. M& C% z6 [% I7 F* C
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。& h; z* v$ a* D6 Q3 D& R2 I: n
为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。( S: L6 n  l% y+ S
解决方法4:
5 V7 B5 A! T) e8 H. p
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。& Y9 \* c8 G' t% q. Q
剩余加工时间=安装时间+加工时间+进入时间-当前时间
. g. I' d% P4 y. i" [. Y删掉以上代码,输入以下代码:
  1. int totalop;
    3 e+ v  u+ a4 z0 x: P* `
  2. int startop;
    0 A' @. u! L9 w% _3 J
  3. if (getitemtype(item)==1)   , s- [1 T2 F1 }0 t
  4. { / W* Q2 f' ^* u1 g- S( P) r" T+ [
  5. startop=1;: Z4 j9 Y, P. _( ?' z- p$ I, L
  6. totalop=2;
    4 E$ T# v: l. M. @  v
  7. }
    ; x/ n  @. S7 O# O0 `. f, ]
  8. else     J) `* `) b  h
  9. {
    $ U6 \; h; d7 [1 ~1 w
  10. startop=3;- V. K) u& ?. ]6 ]1 a, Y, _- N
  11. totalop=3;
    0 A4 a  ^: E8 E
  12. }
    & q) O0 o, ]: f/ P4 |
  13. double minitime= 2147483647;  r% |* a6 {& y/ J& [
  14. int returnvalue=0;2 l6 A7 Q  E. p2 R$ D; \7 R+ l
  15. for (int i = startop; i < totalop+startop ; i++)
    ) o4 Y  d! }/ |- d+ Q. ~
  16. {+ E( p& A$ ~; X: `8 t3 q
  17. double protime=getitemvar(rank(outobject(current,i),1),2);! M" \8 M5 ]- D: m8 T' C
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);& _( \& d) R. x4 J$ S
  19. double entrytime=getentrytime(rank(outobject(current,i),1));' M0 N( _0 @6 \4 F9 o; A
  20. double remainingtime=protime+setuptime+entrytime-time();
    , U7 w5 @7 ]) ?, |* a
  21. if (remainingtime<minitime)
    ' [3 C7 m4 |0 S& T& M+ q% U- X( Y
  22. {
    ) v8 X* T6 ^% ?. m- q& [) A) d
  23.   minitime=remainingtime;8 c( |( x. a. h
  24.   returnvalue=i;4 ]. J! u4 y8 V
  25. }
    & s9 _- Q, J4 l( Y4 G" Z- @
  26. }
    8 n0 g# t% n+ m
  27. return returnvalue;4 i% T, ]  n+ x# B7 R* H
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。5 _) G9 E9 T) I/ Q* _, f

# \0 |  l# r" P) x" e2 G0 o该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!
" o- _6 C) S% E; U6 S

本帖子中包含更多资源

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

x
4#
ldl89772962 发表于 2016-9-30 10:52:40 | 只看该作者
感谢老师分享
3#
慧娴亚伦 发表于 2016-5-9 09:22:02 | 只看该作者
用 FlexSim建模要重点领会flex这个词。+ F3 {% j! |- z7 h% M
在FlexSim仿真世界中,抵达一个目的地有无数条路,对于实际建模需求而言,只要能够抵达,那么这条“路”就不孬。但是选择一条更好的更快捷的“路”是一个仿真建模师从入门到精通必须要掌握的一个过程,也是真正区分高手的方法。8 `# V- ?6 a, K- n
加老师给出的思考过程,对于深入学习FlexSim是非常重要的,学习仿真过程中提出“能不能用其他方式来完成这个建模要求”只是第一步,更为关键的是能不能通过进一步的思考和测试,通过自己的力量去实现新的解决方式。
& x6 C! y- a8 Z8 x2 E9 N但是在这个过程中,千万不要“钻牛角尖”,作为学习是可以尝试各种不同的方法,但是在实际应用中请务必使用最简单最直观的方法。此外,也不要想着一口气就将所有的原理弄透,把一些暂时无法理解的东西记录下来,只要坚持学习使用,就会在逐步深入的过程中“顿悟”原先那些看上去非常不合理的存在。
7 C0 j& q3 d/ P7 e5 h6 g: T8 O
4 h4 S- c/ K5 M1 ]! J# h  w3 m感谢加老师分享。
2#
Kimver 发表于 2016-5-8 22:30:41 | 只看该作者
我也想过这个问题,学习了,点个赞
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

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