全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
0 g$ y. a" L$ |4 V, f5 ?, v以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
% @$ f9 Y% ~( p; w
4 s' h  B6 w1 E2 C' t. n
  1. treenode tasksequence = param(1);
    ) m1 q7 \& s) ~+ x( O$ Y
  2. Object current = ownerobject(c);9 ^% W6 Y+ f. w# Z4 \6 L) l- J; U
  3. /**找到距离最近的任务执行器*/
    " M! \' O. @3 q1 x
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/1 U: \0 r2 n  k/ Z
  5. double curmin = GLOBAL_UNREACHABLE;
    6 G% d1 W8 X' Y+ t1 N3 l
  6. int minindex = 0;
    # t7 V) m" a5 ~
  7. treenode destination = NULL;
    1 r0 _) n6 V5 _9 `  k$ z
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) 2 g- J6 l1 O) Q5 |2 a( v4 p* q" E3 i
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。% ^6 W& o4 D1 M* ]! z' `" y
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)4 z2 N3 e7 i- E- ^) P; ~4 H
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);. ^* b* r; u+ e: J1 }
  12. }
    4 N! W' |+ d! s0 ?4 L
  13.   \6 C' r: M* P' K; Q4 }/ @
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    / q- W+ a7 x8 }6 k
  15.         return 0;
    % A. D6 C% O" u; h+ A6 c
  16. 3 d6 [; m/ A5 D* c1 B! X
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    1 d: K" U. b$ t. N3 V8 U7 J7 o4 ]
  18. for (int index = 1; index <= current.outObjects.length; index++)
    ' a' q6 E3 v. k- |! g- R
  19. {% R: Y: e. e& C0 n: \6 h6 {% m
  20.         treenode curobj = current.outObjects[index];( s5 a0 X! K/ f
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
      Q) q# E) ]0 A1 F
  22.         //中间端口有连接实体,并且该实体为任务执行器
    % q' S8 `5 X# n) }, j- t* n
  23.         {
    ) `. D* L4 ~3 Y$ e% T
  24.                 double curdist = distancetotravel(curobj, destination);
    5 z7 [" k+ F$ q- I4 Q0 Z5 o. W% A
  25.                 //计算任务执行器和目的地之间的距离3 H5 l$ j+ H4 @$ J1 j) L5 K% D% a- S
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) 4 e' D  ~& r1 S2 q
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。+ N& b6 D4 \1 w- R; T
  28.                         curmin = curdist;
    4 {" V9 s' A) q( R# _$ }2 x/ V
  29.                         minindex = index;% q! v) R8 L! V. G8 }* l
  30.                 }
    ; D$ D* s( K( ~- U. K# I! X
  31.         }' Z# ?: h. @$ R
  32. }
    ; Z2 c0 I8 H% C/ h2 e- n7 L  K* W

  33. ; {' y' |/ E. I" L+ L- @" J
  34. return minindex;+ O7 G3 U; U9 H  B4 \
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
8 e% K$ c( T6 Q! i( d. e

& q' x2 Z9 Q, K1 T2 g! w随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-6-30 03:35 , Processed in 0.075482 second(s), 14 queries .

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

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