全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
& R) @6 `& X8 h! N- L. U以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
5 q  p8 Y2 _9 W+ R
0 B) B3 M3 D4 }2 c
  1. treenode tasksequence = param(1);
    7 v0 a3 D4 D& B6 x+ |
  2. Object current = ownerobject(c);; ~4 U; p( t. J$ o2 [
  3. /**找到距离最近的任务执行器*/( n8 I3 s& T6 r( ~) K% z
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/& O. j9 O' a# A' D) p
  5. double curmin = GLOBAL_UNREACHABLE;
    0 o: g+ a6 ^, ?
  6. int minindex = 0;+ Q9 h# u, ?5 T( a. m' Q  A
  7. treenode destination = NULL;: L( f  W" ^: e) w
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) 2 k0 Y  Z; n8 b( `% _" `
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    + f# ^- K. C; P6 a
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
    + {/ @! P; C# _8 g0 @# ?
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);
    * {0 P: i: r" D5 S1 u& C8 g" a
  12. }
    9 R/ v9 Y9 N' b- p  M5 ^

  13. - U% @7 Y# l4 J( w- W% x$ b  L
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    2 r1 @# O, ~$ d) F
  15.         return 0;
    1 F  F: P# }$ w5 ]* R6 [  n' E- a

  16. . Z3 X2 C" x, ^% r( f& J+ ]
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    ! w, C! y, y% v- y
  18. for (int index = 1; index <= current.outObjects.length; index++)
    & J) b" c* g/ v8 i* E4 Y) P
  19. {1 t' z5 U5 |7 V" y* u' D: }5 F
  20.         treenode curobj = current.outObjects[index];
    1 ^* B+ ]2 e1 F  {! @
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
    * ^1 _! s: l' m2 o. u$ i
  22.         //中间端口有连接实体,并且该实体为任务执行器
    , b' d9 b% @: H* O
  23.         {3 I' f: ?8 j5 |9 n( B, S* _2 `5 m
  24.                 double curdist = distancetotravel(curobj, destination);
    + L: ~- B! ]) w, x5 W4 l& S
  25.                 //计算任务执行器和目的地之间的距离) e7 k- ]; I0 `
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) + V: R( d; N, H( b' a6 L3 S
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。1 R, g5 @3 M4 z  n3 ^
  28.                         curmin = curdist;& n; R7 b- }2 N9 ]/ t, h
  29.                         minindex = index;: G! I: y0 ]5 `* P2 Q4 D
  30.                 }% h1 m, T2 o; ~, J/ U. F7 Q
  31.         }
    ( O0 `7 ?& G; l/ U, w5 N
  32. }
    : d* D- i7 f( G! }0 q' I6 R5 D( g

  33. : ~$ }6 u2 T  t/ {! Q, v! w. [
  34. return minindex;
    1 v* R+ q/ i" k4 G' w, a
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
5 L1 ~# N( d: |" \# V1 r% I% U
7 ?6 N, U+ w1 J0 u7 {+ r
随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-10-26 05:33 , Processed in 0.073335 second(s), 14 queries .

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

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