全球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; ~
  1. treenode tasksequence = param(1);
    . r, a2 T, R  ~* M
  2. Object current = ownerobject(c);- B/ D; @; V+ ]- C9 H! ^, i
  3. /**找到距离最近的任务执行器*// P: {: c5 }  q% a" P- b
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/& R) ~: @( |2 ?% T* m. o$ c, s- S
  5. double curmin = GLOBAL_UNREACHABLE;7 \; J8 {- v' H" r4 G2 y2 ?
  6. int minindex = 0;/ @" _1 Y- x% E3 P' \( r" P5 L
  7. treenode destination = NULL;7 w: ?$ {; ^, ?, W4 i7 u
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
    1 P- V& r* V- M) Y6 I9 D+ L
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    + U; l. F4 K6 k* u4 K
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
    9 S4 G# c$ k2 Z. ^0 |$ q7 k  w
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);
    / O5 v6 j: D9 f. K; t( x! Q
  12. }; ^4 Y$ b& b* Y7 W4 I" a7 ~" x

  13. 1 m  s1 I3 `; E. {
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    2 `9 W& Y+ d, o) B# K
  15.         return 0;, A( e' e8 l) Q& i
  16. " K+ C) x7 ~5 ]. A: e0 I4 u
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。! g) i% F- j' O" s# i
  18. for (int index = 1; index <= current.outObjects.length; index++) % {/ |7 }4 ]7 {& d: Z
  19. {5 e: V/ _, i; z5 B# M
  20.         treenode curobj = current.outObjects[index];- X5 r0 Z3 P5 p2 @; p$ [
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) 8 k  O' Y5 m9 |# b- U: R, W
  22.         //中间端口有连接实体,并且该实体为任务执行器
    4 A% i1 c  C, t* z8 m2 G: N' A
  23.         {8 `, y/ E1 x' z7 M. v$ M0 k" A
  24.                 double curdist = distancetotravel(curobj, destination);- e. s3 @: L: W' L8 w- u; F  U7 b
  25.                 //计算任务执行器和目的地之间的距离
    % t* g: G+ }4 Q/ O" @4 y' H
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) 9 x: L0 B* ?; T4 z, I
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。5 t; w0 B6 X  y( u( r. M  A
  28.                         curmin = curdist;
    . |* \% X( Z+ S; d
  29.                         minindex = index;
    8 ~3 y1 C2 J& v4 z! @7 E0 Q' `4 y
  30.                 }
    * {% w: j. ]' p& J, C( Z/ l- V
  31.         }- X( F8 G7 a5 ?7 o7 {/ U
  32. }
    # x) j* H: r! ?" X

  33. 0 E+ x4 j" l9 X9 }! F7 \
  34. return minindex;2 m  _; s' A. h2 z) }
  35. //返回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