全球FlexSim系统仿真中文论坛
标题:
随手翻:任务执行器分配任务给行进距离最短的任务执行器
[打印本页]
作者:
zorsite
时间:
2017-4-24 01:03
标题:
随手翻:任务执行器分配任务给行进距离最短的任务执行器
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
( R* E4 q2 S$ V- L) c4 @
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
# [ \0 G, x9 }) D( Z& v/ A* q
7 |, w, [; D/ Q l' t; ~
treenode tasksequence = param(1);
. r, a2 T, R ~* M
Object current = ownerobject(c);
- B/ D; @; V+ ]- C9 H! ^, i
/**找到距离最近的任务执行器*/
/ P: {: c5 } q% a" P- b
/**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
& R) ~: @( |2 ?% T* m. o$ c, s- S
double curmin = GLOBAL_UNREACHABLE;
7 \; J8 {- v' H" r4 G2 y2 ?
int minindex = 0;
/ @" _1 Y- x% E3 P' \( r" P5 L
treenode destination = NULL;
7 w: ?$ {; ^, ?, W4 i7 u
for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
1 P- V& r* V- M) Y6 I9 D+ L
{ // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
+ U; l. F4 K6 k* u4 K
if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
9 S4 G# c$ k2 Z. ^0 |$ q7 k w
destination = gettaskinvolved(tasksequence,taskrank,1);
/ O5 v6 j: D9 f. K; t( x! Q
}
; ^4 Y$ b& b* Y7 W4 I" a7 ~" x
1 m s1 I3 `; E. {
if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
2 `9 W& Y+ d, o) B# K
return 0;
, A( e' e8 l) Q& i
" K+ C) x7 ~5 ]. A: e0 I4 u
//如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
! g) i% F- j' O" s# i
for (int index = 1; index <= current.outObjects.length; index++)
% {/ |7 }4 ]7 {& d: Z
{
5 e: V/ _, i; z5 B# M
treenode curobj = current.outObjects[index];
- X5 r0 Z3 P5 p2 @; p$ [
if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
8 k O' Y5 m9 |# b- U: R, W
//中间端口有连接实体,并且该实体为任务执行器
4 A% i1 c C, t* z8 m2 G: N' A
{
8 `, y/ E1 x' z7 M. v$ M0 k" A
double curdist = distancetotravel(curobj, destination);
- e. s3 @: L: W' L8 w- u; F U7 b
//计算任务执行器和目的地之间的距离
% t* g: G+ }4 Q/ O" @4 y' H
if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
9 x: L0 B* ?; T4 z, I
{//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
5 t; w0 B6 X y( u( r. M A
curmin = curdist;
. |* \% X( Z+ S; d
minindex = index;
8 ~3 y1 C2 J& v4 z! @7 E0 Q' `4 y
}
* {% w: j. ]' p& J, C( Z/ l- V
}
- X( F8 G7 a5 ?7 o7 {/ U
}
# x) j* H: r! ?" X
0 E+ x4 j" l9 X9 }! F7 \
return minindex;
2 m _; s' A. h2 z) }
//返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
# Q4 C, i* b7 X" Q! z" n
& b3 t, g, F( `+ F; ^
随手翻,不保证正确性、可读性。
作者:
eb_sun
时间:
2017-4-24 11:08
谢谢大神的分享
欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/)
Powered by Discuz! X3.3