全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。0 b+ K* C3 _# p4 L3 W
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
6 d5 Z' v  ^  o
3 x2 M8 T' g- Y, R
  1. treenode tasksequence = param(1);
    4 z: E# H  l. k4 ]; x4 S* N9 |
  2. Object current = ownerobject(c);( K0 b$ O% |% Z. S4 q
  3. /**找到距离最近的任务执行器*/
    # E# X8 t5 w1 g+ l  p8 q/ P
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/3 z0 c! J6 L9 I# g5 e5 E# B$ m7 D
  5. double curmin = GLOBAL_UNREACHABLE;2 Z6 I. \+ B2 a9 ^# t3 [. S4 t; b& ^0 ?2 J
  6. int minindex = 0;
      H; z+ B" P; N5 |. X
  7. treenode destination = NULL;
    + Q( \7 `; m7 F& N9 b: A' i/ q
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
    : c# M* E/ A% {. B$ P5 z
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    + g7 s0 ]2 J# ?) y( l' x
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)# T% Z; J$ L( @- b
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);4 ^* w6 K  B5 t( m- S% `2 X
  12. }% I+ V$ C4 a7 G) n' j
  13. 1 U# r' I4 I8 K$ y1 n* s1 A
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    + p7 b! g& {3 B
  15.         return 0;
    5 h: l( [) O4 i. i
  16. ) ~  K, s" M; b$ [% c4 n* ]
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    1 ^) L" Q3 H; \8 r
  18. for (int index = 1; index <= current.outObjects.length; index++)   u1 z  W# r9 l4 p
  19. {
    4 k$ n9 ]  r. J
  20.         treenode curobj = current.outObjects[index];
    8 D) F7 Q" t6 v/ x+ \: ?
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
    ! Q& g# V% v7 V4 i' N/ W! ]
  22.         //中间端口有连接实体,并且该实体为任务执行器0 g  j  Q  }/ c  A, L* v
  23.         {+ g. T+ q- n" S) H+ q6 ^+ Y* x; E
  24.                 double curdist = distancetotravel(curobj, destination);
    ; l2 o" h+ \8 Z$ w# u
  25.                 //计算任务执行器和目的地之间的距离
    4 A& A9 W' `; ]' e: K" N6 L
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) & Q+ Q3 p- |' V# O4 f
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。. Y2 Q8 Q8 V7 Z) P
  28.                         curmin = curdist;6 L( u) l  X* f9 P/ L0 t( ?
  29.                         minindex = index;" w1 B$ C+ H0 d. ^* i& S( o
  30.                 }) R7 @# Z$ o' C: E
  31.         }
    + b7 {' Z' w) y+ N
  32. }
    / y) B( Q1 |6 ~8 c. R* s
  33. + v' U5 r# S: b
  34. return minindex;, i8 A) D6 E/ K4 ]; N" E
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
$ Q: v: f" g8 V/ H% L" n3 L
0 _- k' y! r$ V9 k
随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-10-25 19:08 , Processed in 0.057933 second(s), 14 queries .

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

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