全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
" `0 a- i) K- W# T% t5 _以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
5 [  S: N+ t2 Q8 g" n, }- J
! o  O3 Z# E1 y, y
  1. treenode tasksequence = param(1);
    1 k% c# I8 ]5 H5 v# Y
  2. Object current = ownerobject(c);8 d6 J8 Y- L( Q7 c( G
  3. /**找到距离最近的任务执行器*/
    0 x$ T' P3 q6 O
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    & I6 {: {) u0 Z$ O$ e
  5. double curmin = GLOBAL_UNREACHABLE;
    * f& [7 E% L3 L6 g% a
  6. int minindex = 0;
    6 ^+ I1 M5 n) b$ G0 b/ N6 }
  7. treenode destination = NULL;2 d1 y; j* B* k( _( c  C0 X
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
    % j& Q9 r) U$ [
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。+ r4 a6 \4 i5 o4 Z8 D" v
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
    ; R& f( _. Y1 n% p
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);1 M8 p. H1 S" p
  12. }; k( [/ t, j! `' ~. J  {2 W

  13. ' Y8 S& \9 C3 `7 P0 D$ z$ v6 N
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    , i5 i8 v* Y& A, U
  15.         return 0;& `5 G3 ~6 h! G
  16. 6 U2 G" R, p( s! |1 |) E8 `. [
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    8 J- ~7 l! @/ z( J- U' S, h  ?9 M
  18. for (int index = 1; index <= current.outObjects.length; index++)
    9 L- y' ^) T7 k) _4 k4 r
  19. {
    ' i! ]% T  h! m8 j5 b, Y' G
  20.         treenode curobj = current.outObjects[index];- F+ {& u, F% F
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) ! K( ^7 }! |* u9 j
  22.         //中间端口有连接实体,并且该实体为任务执行器0 U7 z( H: J. y2 Z+ @" I
  23.         {
    : S* E) R! a* d1 i6 S
  24.                 double curdist = distancetotravel(curobj, destination);* b$ O; E: R% ?; K
  25.                 //计算任务执行器和目的地之间的距离- G+ |7 N% p% M" o1 K4 P6 X7 z
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) " x! U0 i4 @$ ^1 a6 @4 W0 P
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。. ?, W$ ?  o* b
  28.                         curmin = curdist;
    6 g$ b" b. R- i7 S
  29.                         minindex = index;, l/ G! D6 k9 j5 O2 |; l
  30.                 }
    & Q) I( D# k0 z5 ]! J! c5 I% L. ]
  31.         }$ B, m6 L" z* t4 j, t; U! I
  32. }. m7 H4 U' ~: _/ ^! i3 p1 E
  33. 3 j$ D$ e- d; k2 Q% f
  34. return minindex;
    ) ]  K2 p* q7 [# x7 a7 e! [; q
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
2 |' }$ E: t# Z
& j  b9 Q9 Q8 s; T! C- r# E
随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-10-25 04:19 , Processed in 0.064577 second(s), 15 queries .

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

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