全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
: L# W3 z. [( v% y) y, a以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
' h0 I; E1 Z" K3 y9 _: p) t: x
# y' j) @2 `! ~$ k
  1. treenode tasksequence = param(1);, {, K/ L  f, U& n0 |! C# z
  2. Object current = ownerobject(c);
    ) Y6 o1 r, N& Z2 n& C- D
  3. /**找到距离最近的任务执行器*/
    % C, }+ D; s7 i! |) H8 J
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    : X/ ?3 ~9 V5 i
  5. double curmin = GLOBAL_UNREACHABLE;) n* [! ~2 u1 J
  6. int minindex = 0;3 r, U9 |8 }9 S& N* Q, F/ L
  7. treenode destination = NULL;
    + d& L* [- C  A
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
    ( f: y4 i- Q4 e
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。8 Z7 j6 Q" ~. b* `" E
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)( X' p8 e' X  O5 e4 D
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);: {# X& @: j+ i4 T4 P6 T& y8 K
  12. }
    4 |1 v7 x9 M$ W' F; @: q$ `
  13. $ d: k4 P  t1 F2 d" S
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。1 }0 E' t4 V. ]0 B0 ]) Q
  15.         return 0;
    " {$ Z3 ?1 o) G4 ~/ D% }/ A2 E, \

  16. 8 T) K1 W) t% a, M" s, y
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。- l7 K2 L& P& g
  18. for (int index = 1; index <= current.outObjects.length; index++) & {' K; ~! o. _5 E, w
  19. {
    7 ]/ x- ]& I. }4 @
  20.         treenode curobj = current.outObjects[index];  m5 O* V4 w! c
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) 2 W* e8 O% c6 {3 ?! w4 r
  22.         //中间端口有连接实体,并且该实体为任务执行器
    8 S8 `  V6 H" C! E% f/ u
  23.         {
      y- N. p4 ]; B6 c" l- @! R
  24.                 double curdist = distancetotravel(curobj, destination);
    ) a. u2 C8 I1 u* I9 z2 F
  25.                 //计算任务执行器和目的地之间的距离
    1 `) K: |7 Z$ F
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    7 H/ K3 B; V3 w2 B) z
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。  r/ J8 V. X: d. w
  28.                         curmin = curdist;
    - b# S) m8 N- p7 ?& u  b$ b2 w0 |
  29.                         minindex = index;
    . D: [. u7 T( q0 L
  30.                 }
    4 t4 R( ^+ a  E$ R1 T  I. K: K0 M; Z
  31.         }
    6 X% b+ w5 }8 s% V1 Q
  32. }5 m4 I; ^$ N; V) w: i

  33. ) J8 k# s; P& N' r6 A
  34. return minindex;. W) R6 w4 M- ]3 M* i9 w
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码

0 I4 V; S' S* _
, e/ U; i' S- _* r随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-7-1 16:39 , Processed in 0.078809 second(s), 15 queries .

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

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