|
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。5 k* P7 o8 i8 H& |0 j
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
) K5 ~9 Z; h' C1 K" s+ R
# @% k N1 @0 G1 ]- treenode tasksequence = param(1);
' g( s! {6 c$ s7 c# C - Object current = ownerobject(c);3 R( b4 J. ~ f. C; G
- /**找到距离最近的任务执行器*/" N$ y& `4 u5 k5 A+ q+ c) D
- /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
}$ U! ~. p2 c5 Y+ p" x - double curmin = GLOBAL_UNREACHABLE;, @ q5 A' x5 Q* G4 z
- int minindex = 0;
2 |$ T& Q3 p" u. Z _, j+ J - treenode destination = NULL;( n- K' {6 L; ^: s: S5 d I" \
- for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) 3 Y3 _, f; \8 v7 q- B1 p# v$ w0 B
- { // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
( [$ A" s' l9 t8 |" N3 F. P2 m; U% ~ - if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)# y2 ^4 f6 U/ H, ~; J" ?
- destination = gettaskinvolved(tasksequence,taskrank,1);5 P. G# `+ t+ @0 B
- }* y# G4 l0 e, X; W
- $ G L6 Y) Y& y. A3 S8 P5 {2 u
- if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
- a; \4 S' V) b& U% Q2 C - return 0;5 u3 g/ i8 I1 q/ j0 z
- $ F# k) F6 |% A9 I8 |
- //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。3 f/ [9 ^, N1 h; T
- for (int index = 1; index <= current.outObjects.length; index++)
) H* j" Y( M. m$ M4 L6 N5 T - {$ P; n7 L6 c" u
- treenode curobj = current.outObjects[index];
/ H2 r5 o0 j) J6 O o$ C. @ - if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
7 d! [0 M/ k0 h- ^3 n5 E4 |* k: c/ ] - //中间端口有连接实体,并且该实体为任务执行器* U8 k7 G# T& X
- {
( C" E' ^0 ?- D+ v - double curdist = distancetotravel(curobj, destination);
$ N* L) L' f" G; ^: z' y - //计算任务执行器和目的地之间的距离
) m7 d% ^5 P7 Y8 Z - if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
$ t; v& U2 n+ Y9 k8 Z; I$ N - {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。2 w. y# X1 D# y7 m
- curmin = curdist;
8 ^4 j4 J- s4 _% W6 C- Y - minindex = index;
0 z* r& t" D3 D$ G! m, v - }/ M, \5 |) |% H' `, B |8 V4 S' f
- }
8 a: a* c! z4 d3 q) S, ] - }- ~ d; p7 K0 _ l; `7 ?
" N6 M! A. e) v- t) y7 f$ r- return minindex;+ A% u9 `' O1 @* S% f; E
- //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码 1 t1 q9 H- @* g! x; `$ B
) k/ w5 n, |) o* p8 r
随手翻,不保证正确性、可读性。 |
评分
-
查看全部评分
|