|
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
& |' D3 F* T: F+ U以下为flexsim17.1自带,寻找行进距离最短的任务分配器:- ^3 p% D) }4 m
# v, y4 S# e1 g$ o e- treenode tasksequence = param(1);! P, k) I0 i) B G( S6 I
- Object current = ownerobject(c);! n. l! { I6 }+ h3 A+ p
- /**找到距离最近的任务执行器*/4 F5 L& X \3 b& s$ e! x- p
- /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
6 {0 D& f8 l1 }4 D - double curmin = GLOBAL_UNREACHABLE; _8 {6 r- Q2 p3 F, |
- int minindex = 0;
. j0 u+ |! a$ d7 t. H0 i" e7 [$ G - treenode destination = NULL;
* U- D, S/ |! O7 l - for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
' a0 Z' E1 H* f& t" p' e - { // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。) w* [! `! X3 K$ e# z2 L* i a
- if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)( H# K: u* \6 j! P) k
- destination = gettaskinvolved(tasksequence,taskrank,1);& M: G4 U8 ?) `; |; d, Q7 h
- }
% h6 ^2 ^6 {+ V0 L - 3 h5 N# P4 T) }7 L& x$ ^; L1 ^
- if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。$ d J7 H: Z, o/ A! | k% i1 }
- return 0;
" m5 R, h; o/ c3 r - 6 L1 O/ K2 N8 m1 K
- //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
% ^: m. X$ ]0 N - for (int index = 1; index <= current.outObjects.length; index++)
5 s# P d+ K( H" Z/ F3 _- W- h - {
% [( e1 d7 F2 U# ` - treenode curobj = current.outObjects[index];
2 U6 T& f, n& b& B1 B - if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) ' W8 ?4 n' q: y' [0 ~
- //中间端口有连接实体,并且该实体为任务执行器
8 }/ q( C ]; F3 r7 Q - {
n% C. P# J) x3 u/ M+ Q6 y - double curdist = distancetotravel(curobj, destination);* G5 b, j4 O& M- K. F+ Y" w0 I
- //计算任务执行器和目的地之间的距离; o- x& H4 H( G P. O
- if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
; j2 G- h$ A: Q2 r3 U7 {" _7 C v - {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
7 P- p- c" i7 J2 D% ]6 I/ n) b. X7 I - curmin = curdist;
Q7 m! u$ C9 V$ T" A3 P9 x& @% _ - minindex = index;3 ~& k5 V0 s* k! X8 z
- }0 P. e6 |1 x9 K: I* z, x( s
- }+ O2 O, D6 c1 f6 J; O, |
- }1 V6 u& k6 G1 [- C" e; L
- $ g" D& U' D& H9 ?$ V
- return minindex;& x) Z% Q2 B3 z' W1 |
- //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码 3 Z, @0 v' Y2 E" j1 K0 R7 p
" j# I8 O- h" o3 i
随手翻,不保证正确性、可读性。 |
评分
-
查看全部评分
|