|
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
: L# W3 z. [( v% y) y, a以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
' h0 I; E1 Z" K3 y9 _: p) t: x
# y' j) @2 `! ~$ k- treenode tasksequence = param(1);, {, K/ L f, U& n0 |! C# z
- Object current = ownerobject(c);
) Y6 o1 r, N& Z2 n& C- D - /**找到距离最近的任务执行器*/
% C, }+ D; s7 i! |) H8 J - /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
: X/ ?3 ~9 V5 i - double curmin = GLOBAL_UNREACHABLE;) n* [! ~2 u1 J
- int minindex = 0;3 r, U9 |8 }9 S& N* Q, F/ L
- treenode destination = NULL;
+ d& L* [- C A - for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
( f: y4 i- Q4 e - { // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。8 Z7 j6 Q" ~. b* `" E
- if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)( X' p8 e' X O5 e4 D
- destination = gettaskinvolved(tasksequence,taskrank,1);: {# X& @: j+ i4 T4 P6 T& y8 K
- }
4 |1 v7 x9 M$ W' F; @: q$ ` - $ d: k4 P t1 F2 d" S
- if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。1 }0 E' t4 V. ]0 B0 ]) Q
- return 0;
" {$ Z3 ?1 o) G4 ~/ D% }/ A2 E, \
8 T) K1 W) t% a, M" s, y- //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。- l7 K2 L& P& g
- for (int index = 1; index <= current.outObjects.length; index++) & {' K; ~! o. _5 E, w
- {
7 ]/ x- ]& I. }4 @ - treenode curobj = current.outObjects[index]; m5 O* V4 w! c
- if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) 2 W* e8 O% c6 {3 ?! w4 r
- //中间端口有连接实体,并且该实体为任务执行器
8 S8 ` V6 H" C! E% f/ u - {
y- N. p4 ]; B6 c" l- @! R - double curdist = distancetotravel(curobj, destination);
) a. u2 C8 I1 u* I9 z2 F - //计算任务执行器和目的地之间的距离
1 `) K: |7 Z$ F - if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
7 H/ K3 B; V3 w2 B) z - {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。 r/ J8 V. X: d. w
- curmin = curdist;
- b# S) m8 N- p7 ?& u b$ b2 w0 | - minindex = index;
. D: [. u7 T( q0 L - }
4 t4 R( ^+ a E$ R1 T I. K: K0 M; Z - }
6 X% b+ w5 }8 s% V1 Q - }5 m4 I; ^$ N; V) w: i
) J8 k# s; P& N' r6 A- return minindex;. W) R6 w4 M- ]3 M* i9 w
- //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
0 I4 V; S' S* _
, e/ U; i' S- _* r随手翻,不保证正确性、可读性。 |
评分
-
查看全部评分
|