|
|
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。0 b+ K* C3 _# p4 L3 W
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
6 d5 Z' v ^ o
3 x2 M8 T' g- Y, R- treenode tasksequence = param(1);
4 z: E# H l. k4 ]; x4 S* N9 | - Object current = ownerobject(c);( K0 b$ O% |% Z. S4 q
- /**找到距离最近的任务执行器*/
# E# X8 t5 w1 g+ l p8 q/ P - /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/3 z0 c! J6 L9 I# g5 e5 E# B$ m7 D
- double curmin = GLOBAL_UNREACHABLE;2 Z6 I. \+ B2 a9 ^# t3 [. S4 t; b& ^0 ?2 J
- int minindex = 0;
H; z+ B" P; N5 |. X - treenode destination = NULL;
+ Q( \7 `; m7 F& N9 b: A' i/ q - for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
: c# M* E/ A% {. B$ P5 z - { // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
+ g7 s0 ]2 J# ?) y( l' x - if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)# T% Z; J$ L( @- b
- destination = gettaskinvolved(tasksequence,taskrank,1);4 ^* w6 K B5 t( m- S% `2 X
- }% I+ V$ C4 a7 G) n' j
- 1 U# r' I4 I8 K$ y1 n* s1 A
- if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
+ p7 b! g& {3 B - return 0;
5 h: l( [) O4 i. i - ) ~ K, s" M; b$ [% c4 n* ]
- //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
1 ^) L" Q3 H; \8 r - for (int index = 1; index <= current.outObjects.length; index++) u1 z W# r9 l4 p
- {
4 k$ n9 ] r. J - treenode curobj = current.outObjects[index];
8 D) F7 Q" t6 v/ x+ \: ? - if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
! Q& g# V% v7 V4 i' N/ W! ] - //中间端口有连接实体,并且该实体为任务执行器0 g j Q }/ c A, L* v
- {+ g. T+ q- n" S) H+ q6 ^+ Y* x; E
- double curdist = distancetotravel(curobj, destination);
; l2 o" h+ \8 Z$ w# u - //计算任务执行器和目的地之间的距离
4 A& A9 W' `; ]' e: K" N6 L - if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) & Q+ Q3 p- |' V# O4 f
- {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。. Y2 Q8 Q8 V7 Z) P
- curmin = curdist;6 L( u) l X* f9 P/ L0 t( ?
- minindex = index;" w1 B$ C+ H0 d. ^* i& S( o
- }) R7 @# Z$ o' C: E
- }
+ b7 {' Z' w) y+ N - }
/ y) B( Q1 |6 ~8 c. R* s - + v' U5 r# S: b
- return minindex;, i8 A) D6 E/ K4 ]; N" E
- //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码 $ Q: v: f" g8 V/ H% L" n3 L
0 _- k' y! r$ V9 k
随手翻,不保证正确性、可读性。 |
评分
-
查看全部评分
|