|
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。$ {5 s0 ]* p$ C. y4 w5 r
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:, c$ x6 z: S n- `; ~& ]& i
7 [+ o2 d6 t& _# {
- treenode tasksequence = param(1);9 ^( z% ?, `+ x+ c
- Object current = ownerobject(c);
: M" R* E1 H6 W# @6 P* ?$ }: A - /**找到距离最近的任务执行器*/' w* Q6 j% a& y
- /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
3 i+ z, P# m4 n4 Z" w8 [ - double curmin = GLOBAL_UNREACHABLE;
' N7 U, J' C$ X: r! a% F8 \ - int minindex = 0;
$ _2 H9 e# H- B - treenode destination = NULL;
$ {) G. t3 D+ o# z - for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) 6 Q6 Q0 r$ i& P0 W2 W) f
- { // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。 D& Z/ b) L$ p: ]" I& |" W8 X0 s/ I+ e
- if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)4 p) o. H% O$ j4 L
- destination = gettaskinvolved(tasksequence,taskrank,1);
$ J) N$ u5 B& F ]4 ?& O& H - }
, F* m) u3 @' g m9 R$ e
: Q( N( ?' p) h4 y6 u1 i7 e- if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
c* Y8 b5 @6 G+ n n - return 0;+ P' ~ W/ ]7 m; J" b
- 8 `( f4 L: J% `. F1 w
- //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。" I1 Q+ `6 }4 R+ m' R! a
- for (int index = 1; index <= current.outObjects.length; index++) 7 A8 ]$ h: @9 i. s1 a
- {9 K) Y5 L/ u) [# F+ C4 |" F. |
- treenode curobj = current.outObjects[index];; K$ Y, C* V( O- a H- V
- if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
, A- y5 Y5 o |( P7 ^- g+ C - //中间端口有连接实体,并且该实体为任务执行器
# r$ a7 E/ q1 y6 \. x - {
. s+ h5 G: L2 `4 j - double curdist = distancetotravel(curobj, destination);
. K# o* m% p) B: J4 B) R - //计算任务执行器和目的地之间的距离
: K9 Y; T9 U* P5 {& z% ? - if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) 3 L6 S0 Z3 G) \0 o& I! q. \
- {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。 f, O5 D8 v6 A' K2 ^/ u* U* ?
- curmin = curdist;
- u, E: S5 P# W7 T Y7 J - minindex = index;
5 o* E3 Z) Z$ X: b& i - }' P$ q. E2 ~* V2 I
- }: e! ]; n8 V- l; g: M
- }* [% m0 `0 u& K/ G
- $ y" x% Z6 h3 G4 G; B. g) V
- return minindex;0 ]3 E# z1 S; d" o$ G4 H, F
- //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码 ! C x, A( E9 o1 T+ J3 A
8 U1 ^5 d: r" E+ _! v/ H7 x3 T6 r7 R随手翻,不保证正确性、可读性。 |
评分
-
查看全部评分
|