全球FlexSim系统仿真中文论坛

搜索
查看: 5083|回复: 1
打印 上一主题 下一主题

随手翻:任务执行器分配任务给行进距离最短的任务执行器

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。6 ?$ s. d' ~- y7 P+ E& Z" I  v* a8 l1 Y
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:( y. c4 C2 u- z9 i2 c9 R, q7 z' C$ w

, `$ I: Z# q* U7 b. P
  1. treenode tasksequence = param(1);
    6 h  }% q3 m* M3 e) t8 k7 _
  2. Object current = ownerobject(c);
    + I: `) y0 l5 ?! Z6 x; M& F" I
  3. /**找到距离最近的任务执行器*/5 ^! v& e" w( L/ D6 J
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    $ x1 v3 X: l* M2 _* v2 I
  5. double curmin = GLOBAL_UNREACHABLE;( @+ b# g  O5 y2 A0 o
  6. int minindex = 0;. w% {1 }$ I0 b3 I: X
  7. treenode destination = NULL;  d7 b" o4 K$ `* Z' w& S+ A! D
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) $ B' `% `1 D! b. I: t% ^
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。+ q+ y7 r9 W3 e( Z- {' d' K5 D
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)0 J# s7 @/ c9 r/ Q: M) f8 i
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);
    ' g! D% H& H% F8 x* h/ a
  12. }
    ) A  y: ~) R+ n

  13. ( u% U& E1 R4 h1 p# \; m3 V$ L' H0 K9 E
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。9 F1 v6 Z6 L# N1 H1 E: [, X' ]
  15.         return 0;
    ! q' Y, |/ }! A1 d1 b
  16. + Q' \8 r- G( f  j" _
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    4 p1 L4 [& \% p" T
  18. for (int index = 1; index <= current.outObjects.length; index++)
    / W) \& Z- ^% K" P7 n
  19. {0 h! W! H: M4 L
  20.         treenode curobj = current.outObjects[index];
      E' a; c3 a4 @2 y7 e
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) / k( T/ p5 ?& }7 T, {7 j: y# b1 h
  22.         //中间端口有连接实体,并且该实体为任务执行器
    7 R/ y$ x! _3 F( Q$ H$ u: M' u. Y
  23.         {  K* q$ w& j' t( O+ u
  24.                 double curdist = distancetotravel(curobj, destination);
    4 [  Q) n6 R4 H4 s( W6 h
  25.                 //计算任务执行器和目的地之间的距离* N& a  h5 N9 O5 j/ k, w& a
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) $ _7 k0 X6 y! _. U% z8 S
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。3 t/ h1 t4 s. I6 f% g: y0 I1 t" a3 L) `
  28.                         curmin = curdist;
    / ^# l8 [. g) X
  29.                         minindex = index;1 Y: p; a5 \, L9 o+ \
  30.                 }* U6 w4 A) t0 R4 A4 w- t
  31.         }
      C/ l* X& X( u9 L2 q
  32. }, T+ Q' `' ?7 u0 Y, f) [2 m$ s1 `. }
  33. 9 P7 H6 |0 l6 r( `7 Y' [
  34. return minindex;
    ' N3 ]  h8 u* l& ]$ X
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码

# o% V% k! O8 \2 d6 r" b9 x; [% s8 ]" A5 c( ?3 A
随手翻,不保证正确性、可读性。

评分

参与人数 1威望 +6 收起 理由
慧娴亚伦 + 6 赞!

查看全部评分

2#
eb_sun 发表于 2017-4-24 11:08:09 | 只看该作者
谢谢大神的分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|全球FlexSim系统仿真中文论坛 ( 京ICP备14043114号-2 )

GMT+8, 2025-9-6 12:38 , Processed in 0.075171 second(s), 14 queries .

Powered by Discuz! X3.3© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表