全球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
  1. treenode tasksequence = param(1);0 V' |. H8 R, d* o  |  p( X
  2. Object current = ownerobject(c);, G$ y# G2 a6 `2 T# P" h# W
  3. /**找到距离最近的任务执行器*/
    / r! v/ z& [, ^* A
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    % ?* H; ^/ D2 O
  5. double curmin = GLOBAL_UNREACHABLE;0 J) {/ |- z  }4 Y- G2 _
  6. int minindex = 0;
    6 L9 z2 e/ F+ P" d& O
  7. treenode destination = NULL;
    2 u- i' v* O. G
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) . z, C5 {; @* d- x0 `
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。6 w$ S- i; a) P. ?
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
    3 B) i6 {( A- g5 C& ?' W3 o
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);3 Y! _5 q4 t. ^3 L
  12. }
    . O1 V6 g8 T6 x* u3 u/ L* i  z

  13. $ q. j1 r: V) q1 Q' f) ]& p
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    ) [, K0 [% H" m' |, ~3 ]2 b" G7 b+ o
  15.         return 0;2 L, f/ v6 q; w- x% ?2 c

  16. : m/ o# f: \$ f& J/ Q5 ^/ {. l1 I
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。) c/ H( ~2 D) F5 o( ^9 b
  18. for (int index = 1; index <= current.outObjects.length; index++) 2 \3 R: K* i6 O7 ]! N' [
  19. {
    5 d8 i" U3 @9 |: u8 e
  20.         treenode curobj = current.outObjects[index];
    ' v( c5 J5 ?7 N5 U) _
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) 5 O9 l  e4 y8 L$ ?, S
  22.         //中间端口有连接实体,并且该实体为任务执行器
    $ U% ]; E7 `; j, U" n3 n2 c( V, E
  23.         {
    8 ~3 H( {3 V' G2 n0 ]; G
  24.                 double curdist = distancetotravel(curobj, destination);
    # g) B6 H; ~! o$ I' ?, Q
  25.                 //计算任务执行器和目的地之间的距离
    # {% r$ ^3 }/ o, h) w8 }
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    # c" w9 N: |& M  T; o
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
    , p4 p0 {% f4 U' ?1 o- b( V
  28.                         curmin = curdist;
    1 U8 R6 c+ V% E
  29.                         minindex = index;
    2 o. W7 B7 c; @/ i% p
  30.                 }; S! q% k/ E6 f! L
  31.         }8 T7 O. \( S! {; I8 U( [
  32. }
    * o& t) {: O2 l3 J# Z

  33. ; ^; w- \" Y' y& a, Q4 c
  34. return minindex;
    , o/ C$ ^+ ?" a
  35. //返回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