|
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。6 ?$ s. d' ~- y7 P+ E& Z" I v* a8 l1 Y
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:( y. c4 C2 u- z9 i2 c9 R, q7 z' C$ w
, `$ I: Z# q* U7 b. P- treenode tasksequence = param(1);
6 h }% q3 m* M3 e) t8 k7 _ - Object current = ownerobject(c);
+ I: `) y0 l5 ?! Z6 x; M& F" I - /**找到距离最近的任务执行器*/5 ^! v& e" w( L/ D6 J
- /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
$ x1 v3 X: l* M2 _* v2 I - double curmin = GLOBAL_UNREACHABLE;( @+ b# g O5 y2 A0 o
- int minindex = 0;. w% {1 }$ I0 b3 I: X
- treenode destination = NULL; d7 b" o4 K$ `* Z' w& S+ A! D
- for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) $ B' `% `1 D! b. I: t% ^
- { // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。+ q+ y7 r9 W3 e( Z- {' d' K5 D
- if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)0 J# s7 @/ c9 r/ Q: M) f8 i
- destination = gettaskinvolved(tasksequence,taskrank,1);
' g! D% H& H% F8 x* h/ a - }
) A y: ~) R+ n
( u% U& E1 R4 h1 p# \; m3 V$ L' H0 K9 E- if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。9 F1 v6 Z6 L# N1 H1 E: [, X' ]
- return 0;
! q' Y, |/ }! A1 d1 b - + Q' \8 r- G( f j" _
- //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
4 p1 L4 [& \% p" T - for (int index = 1; index <= current.outObjects.length; index++)
/ W) \& Z- ^% K" P7 n - {0 h! W! H: M4 L
- treenode curobj = current.outObjects[index];
E' a; c3 a4 @2 y7 e - if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) / k( T/ p5 ?& }7 T, {7 j: y# b1 h
- //中间端口有连接实体,并且该实体为任务执行器
7 R/ y$ x! _3 F( Q$ H$ u: M' u. Y - { K* q$ w& j' t( O+ u
- double curdist = distancetotravel(curobj, destination);
4 [ Q) n6 R4 H4 s( W6 h - //计算任务执行器和目的地之间的距离* N& a h5 N9 O5 j/ k, w& a
- if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) $ _7 k0 X6 y! _. U% z8 S
- {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。3 t/ h1 t4 s. I6 f% g: y0 I1 t" a3 L) `
- curmin = curdist;
/ ^# l8 [. g) X - minindex = index;1 Y: p; a5 \, L9 o+ \
- }* U6 w4 A) t0 R4 A4 w- t
- }
C/ l* X& X( u9 L2 q - }, T+ Q' `' ?7 u0 Y, f) [2 m$ s1 `. }
- 9 P7 H6 |0 l6 r( `7 Y' [
- return minindex;
' N3 ] h8 u* l& ]$ X - //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
# o% V% k! O8 \2 d6 r" b9 x; [% s8 ]" A5 c( ?3 A
随手翻,不保证正确性、可读性。 |
评分
-
查看全部评分
|