全球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
  1. treenode tasksequence = param(1);
    1 A* A& F# C5 N6 e  {: c# j
  2. Object current = ownerobject(c);7 K4 A5 d# g4 q% v4 L
  3. /**找到距离最近的任务执行器*/* N/ O2 t, f  {1 u
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    + y* d* T) e8 e+ y8 r
  5. double curmin = GLOBAL_UNREACHABLE;5 p, M, R8 k9 R* ^' A4 s; V% u
  6. int minindex = 0;
    " v0 I7 w( P% [  t$ ]) r3 \
  7. treenode destination = NULL;% h+ I8 x( g# n$ {3 G$ o$ o
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) 4 G/ w* E7 ^! ?' |# m* P
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    0 k3 x" Z! Y! z& P- N7 u# O: _* D
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
    : S! m5 t+ b7 o
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);
    5 g6 @. u! W0 F8 C1 U+ b8 T
  12. }, T% R. ~/ k, Z+ x& e
  13. ; }6 M3 Q* T0 k5 n  M" A4 K
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。6 p$ P; ?7 i' J( b# v( Z& t& |
  15.         return 0;# z" O5 F  ~/ A" d5 f

  16. $ a0 E, h- q' O% u  ]
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    2 D2 T; N, f1 C' T
  18. for (int index = 1; index <= current.outObjects.length; index++)
    ' b5 [% v$ O/ V* L" b9 T6 W9 g
  19. {
    : t+ m0 {+ J/ F
  20.         treenode curobj = current.outObjects[index];
    + V0 `( l8 _9 S! F) w4 |) Z
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) ! i. q2 A5 W4 P* P5 c8 x
  22.         //中间端口有连接实体,并且该实体为任务执行器
    3 C# }. [* G1 w3 M# z
  23.         {8 P) F; p; t0 [( T% O
  24.                 double curdist = distancetotravel(curobj, destination);
    7 p& ~+ |5 _# M0 ~
  25.                 //计算任务执行器和目的地之间的距离5 p2 Z4 d/ r# @. m) }
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    2 N- y# P8 |$ [+ L3 O
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
    + }6 M& j  r9 @' p% B- @3 L
  28.                         curmin = curdist;+ n, I8 x, @" H" h( G: a
  29.                         minindex = index;/ ?; Y" _) h! ~0 w1 H. O
  30.                 }0 f) t: G1 M9 D2 d, ?
  31.         }
    4 D2 C; l& z# l
  32. }3 x, R/ g8 Y' s6 T, c! H

  33. 6 o3 h# D, i4 m8 U
  34. return minindex;
    ; n5 [; ~. o  a1 q  h
  35. //返回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