全球FlexSim系统仿真中文论坛
标题:
随手翻:任务执行器分配任务给行进距离最短的任务执行器
[打印本页]
作者:
zorsite
时间:
2017-4-24 01:03
标题:
随手翻:任务执行器分配任务给行进距离最短的任务执行器
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
. c7 O& u8 r- c% M
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
, m' h" J' ]6 p2 U# L3 ^
Z* L6 ~ e' [- X) V9 U; l% G* k
treenode tasksequence = param(1);
1 A* A& F# C5 N6 e {: c# j
Object current = ownerobject(c);
7 K4 A5 d# g4 q% v4 L
/**找到距离最近的任务执行器*/
* N/ O2 t, f {1 u
/**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
+ y* d* T) e8 e+ y8 r
double curmin = GLOBAL_UNREACHABLE;
5 p, M, R8 k9 R* ^' A4 s; V% u
int minindex = 0;
" v0 I7 w( P% [ t$ ]) r3 \
treenode destination = NULL;
% h+ I8 x( g# n$ {3 G$ o$ o
for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
4 G/ w* E7 ^! ?' |# m* P
{ // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
0 k3 x" Z! Y! z& P- N7 u# O: _* D
if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
: S! m5 t+ b7 o
destination = gettaskinvolved(tasksequence,taskrank,1);
5 g6 @. u! W0 F8 C1 U+ b8 T
}
, T% R. ~/ k, Z+ x& e
; }6 M3 Q* T0 k5 n M" A4 K
if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
6 p$ P; ?7 i' J( b# v( Z& t& |
return 0;
# z" O5 F ~/ A" d5 f
$ a0 E, h- q' O% u ]
//如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
2 D2 T; N, f1 C' T
for (int index = 1; index <= current.outObjects.length; index++)
' b5 [% v$ O/ V* L" b9 T6 W9 g
{
: t+ m0 {+ J/ F
treenode curobj = current.outObjects[index];
+ V0 `( l8 _9 S! F) w4 |) Z
if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
! i. q2 A5 W4 P* P5 c8 x
//中间端口有连接实体,并且该实体为任务执行器
3 C# }. [* G1 w3 M# z
{
8 P) F; p; t0 [( T% O
double curdist = distancetotravel(curobj, destination);
7 p& ~+ |5 _# M0 ~
//计算任务执行器和目的地之间的距离
5 p2 Z4 d/ r# @. m) }
if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
2 N- y# P8 |$ [+ L3 O
{//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
+ }6 M& j r9 @' p% B- @3 L
curmin = curdist;
+ n, I8 x, @" H" h( G: a
minindex = index;
/ ?; Y" _) h! ~0 w1 H. O
}
0 f) t: G1 M9 D2 d, ?
}
4 D2 C; l& z# l
}
3 x, R/ g8 Y' s6 T, c! H
6 o3 h# D, i4 m8 U
return minindex;
; n5 [; ~. o a1 q h
//返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
9 S# s- w6 D$ @5 Q5 s
7 ]. T1 o+ i% d# R9 a
随手翻,不保证正确性、可读性。
作者:
eb_sun
时间:
2017-4-24 11:08
谢谢大神的分享
欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/)
Powered by Discuz! X3.3