全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。" Q+ ]! K' C8 w# u0 d
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:7 T/ T9 B6 N3 s& r) P( E' z; G; g6 V
6 i% [0 o' B1 D- k7 I/ G! a
  1. treenode tasksequence = param(1);3 ?6 Z2 Q+ p% v: {
  2. Object current = ownerobject(c);  |; V- X" x! L; B5 M2 U3 y
  3. /**找到距离最近的任务执行器*/9 w* }$ C. \  P; R& ]
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    2 y9 Y3 {' R- i% A$ g
  5. double curmin = GLOBAL_UNREACHABLE;
    $ X0 a0 o- q0 L, s
  6. int minindex = 0;4 A( N0 `' w& b, t
  7. treenode destination = NULL;
    # ^" ^9 \+ {  a6 h4 O
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) 2 W) r4 I$ m0 x; q
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    ' W: z8 Y. _; ^7 r, ^/ [
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL). C6 {# o8 f7 Q; W. }4 u% m8 f
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);
    4 g5 B( A# H/ v" C; R$ ], w
  12. }
    ! o+ {6 z6 j5 b3 _6 m

  13. / G  X. K& L- N" ~" V
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。6 N0 d2 x+ @, K5 F0 S
  15.         return 0;
    1 y$ A" q- `$ E2 L4 b
  16. + r/ R8 P5 o# T/ {, @( w6 _3 t
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    . b1 W  C* I/ U" h
  18. for (int index = 1; index <= current.outObjects.length; index++) # s  Y* x. K4 F( r/ J4 A; A2 }. S
  19. {
    . ^, I1 w6 r, X, v3 U
  20.         treenode curobj = current.outObjects[index];
    $ r. h/ {5 d# O$ B
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) $ v0 Z( j$ l: w
  22.         //中间端口有连接实体,并且该实体为任务执行器2 Z$ y* E  L/ `9 [" D
  23.         {
    & z' G4 [: r4 d# w4 H7 F
  24.                 double curdist = distancetotravel(curobj, destination);
    2 C* i* P* S& @7 o+ Z) |% o
  25.                 //计算任务执行器和目的地之间的距离/ T4 Y7 ?* ~; H$ B# V
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    . u  {6 E- b: @; a/ Y( A
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
    ; E1 P1 L6 q, j. U& `
  28.                         curmin = curdist;
    ' o* {4 F/ C7 c- ]* R, ?
  29.                         minindex = index;9 Q1 |5 I( I% t+ s2 a
  30.                 }$ j, G8 X/ S! v
  31.         }1 W6 [% s0 y$ }+ C  d: d
  32. }1 _5 k9 q" _2 g& K8 y
  33. 7 l  k! [! r; q/ M# B  k
  34. return minindex;
    5 h. c0 {4 b; O
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码

; L" u+ G4 v, o/ d1 G# W
4 q- K, B" y! }" U# |0 G随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-6-30 07:43 , Processed in 0.060436 second(s), 15 queries .

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

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