全球FlexSim系统仿真中文论坛

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

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

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

# v, y4 S# e1 g$ o  e
  1. treenode tasksequence = param(1);! P, k) I0 i) B  G( S6 I
  2. Object current = ownerobject(c);! n. l! {  I6 }+ h3 A+ p
  3. /**找到距离最近的任务执行器*/4 F5 L& X  \3 b& s$ e! x- p
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    6 {0 D& f8 l1 }4 D
  5. double curmin = GLOBAL_UNREACHABLE;  _8 {6 r- Q2 p3 F, |
  6. int minindex = 0;
    . j0 u+ |! a$ d7 t. H0 i" e7 [$ G
  7. treenode destination = NULL;
    * U- D, S/ |! O7 l
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
    ' a0 Z' E1 H* f& t" p' e
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。) w* [! `! X3 K$ e# z2 L* i  a
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)( H# K: u* \6 j! P) k
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);& M: G4 U8 ?) `; |; d, Q7 h
  12. }
    % h6 ^2 ^6 {+ V0 L
  13. 3 h5 N# P4 T) }7 L& x$ ^; L1 ^
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。$ d  J7 H: Z, o/ A! |  k% i1 }
  15.         return 0;
    " m5 R, h; o/ c3 r
  16. 6 L1 O/ K2 N8 m1 K
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    % ^: m. X$ ]0 N
  18. for (int index = 1; index <= current.outObjects.length; index++)
    5 s# P  d+ K( H" Z/ F3 _- W- h
  19. {
    % [( e1 d7 F2 U# `
  20.         treenode curobj = current.outObjects[index];
    2 U6 T& f, n& b& B1 B
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) ' W8 ?4 n' q: y' [0 ~
  22.         //中间端口有连接实体,并且该实体为任务执行器
    8 }/ q( C  ]; F3 r7 Q
  23.         {
      n% C. P# J) x3 u/ M+ Q6 y
  24.                 double curdist = distancetotravel(curobj, destination);* G5 b, j4 O& M- K. F+ Y" w0 I
  25.                 //计算任务执行器和目的地之间的距离; o- x& H4 H( G  P. O
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    ; j2 G- h$ A: Q2 r3 U7 {" _7 C  v
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
    7 P- p- c" i7 J2 D% ]6 I/ n) b. X7 I
  28.                         curmin = curdist;
      Q7 m! u$ C9 V$ T" A3 P9 x& @% _
  29.                         minindex = index;3 ~& k5 V0 s* k! X8 z
  30.                 }0 P. e6 |1 x9 K: I* z, x( s
  31.         }+ O2 O, D6 c1 f6 J; O, |
  32. }1 V6 u& k6 G1 [- C" e; L
  33. $ g" D& U' D& H9 ?$ V
  34. return minindex;& x) Z% Q2 B3 z' W1 |
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
3 Z, @0 v' Y2 E" j1 K0 R7 p
" j# I8 O- h" o3 i
随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-9-6 08:12 , Processed in 0.073115 second(s), 14 queries .

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

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