|
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
0 g$ y. a" L$ |4 V, f5 ?, v以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
% @$ f9 Y% ~( p; w
4 s' h B6 w1 E2 C' t. n- treenode tasksequence = param(1);
) m1 q7 \& s) ~+ x( O$ Y - Object current = ownerobject(c);9 ^% W6 Y+ f. w# Z4 \6 L) l- J; U
- /**找到距离最近的任务执行器*/
" M! \' O. @3 q1 x - /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/1 U: \0 r2 n k/ Z
- double curmin = GLOBAL_UNREACHABLE;
6 G% d1 W8 X' Y+ t1 N3 l - int minindex = 0;
# t7 V) m" a5 ~ - treenode destination = NULL;
1 r0 _) n6 V5 _9 ` k$ z - for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) 2 g- J6 l1 O) Q5 |2 a( v4 p* q" E3 i
- { // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。% ^6 W& o4 D1 M* ]! z' `" y
- if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)4 z2 N3 e7 i- E- ^) P; ~4 H
- destination = gettaskinvolved(tasksequence,taskrank,1);. ^* b* r; u+ e: J1 }
- }
4 N! W' |+ d! s0 ?4 L - \6 C' r: M* P' K; Q4 }/ @
- if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
/ q- W+ a7 x8 }6 k - return 0;
% A. D6 C% O" u; h+ A6 c - 3 d6 [; m/ A5 D* c1 B! X
- //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
1 d: K" U. b$ t. N3 V8 U7 J7 o4 ] - for (int index = 1; index <= current.outObjects.length; index++)
' a' q6 E3 v. k- |! g- R - {% R: Y: e. e& C0 n: \6 h6 {% m
- treenode curobj = current.outObjects[index];( s5 a0 X! K/ f
- if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
Q) q# E) ]0 A1 F - //中间端口有连接实体,并且该实体为任务执行器
% q' S8 `5 X# n) }, j- t* n - {
) `. D* L4 ~3 Y$ e% T - double curdist = distancetotravel(curobj, destination);
5 z7 [" k+ F$ q- I4 Q0 Z5 o. W% A - //计算任务执行器和目的地之间的距离3 H5 l$ j+ H4 @$ J1 j) L5 K% D% a- S
- if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) 4 e' D ~& r1 S2 q
- {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。+ N& b6 D4 \1 w- R; T
- curmin = curdist;
4 {" V9 s' A) q( R# _$ }2 x/ V - minindex = index;% q! v) R8 L! V. G8 }* l
- }
; D$ D* s( K( ~- U. K# I! X - }' Z# ?: h. @$ R
- }
; Z2 c0 I8 H% C/ h2 e- n7 L K* W
; {' y' |/ E. I" L+ L- @" J- return minindex;+ O7 G3 U; U9 H B4 \
- //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码 8 e% K$ c( T6 Q! i( d. e
& q' x2 Z9 Q, K1 T2 g! w随手翻,不保证正确性、可读性。 |
评分
-
查看全部评分
|