全球FlexSim系统仿真中文论坛
标题:
随手翻:任务执行器分配任务给行进距离最短的任务执行器
[打印本页]
作者:
zorsite
时间:
2017-4-24 01:03
标题:
随手翻:任务执行器分配任务给行进距离最短的任务执行器
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
$ v; s' Z5 b, _1 ?
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
4 _ w% G# z3 B* s: _0 F
$ |# z) z3 d- l" f
treenode tasksequence = param(1);
0 V' |. H8 R, d* o | p( X
Object current = ownerobject(c);
, G$ y# G2 a6 `2 T# P" h# W
/**找到距离最近的任务执行器*/
/ r! v/ z& [, ^* A
/**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
% ?* H; ^/ D2 O
double curmin = GLOBAL_UNREACHABLE;
0 J) {/ |- z }4 Y- G2 _
int minindex = 0;
6 L9 z2 e/ F+ P" d& O
treenode destination = NULL;
2 u- i' v* O. G
for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
. z, C5 {; @* d- x0 `
{ // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
6 w$ S- i; a) P. ?
if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
3 B) i6 {( A- g5 C& ?' W3 o
destination = gettaskinvolved(tasksequence,taskrank,1);
3 Y! _5 q4 t. ^3 L
}
. O1 V6 g8 T6 x* u3 u/ L* i z
$ q. j1 r: V) q1 Q' f) ]& p
if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
) [, K0 [% H" m' |, ~3 ]2 b" G7 b+ o
return 0;
2 L, f/ v6 q; w- x% ?2 c
: m/ o# f: \$ f& J/ Q5 ^/ {. l1 I
//如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
) c/ H( ~2 D) F5 o( ^9 b
for (int index = 1; index <= current.outObjects.length; index++)
2 \3 R: K* i6 O7 ]! N' [
{
5 d8 i" U3 @9 |: u8 e
treenode curobj = current.outObjects[index];
' v( c5 J5 ?7 N5 U) _
if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
5 O9 l e4 y8 L$ ?, S
//中间端口有连接实体,并且该实体为任务执行器
$ U% ]; E7 `; j, U" n3 n2 c( V, E
{
8 ~3 H( {3 V' G2 n0 ]; G
double curdist = distancetotravel(curobj, destination);
# g) B6 H; ~! o$ I' ?, Q
//计算任务执行器和目的地之间的距离
# {% r$ ^3 }/ o, h) w8 }
if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
# c" w9 N: |& M T; o
{//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
, p4 p0 {% f4 U' ?1 o- b( V
curmin = curdist;
1 U8 R6 c+ V% E
minindex = index;
2 o. W7 B7 c; @/ i% p
}
; S! q% k/ E6 f! L
}
8 T7 O. \( S! {; I8 U( [
}
* o& t) {: O2 l3 J# Z
; ^; w- \" Y' y& a, Q4 c
return minindex;
, o/ C$ ^+ ?" a
//返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
9 S4 h9 j8 W; m+ o
* ~6 |. j5 w7 u) Y; y
随手翻,不保证正确性、可读性。
作者:
eb_sun
时间:
2017-4-24 11:08
谢谢大神的分享
欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/)
Powered by Discuz! X3.3