全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
. |" a& d9 {$ [6 W' L1 x以下为flexsim17.1自带,寻找行进距离最短的任务分配器:; ^1 }, K6 K0 V- {$ y$ O' P
; o" T3 @2 u, _8 ^& z. U
  1. treenode tasksequence = param(1);- _5 y; S5 ~5 D1 D$ C
  2. Object current = ownerobject(c);4 I1 k% a, l2 g9 g; ^
  3. /**找到距离最近的任务执行器*/
    + r8 F9 [2 V& y! n' L
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/. l) B7 c! y0 f
  5. double curmin = GLOBAL_UNREACHABLE;  h5 e% @! P( _  P; M' Y6 I8 F" q2 k
  6. int minindex = 0;/ ]* z" ?+ j! C4 l! z% j
  7. treenode destination = NULL;
    6 l" Q  \  u1 R! p% l. A' E, J
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) % P3 E  _9 O. ^
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    % @  m6 R5 ?" m7 N
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
    * u- [& J0 T, G6 D% \( C
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);0 I+ Q  \3 p: P- a  R
  12. }
    ; c8 R5 O7 K8 H9 {3 `# A% j: B

  13. * e! k9 t" ]) J1 C, Z
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。9 Q$ ^: a2 F2 I) U/ Z
  15.         return 0;
    2 {3 o1 D1 z9 l' B& y7 Z! X
  16. ; E9 M1 o1 M& J+ S0 {. r3 |
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。. E% H/ Z  z9 ^( N) {" Q$ G
  18. for (int index = 1; index <= current.outObjects.length; index++) 5 X6 I: b' e8 w: O6 Q
  19. {
    $ |8 d" h# M" r- q+ }* @
  20.         treenode curobj = current.outObjects[index];
    8 h& x* t# F7 V+ @7 n8 Y! B
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
    ! ]9 T  D' z; D- o7 z
  22.         //中间端口有连接实体,并且该实体为任务执行器
    7 x/ j+ L: d4 y
  23.         {
    8 Q- @. Y6 B- [) I* @
  24.                 double curdist = distancetotravel(curobj, destination);6 r# k$ q4 U' i. h* r% P% m
  25.                 //计算任务执行器和目的地之间的距离) t6 j: N  h  i% Y" w
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    - i3 Y& ^& ~9 n- x
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。- L7 B, k  F1 s2 X# l6 x
  28.                         curmin = curdist;! d7 ~' _- }6 k1 R6 C; @, }( z9 g
  29.                         minindex = index;
    , W# D$ b  [. z! x2 i  t: L6 S" [- S
  30.                 }% w) p8 l, E* P3 _8 J& I
  31.         }; Z9 ~) r/ B' j/ p2 p  z
  32. }
    % o4 Y2 U& P$ @/ \: L
  33. ( o; x& {6 W* ]; U9 g& ^
  34. return minindex;
    2 i1 I/ @! f& P1 W
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
: y0 L% d4 N! G/ ^! Z

5 ~% R& G1 n6 h+ ]& H随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-6-30 14:11 , Processed in 0.063480 second(s), 14 queries .

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

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