全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-8 16:07:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-8 16:19 编辑
" N5 C' G" T9 l, n/ r# y
, G6 G$ A* p8 N2 q4 c估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。
0 a% G% n; ]0 W& c0 p2 SQQ群里有人在问某案例如果不用拉式策略该怎么办?& Z8 `% F) o3 ?) w3 Z' ?
这是一个很简单但又很经典的一个案例,布局如下:0 T" M% s# N# F- }$ i; K4 r  {
7 j1 K6 w- @1 C
这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.3 D- ~; m; H4 y
解决方法1:, M- }* f" e4 c; L
如果使用拉式策略,在处理器中设置拉入条件即可:
# W6 [! i5 U% o% D* B) I  f9 l9 ]# {9 J. p1 v7 \6 t
0 W9 N4 D! x0 `. \; J
解决方法2:2 u" b4 l  N( D# x- @
有人坚持要用推式策略
% p& B! ?0 K: J. g; t, V在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);
    5 _) e2 l& B! `7 k7 t- R
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。
6 J# W1 `+ T' R/ r) G7 c* r, ~
但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?
7 R7 x& \* w2 l3 j& H, T$ d2 k: I/ M解决方法3:
, x2 w3 W2 X9 x( b$ P; Y6 J, @6 n% ^删掉上面那两行代码,输入以下代码:
  1. int totalop;( A6 {7 X- L, c' r" [! f
  2. int startop;
    / }) n1 j# W* L5 X
  3. if (getitemtype(item)==1)   4 ]' t4 @( O* k3 f2 A7 r& @
  4. { startop=1;
    % ~- C/ O/ b  H6 X- D9 B  K3 v
  5. totalop=2;3 F2 }# z( M$ P$ L4 f. {
  6. }
    2 X( c# d# F% M5 D
  7. else   
    / |; [& u) t9 g) I5 g8 |
  8. {# {$ o3 B% R8 ^& G; I+ W# I
  9. startop=3;7 q3 M" F7 @4 u
  10. totalop=3;
    ! x+ T4 ?( Y7 }* h/ b
  11. }
    ; A2 ]! A# m' \' Y5 I
  12. doublearray openports = makearray(totalop);
    : j7 u# h1 i7 J$ f
  13. int nrofportsopen = 0;; Y+ S  o* ~- K2 z* ~
  14. for ( int index = startop; index < startop+totalop; index++) / U2 P7 h5 g3 O5 ]. j6 ?1 E' _9 y
  15. {
    ) N8 r# g' w* k! @
  16. if (opavailable(current,index)) ) e& c1 N' }/ [
  17. {9 u$ ^5 L) R8 V% t! Y
  18.   nrofportsopen++;
    5 W$ d/ b5 L( k
  19.   openports[ nrofportsopen ] = index;
    8 M; {, x. d2 _  h( A* O! {
  20. }
    % E( ^" ]; E6 Q2 s0 r
  21. }7 Y8 z3 s) G, O5 n
  22. double returnvalue;
    9 N! b) ~" B# g% Q4 F3 w8 S* r
  23. if (nrofportsopen > 0)
    ' z( ]: Y% e5 G. ]2 A. e" b
  24. {
    / p1 j: h0 f7 z9 ?& N
  25. int returnindex = duniform(1, nrofportsopen);7 a; P. F- l3 b3 a- m1 r( ?$ g  y
  26. returnvalue = openports[returnindex];
    % D& Z4 t' a4 e7 s. o/ h9 r
  27. } else
    9 ]$ G; N! [3 j8 ~) E6 j
  28.    returnvalue = duniform(startop,startop+totalop-1);
      v8 M3 w4 v: z& e' d
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。) f9 [- y* Y% j; S
为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。% ?* O9 C) b% l0 g( s
解决方法4:2 o: G* O  l# M7 y0 K
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。
' J2 \7 a+ X5 {& t# n+ {9 P/ U7 y. C剩余加工时间=安装时间+加工时间+进入时间-当前时间
" y9 u4 A; w, w. f, B( T删掉以上代码,输入以下代码:
  1. int totalop;
    ; `5 y" T- H5 ~- K+ Q% z9 {' _
  2. int startop;0 R( ]- p$ ^3 L/ ]1 c
  3. if (getitemtype(item)==1)   
    ' y' c, s. T8 K: k5 V- y
  4. { % p, D8 q) h4 Z' e) E
  5. startop=1;
    5 d( T( S7 D: E) C' Z
  6. totalop=2;+ o2 h( N. H( n( ~; _* r& z
  7. }
    3 f0 m4 W8 S! o; l
  8. else   
    5 Z- X) e4 s: S/ j: q) N
  9. {7 t. q. j1 M) g) ?5 C- m0 h
  10. startop=3;1 l6 ]' E6 J  T! D" n
  11. totalop=3;
    1 Q! \% J. y- r. v, ^
  12. }# Q0 W3 M8 q' Q7 D
  13. double minitime= 2147483647;" \0 q* X$ O9 d# P" B9 N" }1 m
  14. int returnvalue=0;
    " Z0 i& d; _! v" Y( o# v! k
  15. for (int i = startop; i < totalop+startop ; i++)
    0 O$ y9 [( {9 }# n/ Z5 g
  16. {
    $ ]6 e( v, ?7 M( }- Q
  17. double protime=getitemvar(rank(outobject(current,i),1),2);" s$ h' `: ^/ \! Q6 K$ I+ P; }
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);
    ' x2 ]- ~4 d& C
  19. double entrytime=getentrytime(rank(outobject(current,i),1));
    8 X7 W( }6 V4 w
  20. double remainingtime=protime+setuptime+entrytime-time();$ \& |2 @# x6 E# x
  21. if (remainingtime<minitime)
    - _; u1 @4 v  r
  22. {: X- G( C5 }9 u7 J
  23.   minitime=remainingtime;7 T( Q: Z8 s: D
  24.   returnvalue=i;
    5 N$ O- p# F$ H7 T7 d& K( n
  25. }* [" [* f, N, J9 I2 Z
  26. }
    8 W( ]2 P: a; a6 Y. t+ f$ n
  27. return returnvalue;
    0 V# Q6 z6 B( E5 \3 H
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。
3 @1 S1 W  f( Y- p& U* I+ A6 j/ d1 a' l- R) j! x% a( U
该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!
) ~# ^$ t6 R) d

本帖子中包含更多资源

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

x
2#
Kimver 发表于 2016-5-8 22:30:41 | 只看该作者
我也想过这个问题,学习了,点个赞
3#
慧娴亚伦 发表于 2016-5-9 09:22:02 | 只看该作者
用 FlexSim建模要重点领会flex这个词。8 D8 f! Z3 ^3 ^7 R/ @
在FlexSim仿真世界中,抵达一个目的地有无数条路,对于实际建模需求而言,只要能够抵达,那么这条“路”就不孬。但是选择一条更好的更快捷的“路”是一个仿真建模师从入门到精通必须要掌握的一个过程,也是真正区分高手的方法。
1 t- A4 P* o; f, G* [8 p2 T加老师给出的思考过程,对于深入学习FlexSim是非常重要的,学习仿真过程中提出“能不能用其他方式来完成这个建模要求”只是第一步,更为关键的是能不能通过进一步的思考和测试,通过自己的力量去实现新的解决方式。2 k: p; F4 t/ ^
但是在这个过程中,千万不要“钻牛角尖”,作为学习是可以尝试各种不同的方法,但是在实际应用中请务必使用最简单最直观的方法。此外,也不要想着一口气就将所有的原理弄透,把一些暂时无法理解的东西记录下来,只要坚持学习使用,就会在逐步深入的过程中“顿悟”原先那些看上去非常不合理的存在。
5 Q7 k; @$ Y9 Z+ u3 V+ P1 W0 T3 x9 ^1 u
感谢加老师分享。
4#
ldl89772962 发表于 2016-9-30 10:52:40 | 只看该作者
感谢老师分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-30 15:46 , Processed in 0.083693 second(s), 14 queries .

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

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