全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
% K  S5 `: y7 r. Z: f4 X& I7 T# O以下为flexsim17.1自带,寻找行进距离最短的任务分配器:, G. p3 U; F: B7 R% J

; f' r. b% E6 X
  1. treenode tasksequence = param(1);# k) h. k5 k1 T; q0 _
  2. Object current = ownerobject(c);
    " m) P8 K+ _) N& D8 f: d
  3. /**找到距离最近的任务执行器*// N4 q4 C9 n% ?( r
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    , @: s5 R; K. M9 Y
  5. double curmin = GLOBAL_UNREACHABLE;: g9 k; V! g+ p2 t: F4 ?; t/ ^
  6. int minindex = 0;8 Y+ n3 n3 c: [$ F' g
  7. treenode destination = NULL;; k+ ?5 l' ?( O$ {! l/ {# G: i$ q4 e
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
    ; f7 l" S' ?$ _  ^: X6 C. R
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    ( d* F( C5 D& w/ U  i2 ~3 B
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)9 G# m5 j+ n: v6 a1 Z& R- ~: I: M# p
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);& I3 ^0 D8 o% Y8 ~
  12. }
    9 m* m8 W2 A1 }1 b& r- p
  13. & s. L. C2 z# ?: e
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。( l  e' m/ ?1 ]: J( n, W, {$ l% o0 W, |4 U
  15.         return 0;
    / ?/ E! J' z: r

  16. : p- ~- l; y, y: O! i
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    1 T; u9 M9 m% I% J5 W- i" ~
  18. for (int index = 1; index <= current.outObjects.length; index++) ! g- w/ }2 L  g: l
  19. {
    # n( x. B: V5 T* b/ {1 M7 E
  20.         treenode curobj = current.outObjects[index];: a7 n, `9 L4 l7 V1 g- N( t( V& i
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
    , a' P) l& C" n3 `
  22.         //中间端口有连接实体,并且该实体为任务执行器2 K- J  [+ N" G! K4 N3 q
  23.         {+ A4 t9 O2 n% v
  24.                 double curdist = distancetotravel(curobj, destination);- Z) g  w. \+ w- ^
  25.                 //计算任务执行器和目的地之间的距离6 H4 E% g, {+ C6 D# f* H
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))   L# a5 p, ?& \/ F- r; P* _/ A
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
    4 I; L+ _/ t" \1 G8 E/ Y5 k& t  D
  28.                         curmin = curdist;- h  r, g1 D. H
  29.                         minindex = index;
    $ P9 i7 s3 @: r% E5 q
  30.                 }
    : W0 ~, v0 L3 q% d. _3 N
  31.         }( }* I8 d7 r4 s8 \9 {' x( f. L
  32. }
    / I6 s4 {8 ^  |4 _5 l, N# B9 W

  33. 2 J, g# ]& k9 \+ ^( x/ I
  34. return minindex;
    ' s- p; s) w$ \. [: a
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
' g% `" v* b' y" C# v

1 D- Z' G" S8 F, O随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-7-2 04:56 , Processed in 0.069773 second(s), 14 queries .

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

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