全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。2 _1 B! ^5 M) Y
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:6 ^6 g+ n  t! u2 n6 M$ q" m
$ Y" w+ q5 Z9 J9 A. T; f
  1. treenode tasksequence = param(1);# B/ f9 u6 s: w5 Y* R4 T2 H" O
  2. Object current = ownerobject(c);
    . o% H- o3 P  a
  3. /**找到距离最近的任务执行器*/6 q1 Y) q' _) T. Y4 p3 k3 n4 a: I
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/9 d9 F2 d( f* d9 m8 [
  5. double curmin = GLOBAL_UNREACHABLE;
    1 B, s* K. \7 D1 d3 P
  6. int minindex = 0;
    * E: _9 m- f' A6 t) }
  7. treenode destination = NULL;
    & N7 y( G+ b. V) l$ i* U/ M9 r0 ~
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
    ' Z. p, [  Z4 y  Z  E. g
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    ( V7 H* s; G/ v" P+ h. i
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
    2 m4 T+ J3 i) R2 k/ |9 p
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);7 a" N3 b2 C3 d1 V0 m  A- @% q
  12. }8 \: c, |- R" L  G) y
  13. ) y, m' R+ T. |
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    ( Y4 t. @% p& Y, L
  15.         return 0;/ v) A: d% C/ J1 D! w/ h$ `! t+ T

  16. 5 m" H3 R( D& _/ S1 y+ U
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。- @& D4 k7 D$ R; p  F$ y
  18. for (int index = 1; index <= current.outObjects.length; index++)
    7 @& d2 c" x8 X% r6 J/ s+ ~
  19. {( o  @* v& I8 `+ T" e# A6 N+ H
  20.         treenode curobj = current.outObjects[index];9 V  C9 f% h$ f% l$ m
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
    2 @3 t  D% F! e: h0 Q  W
  22.         //中间端口有连接实体,并且该实体为任务执行器, X7 C# [$ n" y4 {
  23.         {
    ! s- Z+ U  U$ p8 N" y( G
  24.                 double curdist = distancetotravel(curobj, destination);
    0 S1 u/ ^  ]) I
  25.                 //计算任务执行器和目的地之间的距离
      Y# e# O2 ^- e+ H5 C+ G
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    : I* r5 @' h) i- F& p- d4 n
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
    ; b# x: R7 F2 v% L
  28.                         curmin = curdist;- }8 z! `& L9 o
  29.                         minindex = index;
    ( Y/ A/ v7 a) V' r" H. F4 e- n
  30.                 }* W( D4 R, P( j( `& _  \
  31.         }
    % A3 v5 d6 H6 c$ D
  32. }
    ' t5 `9 t3 e, X6 U7 o

  33. " K( W7 w! H+ B5 c
  34. return minindex;
    * d/ G6 |; s# n0 Q* p/ j
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码

" a$ F$ v0 Y0 k1 J2 a! |* Q/ K2 ~
随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

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

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

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