全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。5 k* P7 o8 i8 H& |0 j
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
) K5 ~9 Z; h' C1 K" s+ R
# @% k  N1 @0 G1 ]
  1. treenode tasksequence = param(1);
    ' g( s! {6 c$ s7 c# C
  2. Object current = ownerobject(c);3 R( b4 J. ~  f. C; G
  3. /**找到距离最近的任务执行器*/" N$ y& `4 u5 k5 A+ q+ c) D
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
      }$ U! ~. p2 c5 Y+ p" x
  5. double curmin = GLOBAL_UNREACHABLE;, @  q5 A' x5 Q* G4 z
  6. int minindex = 0;
    2 |$ T& Q3 p" u. Z  _, j+ J
  7. treenode destination = NULL;( n- K' {6 L; ^: s: S5 d  I" \
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) 3 Y3 _, f; \8 v7 q- B1 p# v$ w0 B
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    ( [$ A" s' l9 t8 |" N3 F. P2 m; U% ~
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)# y2 ^4 f6 U/ H, ~; J" ?
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);5 P. G# `+ t+ @0 B
  12. }* y# G4 l0 e, X; W
  13. $ G  L6 Y) Y& y. A3 S8 P5 {2 u
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    - a; \4 S' V) b& U% Q2 C
  15.         return 0;5 u3 g/ i8 I1 q/ j0 z
  16. $ F# k) F6 |% A9 I8 |
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。3 f/ [9 ^, N1 h; T
  18. for (int index = 1; index <= current.outObjects.length; index++)
    ) H* j" Y( M. m$ M4 L6 N5 T
  19. {$ P; n7 L6 c" u
  20.         treenode curobj = current.outObjects[index];
    / H2 r5 o0 j) J6 O  o$ C. @
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
    7 d! [0 M/ k0 h- ^3 n5 E4 |* k: c/ ]
  22.         //中间端口有连接实体,并且该实体为任务执行器* U8 k7 G# T& X
  23.         {
    ( C" E' ^0 ?- D+ v
  24.                 double curdist = distancetotravel(curobj, destination);
    $ N* L) L' f" G; ^: z' y
  25.                 //计算任务执行器和目的地之间的距离
    ) m7 d% ^5 P7 Y8 Z
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    $ t; v& U2 n+ Y9 k8 Z; I$ N
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。2 w. y# X1 D# y7 m
  28.                         curmin = curdist;
    8 ^4 j4 J- s4 _% W6 C- Y
  29.                         minindex = index;
    0 z* r& t" D3 D$ G! m, v
  30.                 }/ M, \5 |) |% H' `, B  |8 V4 S' f
  31.         }
    8 a: a* c! z4 d3 q) S, ]
  32. }- ~  d; p7 K0 _  l; `7 ?

  33. " N6 M! A. e) v- t) y7 f$ r
  34. return minindex;+ A% u9 `' O1 @* S% f; E
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
1 t1 q9 H- @* g! x; `$ B
) k/ w5 n, |) o* p8 r
随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-9-6 10:15 , Processed in 0.085428 second(s), 15 queries .

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

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