全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。! c) w' D& Z' G5 U
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:: A, w" e: M" Y% M

/ }0 c6 S$ T/ ~$ x3 i
  1. treenode tasksequence = param(1);- t5 B- I0 N3 a/ d& O
  2. Object current = ownerobject(c);
    4 H7 L) F; d+ g
  3. /**找到距离最近的任务执行器*/2 q9 g2 C8 c9 ]- T7 K
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    + N9 Q1 r" T3 L# ?3 O$ \
  5. double curmin = GLOBAL_UNREACHABLE;
    0 m  f: a# U8 n$ o: K
  6. int minindex = 0;" u3 q$ z; B) @8 M! ?
  7. treenode destination = NULL;
    - m0 ]( j* q  s+ Q
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
    ; t4 ~) Q& K; b5 l0 c  D
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。+ x2 ]1 I" f* o5 l% S: u* r
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL): P2 M4 m+ m& D
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);5 S& o, ^- n8 J( w7 s2 p& b
  12. }
    ! M9 ]3 x# ]' m3 s, `

  13. ; S" ^4 v' E/ p5 r/ t  P+ j% k4 I
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    : w) J- y$ g/ q6 r1 m6 w( F! v5 Q
  15.         return 0;+ n( Y3 k% Q0 D
  16. ' o* |5 M+ u5 a5 c5 |: S
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。7 a! z4 N! O; f* N! F
  18. for (int index = 1; index <= current.outObjects.length; index++) 9 s$ V4 j& p4 Z% B. W! t
  19. {
    # Y% }8 r# U, z3 i) a
  20.         treenode curobj = current.outObjects[index];
    , v0 g: B- P% A
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) / S! P+ c- H, F* [
  22.         //中间端口有连接实体,并且该实体为任务执行器
    6 V6 b2 c; a8 w0 |) }3 m
  23.         {9 r$ @$ ~4 s: m) F
  24.                 double curdist = distancetotravel(curobj, destination);
    % G+ D' U$ D$ ^' U' F# e, j
  25.                 //计算任务执行器和目的地之间的距离; F1 w. o: }% c  V# l* K8 j
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    3 A$ b$ @! m+ s) o7 T) u; C
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。, L& q2 }# g5 t9 C) p
  28.                         curmin = curdist;
    " F' }# W: M7 z, l" \
  29.                         minindex = index;4 D( d' q' A9 Y; Q
  30.                 }
    $ D5 K4 M0 F2 y( ]) e; u" `
  31.         }; H; J8 ^: W% U7 k) F# t! p
  32. }
    3 z7 [( g( g% |1 t

  33. 0 o1 v! s8 d5 Y
  34. return minindex;
    & X8 a3 c. H7 ]8 q) w
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
! a/ A& n& j2 k

% d/ h$ Z: M9 x随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-6-29 13:37 , Processed in 0.067663 second(s), 17 queries .

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

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