|
本帖最后由 zorsite 于 2016-5-8 16:19 编辑 6 L4 s0 j" P2 t$ n- ^. v: D8 f# ^
. Z0 W u/ ~7 ?. ?! w
估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。
0 s( l% M+ k J4 X3 P7 R* X, D) o! R% uQQ群里有人在问某案例如果不用拉式策略该怎么办?
5 g) Y) F1 v4 M这是一个很简单但又很经典的一个案例,布局如下:- c- x, b' C$ N4 K( S0 g5 b: j
" Q; N3 `, V( s- V5 D# H9 V. X这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.: J- @ b$ G) F5 \3 E6 B# P. N3 ~/ W
解决方法1:* x! i0 G) r2 J, b* Q& _7 m
如果使用拉式策略,在处理器中设置拉入条件即可:
$ h. O" |* m+ I: X, C$ R* k8 K# j6 T2 l% q
, c0 o9 T; B/ s2 v+ H8 T( e- b* I( ] P
解决方法2:( M% C: q2 z* M; Z Q1 Q
有人坚持要用推式策略
, O0 e3 e4 M8 Y8 k# d1 c在暂存区的发送至端口中编写以下代码:- if (getitemtype(item)==1) return duniform(1,2);
; q& ?/ P0 x! C, c- B: v - else return duniform(3,5);
复制代码简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。 0 N2 s, R/ Y& ^( ]5 ~) q
但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?, q0 y }7 e$ f
解决方法3:
% {! b9 x0 u. o$ Y: Q删掉上面那两行代码,输入以下代码:- int totalop;
* ]0 d+ @% l: r - int startop;
5 A7 s" }; t z- X: F9 U" A$ s4 z - if (getitemtype(item)==1)
, X( w: }5 Z4 I - { startop=1;- l4 @) z0 B- J9 o
- totalop=2;% F: ~. X# Z# V, g
- }4 Q2 g0 j7 {/ G% Z/ D$ C
- else 1 W) O8 m( H4 p4 [9 t$ v+ t
- {
' E. ~' Q- z4 i7 V$ r# M) J( C - startop=3;% c' \0 n& w3 V7 w! Q
- totalop=3;6 @- m5 o7 Q: ?( @! d5 o) w
- }7 @ r7 _& }+ w" n7 p8 l
- doublearray openports = makearray(totalop);" b1 C! O* ?/ Z% `
- int nrofportsopen = 0;
* w8 n0 z2 R2 d6 ~3 v+ M - for ( int index = startop; index < startop+totalop; index++) & W: q4 U0 H* O3 M/ Q( b# f
- {
9 Q9 }. D# K0 N& N" @$ D- v - if (opavailable(current,index)) . T1 o, b! K9 Y5 R8 @/ ~; |$ |
- {; K5 L, d3 L/ e6 Q, J7 l* {4 a( }
- nrofportsopen++;
2 V1 S# v7 [* W1 r' t$ N - openports[ nrofportsopen ] = index;* ?9 N. C3 x! S9 `9 |4 h5 E9 O: d, p
- }
; a) `: `( m8 G3 T - }" B. g2 V0 z$ y+ \) \/ H
- double returnvalue;
6 r5 T# d; \; A8 o; w - if (nrofportsopen > 0) ! Y9 N& T* s1 T0 V0 x4 |6 X
- {
! d( [* E2 ]) v' n, Q - int returnindex = duniform(1, nrofportsopen);, W5 s& X3 |; d i
- returnvalue = openports[returnindex];& v5 L" i, s' x
- } else
+ g `/ @% V! U - returnvalue = duniform(startop,startop+totalop-1);
, U( r% X0 A1 ^ - return returnvalue;
复制代码 这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。
; x) h* s$ r' r! l7 B5 |3 q为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。
3 g8 U. [4 d# P6 Z" m7 H) w S2 Z解决方法4:- h* q9 }9 P0 v# k- x
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。
+ q) H9 m$ n2 t9 K剩余加工时间=安装时间+加工时间+进入时间-当前时间! u$ @4 v' Q. c5 X: K
删掉以上代码,输入以下代码:- int totalop;
6 u, [* \) E" _ M' L - int startop;: E7 o7 W8 s0 J9 j
- if (getitemtype(item)==1) " i* O$ f0 ~: z7 M
- {
! j9 f ~0 L: U5 X - startop=1;
) q& w# i6 y# ~) U7 o. R& ~; `9 ` - totalop=2;8 Q3 [& L% s! S' p y% b; M
- }
& b; g8 v! O9 A4 T- D R - else
+ E+ m, _, _$ J; H2 } z* M T - {7 r; Z( L$ k0 I
- startop=3;1 h. \5 V3 h+ a
- totalop=3;' p' y+ y' b' m
- }
: ~( x+ g6 }; V ?( X( |9 ^% r1 Z - double minitime= 2147483647;2 n2 b- D. \ I$ k2 d' g6 L
- int returnvalue=0;2 l y$ n- o3 A/ {* u: F
- for (int i = startop; i < totalop+startop ; i++)
4 I1 i* I$ m& D9 U) r- m - {1 z1 Z; q, E8 J% f7 D. D! b* l
- double protime=getitemvar(rank(outobject(current,i),1),2);+ n' C9 _7 q' u- t+ k/ g
- double setuptime=getitemvar(rank(outobject(current,i),1),3);9 h. U2 a. @% A; x: G; `
- double entrytime=getentrytime(rank(outobject(current,i),1));! O, i: v. G3 M d: t
- double remainingtime=protime+setuptime+entrytime-time();
. z6 r4 i1 L8 n! y4 O - if (remainingtime<minitime)2 r; S- C5 c. b; `& l) B. R
- {3 G, r) b* p9 ~+ L' K
- minitime=remainingtime;% D+ c1 [0 ^6 a8 ^& D
- returnvalue=i;
) a1 r1 r1 E& T4 s - }- a' }- g- D$ U; b$ Y
- }
; f, h% |1 j0 C @ Y2 W - return returnvalue;
0 k: `; U! B/ }4 W
复制代码 终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。
( b$ @4 }7 Y- M( D
. U1 ]( v' q6 q该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!( f( v: O) S' o% d3 f
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|