全球FlexSim系统仿真中文论坛

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

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

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

+ x% [7 r8 U( R: K; G* F$ O估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。2 r3 Z; k/ X/ {' d& c& E" `6 U+ B
QQ群里有人在问某案例如果不用拉式策略该怎么办?
* J4 F% x& \1 U, {这是一个很简单但又很经典的一个案例,布局如下:' `" c+ {( }% ^' v. a/ t% X% ~

2 O3 v" w& [0 v* z这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.) }$ R4 X% r2 [9 s# }- d2 t
解决方法1:' h4 f' C4 C; k
如果使用拉式策略,在处理器中设置拉入条件即可:1 {( a. T# M5 S, a) @
7 ~' h" _) ^: q8 n# q

: m* H, Y7 B3 @! d) v, z: P解决方法2:
6 d- q& ~  P, g; b& Z/ y  J
有人坚持要用推式策略
( n9 M! f& a8 s' j在暂存区的发送至端口中编写以下代码:
  1. if (getitemtype(item)==1) return duniform(1,2);
    9 _& Y5 ?" V4 |* Q1 |
  2. else return duniform(3,5);
复制代码
简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。
! y+ P# G9 S: H8 [
但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?& W  j$ t& ?+ N, A; I' [; C
解决方法3:
3 o: Q+ U0 J) L4 @3 y9 M; x% ]删掉上面那两行代码,输入以下代码:
  1. int totalop;) ?; M! h. x+ p& ~3 b* r
  2. int startop;
    5 P8 L/ B6 J9 F/ Z
  3. if (getitemtype(item)==1)   5 L. p% D- f; P/ ?; A4 m
  4. { startop=1;- `0 S& K) F3 G; G  M
  5. totalop=2;: I5 o  u; ~) [3 y" c8 x7 P: K
  6. }# u# I0 ~% [+ X, d3 Z! |& S
  7. else   
    1 u& O' g' f) B
  8. {
    / ~% I' d3 V  [" M2 g# a, Y
  9. startop=3;$ i! I+ [, P! |8 b9 K3 o( Z
  10. totalop=3;
    7 W5 m2 Y4 I% u  r# k7 S
  11. }
    8 `" E- Z- }7 Y( Q' V
  12. doublearray openports = makearray(totalop);7 O( j  n  e) Q/ i: Z2 \2 \
  13. int nrofportsopen = 0;
    3 {5 p% ^& a  q9 X
  14. for ( int index = startop; index < startop+totalop; index++) $ B* b3 d! e" X/ v" Z9 i8 K
  15. {
    2 f- q- Q' Y. b0 ]% r. {
  16. if (opavailable(current,index))
    # x  s" a& w- q0 a3 N* R# W
  17. {2 }# x$ v2 A' F' ?$ c
  18.   nrofportsopen++;: g4 ?2 b7 q; [6 [
  19.   openports[ nrofportsopen ] = index;
    * ^7 f6 V0 n* j8 N9 t& j' u4 L
  20. }
    , R6 X, d) K- y/ _( D& J+ c5 g7 @
  21. }+ I% N& Z- F8 A7 F5 j" [0 p
  22. double returnvalue;0 d0 S5 _* y0 P2 c
  23. if (nrofportsopen > 0)
    6 X; J! J% l6 m* k" n) I3 z
  24. {
    " F% C2 [3 ]* B. R
  25. int returnindex = duniform(1, nrofportsopen);
    2 X! H3 ~  K: t5 L1 |4 d
  26. returnvalue = openports[returnindex];% H& ?9 a9 s. O! x% {( d
  27. } else0 d2 x6 Q7 \: {8 R2 }5 S9 I
  28.    returnvalue = duniform(startop,startop+totalop-1);
    " G! q  M  ?1 d; _
  29. return returnvalue;
复制代码
这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。0 m; j3 [) {# Q; v3 b, ^- |
为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。' f6 L, X# c% o; y6 _' I9 R+ N
解决方法4:
1 N6 N3 P" R# ]# L. l5 ]. A  N$ G, T9 O
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。
# h6 f# @8 C% j% T0 e剩余加工时间=安装时间+加工时间+进入时间-当前时间
" V3 f2 j# Q6 D: ~% I删掉以上代码,输入以下代码:
  1. int totalop;
    7 Z6 P% C$ D" W3 s. s* l
  2. int startop;5 x2 Q& ~; w" B) [9 o' K
  3. if (getitemtype(item)==1)   
    - E  a: L0 ~0 ^3 G0 C$ e6 M
  4. {
    : i) d; J' y$ Y
  5. startop=1;
    4 y$ ~7 t" p" e2 U) {+ z
  6. totalop=2;
    1 q" p/ o# ~: W9 j7 e
  7. }
    8 n- h- y, [, }+ |6 g
  8. else   
    2 S6 m8 R4 h+ {+ e8 w, F
  9. {
    % c" {$ \( C6 ?
  10. startop=3;, O& C$ ?+ |; I  o5 @# f0 _/ K6 k
  11. totalop=3;
    . C8 ]* Z) j5 Z' j, w1 m7 {+ \
  12. }7 [7 Y1 Y* S- }  J
  13. double minitime= 2147483647;
    % ]! w4 Y; U# v3 B
  14. int returnvalue=0;
    ( C: ~3 S$ Q; a# w! t
  15. for (int i = startop; i < totalop+startop ; i++) 3 P! ^! I9 P  H7 T9 D. u3 N$ A! I: Z
  16. {1 ]: c8 R) g# U  j1 I, L
  17. double protime=getitemvar(rank(outobject(current,i),1),2);
    5 v4 v% v3 G% w" U
  18. double setuptime=getitemvar(rank(outobject(current,i),1),3);
    4 B- v9 M3 Q# {  I9 Q
  19. double entrytime=getentrytime(rank(outobject(current,i),1));% o: |4 @9 f1 u/ }% |
  20. double remainingtime=protime+setuptime+entrytime-time();* f% ~5 {% K% }/ @3 X$ M
  21. if (remainingtime<minitime)" t* j# A7 N- `& s; ]& q
  22. {$ d( J& {& h9 j5 v! K
  23.   minitime=remainingtime;
    ; P2 d/ C+ p! m/ o6 P
  24.   returnvalue=i;! B" x% o3 _* Q! r! K6 H
  25. }) q% [' Z* u6 C2 M5 K. Q% Q) ?6 C
  26. }% K& @  K3 B  Y/ ~; p
  27. return returnvalue;! w9 u5 ]7 [  [
复制代码
终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。
, {4 c/ r( ?; X" g0 `: D% Y3 v6 K0 O6 T
该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!2 T" U4 f  }9 s

本帖子中包含更多资源

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

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

本版积分规则

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

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

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

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