全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
8 H( d$ B( |9 z1 L- @% r+ V5 f! w以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
7 S: R" ^& I! y' z2 \1 r8 D4 T. Y" I! [$ Y# m$ T" f
  1. treenode tasksequence = param(1);
    5 ^+ T0 `# M) h
  2. Object current = ownerobject(c);
    3 E+ X# T, j9 g8 c/ n! z
  3. /**找到距离最近的任务执行器*/
    0 V/ b5 ~0 \6 [2 m; l/ a" Q1 ?
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    5 l8 v# _! H- H6 Z
  5. double curmin = GLOBAL_UNREACHABLE;
    8 A! W% c& O/ v  P: \! J1 O; W" \, g
  6. int minindex = 0;
    9 H2 q! i! n4 x2 u. F
  7. treenode destination = NULL;" A9 R2 A( y* I
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) ) @1 p% o9 i7 s: d7 T% n/ l$ U
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    ( f$ Y) N) X+ Y7 r: z! w( O
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
    9 O* O5 P# K' O1 [) v1 F
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);
    . u2 n% v( n$ P9 ~8 x
  12. }
    2 M4 t- h7 q4 V* ?
  13. 9 V  p- n# O& Q& e
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。, _+ `) V2 K  O  \
  15.         return 0;6 s! B2 ^: _) }* I1 {

  16. 0 A- a3 E, Y0 V
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。8 K/ D# Q1 y; M+ |) M2 S% O. @3 @- B
  18. for (int index = 1; index <= current.outObjects.length; index++) 1 ^2 X) G! e) m! |+ L2 E
  19. {2 ~" F( F3 M7 f' s8 s( ~
  20.         treenode curobj = current.outObjects[index];1 Z/ }! P. H" e) {8 o
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
    7 E8 K0 B/ L5 G) y/ J! }2 b
  22.         //中间端口有连接实体,并且该实体为任务执行器3 ^2 X* P# a6 ~+ R& g
  23.         {3 Z- p, g% a0 N& C1 R7 v4 k" ~1 U) p
  24.                 double curdist = distancetotravel(curobj, destination);. i% S. P3 _5 Y7 H+ Q0 P0 F
  25.                 //计算任务执行器和目的地之间的距离9 W4 Y0 G3 i3 L' B; {, c
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    + S9 X7 r5 I) P, o0 e0 n( n
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。0 U6 O2 q# Y. t) w6 T
  28.                         curmin = curdist;2 R& L* O4 x& M- O" Z  G, i% P# @
  29.                         minindex = index;
    5 |6 f+ _$ x5 N6 Z; T
  30.                 }
    7 d  v: S# ~5 g
  31.         }- B; L+ K$ F& _- s
  32. }
    # ?4 A% l! F- w6 s2 E5 @4 F

  33. 5 q, \/ P9 d+ }- b4 s
  34. return minindex;6 z' h- B* ~% h+ F3 n4 y
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
' A, [2 S6 T- p. ~8 R1 `& N/ e% C; c

/ |8 Y. I  ]; [3 R+ Q随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-10-25 19:07 , Processed in 0.085591 second(s), 15 queries .

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

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