全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-8 16:07:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-8 16:19 编辑 ! i# K  E/ ^/ z" a9 S! U

, H" A: [4 D1 }估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。2 V+ K; Q1 o& u; Z* ^1 [
QQ群里有人在问某案例如果不用拉式策略该怎么办?
. i1 }$ o# S, a$ ?9 [0 Y. ~这是一个很简单但又很经典的一个案例,布局如下:
3 ]8 c! z: {8 G3 x9 C  v1 ?
  J4 R+ V2 H5 W这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.& ]& u( i( h! N" a& }" N0 p
解决方法1:
# g& g6 `: Y$ s4 R$ Z如果使用拉式策略,在处理器中设置拉入条件即可:5 z) U- x# @) }# d# y

3 p" F2 W6 p! a7 o3 n( A1 E* E7 D2 ]+ T" w1 q6 {
解决方法2:# H, u- u: u1 b
有人坚持要用推式策略 $ ~& E  J+ ]1 d6 x2 a
在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);. F, @" n/ T: }) P
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。
3 x2 q7 V+ i# b6 @
但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?$ m3 l3 }: \3 K2 D, N7 y+ R
解决方法3:
# E* \" S) k7 N# q: t删掉上面那两行代码,输入以下代码:
  1. int totalop;, d4 k" x! Z) D# }: N+ H# p% h! y
  2. int startop;
    + U5 U5 T+ e) y# B6 w
  3. if (getitemtype(item)==1)   
    3 f: }# h% p6 r5 G7 J$ F
  4. { startop=1;' V9 C" K. O, {2 u6 k# S! T
  5. totalop=2;$ u/ y& V/ _. x8 s6 M
  6. }8 {# q( `" e2 N- Y! H2 a
  7. else   
    & c9 {! H, j+ k% s8 `0 [8 o6 Q
  8. {
    2 n$ B- J+ G2 s* ]' L2 C
  9. startop=3;3 M  ?# w2 x+ A
  10. totalop=3;
    ! ~# j7 j2 D; j1 s
  11. }
    : J2 y  H. Y& E, c' i. Y9 C
  12. doublearray openports = makearray(totalop);. F2 Q' `0 x7 J6 `7 B
  13. int nrofportsopen = 0;
    " B: S1 l  N! X1 R* A0 b
  14. for ( int index = startop; index < startop+totalop; index++)
    $ q/ ]5 g$ @. \4 M+ Z6 M: f
  15. {
    & y/ m4 j6 s8 u0 u
  16. if (opavailable(current,index)) 8 s+ u- b1 Y4 R: f; G8 q
  17. {) e1 z6 u+ u9 T  A! F$ X9 t
  18.   nrofportsopen++;& w! T- N6 j6 A  I% i* i% g( _3 o) ]
  19.   openports[ nrofportsopen ] = index;
    # q+ q5 D4 V9 ]  R" r5 J
  20. }5 V; w6 K6 j5 ~  z$ B: d  O
  21. }5 ]" F3 N; }7 ~. m) g
  22. double returnvalue;% M# y/ ?$ F. B! m6 e2 p% {
  23. if (nrofportsopen > 0) 2 V, c7 T, K, v- C; M" M* \
  24. {- e: `6 q' S! A4 k# ^  N
  25. int returnindex = duniform(1, nrofportsopen);
    ! m! K4 V1 L% E, A
  26. returnvalue = openports[returnindex];0 `, p) U* G% {2 f6 k
  27. } else
    # T- v; b! {. V  f, ]4 }
  28.    returnvalue = duniform(startop,startop+totalop-1);
    ; p) w0 R; z" R
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。
/ O- w" c' x$ Z' u7 \( M为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。
4 P+ H5 e- A4 V- v! c! `: S解决方法4:' \3 ?5 \/ w: f9 c) u3 A) [
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。- v& y( L; c  W  b4 q
剩余加工时间=安装时间+加工时间+进入时间-当前时间
5 W* R' f+ Y& g删掉以上代码,输入以下代码:
  1. int totalop;$ ^$ ?+ F) A& u' s- L
  2. int startop;
    * I/ q! z. u% T# M
  3. if (getitemtype(item)==1)   
    ) X* A+ u$ U' d4 O3 }. J
  4. {
    # T8 t/ A- V0 L" n
  5. startop=1;! e  L9 M9 b. ~1 C: y
  6. totalop=2;
    ' q- P  B3 X9 }: w
  7. }
    9 E: Y4 L2 R5 t" a9 X
  8. else   
    . m0 S. ~9 ^0 i. T2 R# V! R7 s
  9. {  u; o/ |8 G, C  [
  10. startop=3;
    % j5 L$ A& Y' R9 {! G
  11. totalop=3;' k; H  F# Y# e7 U
  12. }) Y/ b+ T. r8 [3 Z5 _, d
  13. double minitime= 2147483647;* ~# ?- i% F% U  Y8 @2 m, V7 ~6 G  z
  14. int returnvalue=0;9 T4 `; F+ @( @) X6 N& m
  15. for (int i = startop; i < totalop+startop ; i++)
    5 F# R5 j5 B6 T7 b% O: g% ]6 t
  16. {
    5 {/ j9 E. @1 b; _- G1 `7 v
  17. double protime=getitemvar(rank(outobject(current,i),1),2);
    % U9 {! ^8 l' W1 s8 E1 h& ]1 ]. o
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);8 _# t! d* S, Y/ ~% u3 h8 a
  19. double entrytime=getentrytime(rank(outobject(current,i),1));# n4 E% r9 D! h
  20. double remainingtime=protime+setuptime+entrytime-time();
    " W9 |* s: D1 R" @! X! m5 x
  21. if (remainingtime<minitime)0 I0 p; S9 h0 b# K
  22. {
    2 V/ ~; L& ]" T* z
  23.   minitime=remainingtime;/ P  {' Z' v" _; s: _
  24.   returnvalue=i;% q0 ^' A% d# Q
  25. }
    $ Z. r7 q  @$ x( v( w7 x
  26. }
    9 @8 L. [& w: \" p! p2 R" w
  27. return returnvalue;
    4 F- r. y  R' F& [7 c
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。
: O4 f: E' ?/ t$ V5 W. h4 {. I) ^" l1 h1 g4 i/ z% {6 W1 v8 R
该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!. |+ D- e8 w, s/ x. z

本帖子中包含更多资源

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

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

本版积分规则

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

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

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

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