|
本帖最后由 zorsite 于 2016-5-8 16:19 编辑 / B+ j4 T/ ]1 v/ C' x1 G5 x
e$ ]9 O9 u6 ~3 B, F) M5 |
估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。
& M' d' r1 m c R& o' C* MQQ群里有人在问某案例如果不用拉式策略该怎么办?5 m$ ~4 _, u! p2 _
这是一个很简单但又很经典的一个案例,布局如下:
/ i( w9 R4 P! Z- i; s- q T6 n
! D6 f0 I9 L" W( x5 {$ q% O$ l, Q: e9 K这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.
! X6 Y$ W- ?3 i4 p* o# c8 k解决方法1:8 Z- c* t' [: ~# H
如果使用拉式策略,在处理器中设置拉入条件即可:, G. z, {4 i! H1 U) U
% `# J0 Z0 L) P
0 B# T" F( M4 j4 C解决方法2:
$ C/ Q1 s x0 ]有人坚持要用推式策略 ) V1 L: P! A4 x( m z4 _; q
在暂存区的发送至端口中编写以下代码:- if (getitemtype(item)==1) return duniform(1,2);% j* q- x& p% F. T) _* r
- else return duniform(3,5);
复制代码简单粗暴,问题解决。注意,记得把处理器中的拉式策略取消。
t$ I/ E' ]% F/ P1 o) \9 j: X但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?; @6 X4 _2 O$ s4 i6 U/ G
解决方法3:
4 Q% k8 s3 D. i* E. c删掉上面那两行代码,输入以下代码:- int totalop;
) f+ n ]1 Z5 f* c- Q3 ` - int startop;0 a& M1 {. Y+ x" }- p* g( `( R
- if (getitemtype(item)==1)
2 b" p' Y8 K- w+ @% Y, y* n - { startop=1;; A4 a, `1 o. o7 T" k' u; Y3 v) }
- totalop=2;
8 `" [1 x! v1 Q9 `1 U1 ^+ N% { - }
/ U( w9 \# B4 `: m/ {& o0 u+ d - else , X$ i5 [( p: U5 L7 c. R2 M0 ]; x& Q( W
- {
8 S( p9 ~! O$ W! w! l - startop=3;5 L1 n. Z6 C" Z) f" `
- totalop=3;
- Q4 v- g" p1 s D: R - }$ V3 A" J* \6 D% ?
- doublearray openports = makearray(totalop);
. o5 g, {7 \/ @4 s - int nrofportsopen = 0;8 ?8 V$ G: y0 |" K7 R
- for ( int index = startop; index < startop+totalop; index++) 7 d' T; {7 b- P6 R! N* q
- {
6 \8 w& `% Z5 ~) H8 w; c - if (opavailable(current,index)) ! v/ G7 t! M# f+ V- i5 n' j
- {( L& p0 y3 z6 [; w; g7 c
- nrofportsopen++;
, a3 c# I/ G( c/ L3 X7 n - openports[ nrofportsopen ] = index;5 ?/ D, E# }0 [+ G5 y' P
- }2 p* X3 o3 I% a' U) `+ o7 V6 l# l
- }' O; b7 u4 G1 q M; ~1 M9 t7 i8 q
- double returnvalue;% @9 s) r2 s! F, T. l5 U- j$ H# I
- if (nrofportsopen > 0)
- L. \; l. @2 q. i5 ] - {
! H' \; J' q; B9 [& E - int returnindex = duniform(1, nrofportsopen);
' u. w- G n+ B7 S. I - returnvalue = openports[returnindex];
* Q N( G& I! v( @ t - } else/ K/ m. f7 G8 T Y4 i, b9 u$ T# w
- returnvalue = duniform(startop,startop+totalop-1);
, R4 w- D4 ?! V- C7 M2 M6 w - return returnvalue;
复制代码 这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。: u5 h: m& }& Y+ H5 k% u5 m
为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。
6 D: [* _3 B3 ]解决方法4:. I, P+ @( V) A& h6 J/ w* H. u
转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。# Y5 L8 E& R# W8 c" M- |
剩余加工时间=安装时间+加工时间+进入时间-当前时间
B4 E$ \; Q9 _ J6 K8 X. x/ o( Z删掉以上代码,输入以下代码:- int totalop;
: g6 e A. n' W) P% \& c. M - int startop;
+ ^/ w: T9 v& K- z, Y& q4 p: R) H8 S - if (getitemtype(item)==1) 6 h# [& H) k. I* H# U0 X
- { + H- N2 ?! e t
- startop=1;
8 V1 I+ e \+ ?0 c s' T+ Z) \ - totalop=2;
4 V' {# P; C$ I+ K* E. q - }9 r$ Q( q" H2 ?& I5 t# k
- else
# M" M4 A" j1 i' ? - {- I7 f8 h" F3 o$ R
- startop=3;' |- p0 x- X1 {5 P, _
- totalop=3; ]; _. r- _3 @( s8 M
- }
1 y1 k+ C" k% f. ~ - double minitime= 2147483647;6 E3 b: j9 e3 |" R/ J# `5 v
- int returnvalue=0;
" c* u4 l8 B0 g' X K' d' H - for (int i = startop; i < totalop+startop ; i++) 9 J! J+ G& E; F0 E
- {
' A: I1 v& A$ W4 ^3 w. t3 w - double protime=getitemvar(rank(outobject(current,i),1),2);
! G4 j8 ~$ `( C. v8 e# L4 Z; t - double setuptime=getitemvar(rank(outobject(current,i),1),3);" @+ C$ v$ y& `* x
- double entrytime=getentrytime(rank(outobject(current,i),1));
8 @9 S: i x$ Q" A" K2 _5 F - double remainingtime=protime+setuptime+entrytime-time();
+ P& h1 ^1 k, G; H - if (remainingtime<minitime)7 _. m$ T& j8 [7 t3 E, [( T) w
- {9 T* w3 e3 d+ K+ U7 d, y# |# @
- minitime=remainingtime;
- k+ c' K1 Y0 t+ z$ _3 m6 W: I3 L& F - returnvalue=i;, s) N) |$ L8 {; P/ d/ W
- }
" A9 [* J. Z# ? - }
]$ H3 K" Y" o" f: `' N - return returnvalue;
+ L) s& Y7 Z1 R6 E% R, }
复制代码 终于把问题解决了,缺点是这段代码不具备随机性。把这段代码加入到上一次代码的else区域试一下?此时可以把发生时间的均值改回10,然后步进模型查看效果。) D7 q2 s* O: W* P0 N4 {
: _, G ^% ^+ K+ t
该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!
3 l8 \; v( `* s% P+ {. c |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|