|
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。2 _1 B! ^5 M) Y
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:6 ^6 g+ n t! u2 n6 M$ q" m
$ Y" w+ q5 Z9 J9 A. T; f
- treenode tasksequence = param(1);# B/ f9 u6 s: w5 Y* R4 T2 H" O
- Object current = ownerobject(c);
. o% H- o3 P a - /**找到距离最近的任务执行器*/6 q1 Y) q' _) T. Y4 p3 k3 n4 a: I
- /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/9 d9 F2 d( f* d9 m8 [
- double curmin = GLOBAL_UNREACHABLE;
1 B, s* K. \7 D1 d3 P - int minindex = 0;
* E: _9 m- f' A6 t) } - treenode destination = NULL;
& N7 y( G+ b. V) l$ i* U/ M9 r0 ~ - for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
' Z. p, [ Z4 y Z E. g - { // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
( V7 H* s; G/ v" P+ h. i - if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
2 m4 T+ J3 i) R2 k/ |9 p - destination = gettaskinvolved(tasksequence,taskrank,1);7 a" N3 b2 C3 d1 V0 m A- @% q
- }8 \: c, |- R" L G) y
- ) y, m' R+ T. |
- if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
( Y4 t. @% p& Y, L - return 0;/ v) A: d% C/ J1 D! w/ h$ `! t+ T
5 m" H3 R( D& _/ S1 y+ U- //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。- @& D4 k7 D$ R; p F$ y
- for (int index = 1; index <= current.outObjects.length; index++)
7 @& d2 c" x8 X% r6 J/ s+ ~ - {( o @* v& I8 `+ T" e# A6 N+ H
- treenode curobj = current.outObjects[index];9 V C9 f% h$ f% l$ m
- if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
2 @3 t D% F! e: h0 Q W - //中间端口有连接实体,并且该实体为任务执行器, X7 C# [$ n" y4 {
- {
! s- Z+ U U$ p8 N" y( G - double curdist = distancetotravel(curobj, destination);
0 S1 u/ ^ ]) I - //计算任务执行器和目的地之间的距离
Y# e# O2 ^- e+ H5 C+ G - if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
: I* r5 @' h) i- F& p- d4 n - {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
; b# x: R7 F2 v% L - curmin = curdist;- }8 z! `& L9 o
- minindex = index;
( Y/ A/ v7 a) V' r" H. F4 e- n - }* W( D4 R, P( j( `& _ \
- }
% A3 v5 d6 H6 c$ D - }
' t5 `9 t3 e, X6 U7 o
" K( W7 w! H+ B5 c- return minindex;
* d/ G6 |; s# n0 Q* p/ j - //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
" a$ F$ v0 Y0 k1 J2 a! |* Q/ K2 ~
随手翻,不保证正确性、可读性。 |
评分
-
查看全部评分
|