|
|
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
8 H( d$ B( |9 z1 L- @% r+ V5 f! w以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
7 S: R" ^& I! y' z2 \1 r8 D4 T. Y" I! [$ Y# m$ T" f
- treenode tasksequence = param(1);
5 ^+ T0 `# M) h - Object current = ownerobject(c);
3 E+ X# T, j9 g8 c/ n! z - /**找到距离最近的任务执行器*/
0 V/ b5 ~0 \6 [2 m; l/ a" Q1 ? - /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
5 l8 v# _! H- H6 Z - double curmin = GLOBAL_UNREACHABLE;
8 A! W% c& O/ v P: \! J1 O; W" \, g - int minindex = 0;
9 H2 q! i! n4 x2 u. F - treenode destination = NULL;" A9 R2 A( y* I
- for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) ) @1 p% o9 i7 s: d7 T% n/ l$ U
- { // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
( f$ Y) N) X+ Y7 r: z! w( O - if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
9 O* O5 P# K' O1 [) v1 F - destination = gettaskinvolved(tasksequence,taskrank,1);
. u2 n% v( n$ P9 ~8 x - }
2 M4 t- h7 q4 V* ? - 9 V p- n# O& Q& e
- if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。, _+ `) V2 K O \
- return 0;6 s! B2 ^: _) }* I1 {
0 A- a3 E, Y0 V- //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。8 K/ D# Q1 y; M+ |) M2 S% O. @3 @- B
- for (int index = 1; index <= current.outObjects.length; index++) 1 ^2 X) G! e) m! |+ L2 E
- {2 ~" F( F3 M7 f' s8 s( ~
- treenode curobj = current.outObjects[index];1 Z/ }! P. H" e) {8 o
- if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
7 E8 K0 B/ L5 G) y/ J! }2 b - //中间端口有连接实体,并且该实体为任务执行器3 ^2 X* P# a6 ~+ R& g
- {3 Z- p, g% a0 N& C1 R7 v4 k" ~1 U) p
- double curdist = distancetotravel(curobj, destination);. i% S. P3 _5 Y7 H+ Q0 P0 F
- //计算任务执行器和目的地之间的距离9 W4 Y0 G3 i3 L' B; {, c
- if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
+ S9 X7 r5 I) P, o0 e0 n( n - {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。0 U6 O2 q# Y. t) w6 T
- curmin = curdist;2 R& L* O4 x& M- O" Z G, i% P# @
- minindex = index;
5 |6 f+ _$ x5 N6 Z; T - }
7 d v: S# ~5 g - }- B; L+ K$ F& _- s
- }
# ?4 A% l! F- w6 s2 E5 @4 F
5 q, \/ P9 d+ }- b4 s- return minindex;6 z' h- B* ~% h+ F3 n4 y
- //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码 ' A, [2 S6 T- p. ~8 R1 `& N/ e% C; c
/ |8 Y. I ]; [3 R+ Q随手翻,不保证正确性、可读性。 |
评分
-
查看全部评分
|