全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。$ {5 s0 ]* p$ C. y4 w5 r
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:, c$ x6 z: S  n- `; ~& ]& i
7 [+ o2 d6 t& _# {
  1. treenode tasksequence = param(1);9 ^( z% ?, `+ x+ c
  2. Object current = ownerobject(c);
    : M" R* E1 H6 W# @6 P* ?$ }: A
  3. /**找到距离最近的任务执行器*/' w* Q6 j% a& y
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    3 i+ z, P# m4 n4 Z" w8 [
  5. double curmin = GLOBAL_UNREACHABLE;
    ' N7 U, J' C$ X: r! a% F8 \
  6. int minindex = 0;
    $ _2 H9 e# H- B
  7. treenode destination = NULL;
    $ {) G. t3 D+ o# z
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) 6 Q6 Q0 r$ i& P0 W2 W) f
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。  D& Z/ b) L$ p: ]" I& |" W8 X0 s/ I+ e
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)4 p) o. H% O$ j4 L
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);
    $ J) N$ u5 B& F  ]4 ?& O& H
  12. }
    , F* m) u3 @' g  m9 R$ e

  13. : Q( N( ?' p) h4 y6 u1 i7 e
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
      c* Y8 b5 @6 G+ n  n
  15.         return 0;+ P' ~  W/ ]7 m; J" b
  16. 8 `( f4 L: J% `. F1 w
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。" I1 Q+ `6 }4 R+ m' R! a
  18. for (int index = 1; index <= current.outObjects.length; index++) 7 A8 ]$ h: @9 i. s1 a
  19. {9 K) Y5 L/ u) [# F+ C4 |" F. |
  20.         treenode curobj = current.outObjects[index];; K$ Y, C* V( O- a  H- V
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER))
    , A- y5 Y5 o  |( P7 ^- g+ C
  22.         //中间端口有连接实体,并且该实体为任务执行器
    # r$ a7 E/ q1 y6 \. x
  23.         {
    . s+ h5 G: L2 `4 j
  24.                 double curdist = distancetotravel(curobj, destination);
    . K# o* m% p) B: J4 B) R
  25.                 //计算任务执行器和目的地之间的距离
    : K9 Y; T9 U* P5 {& z% ?
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) 3 L6 S0 Z3 G) \0 o& I! q. \
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。  f, O5 D8 v6 A' K2 ^/ u* U* ?
  28.                         curmin = curdist;
    - u, E: S5 P# W7 T  Y7 J
  29.                         minindex = index;
    5 o* E3 Z) Z$ X: b& i
  30.                 }' P$ q. E2 ~* V2 I
  31.         }: e! ]; n8 V- l; g: M
  32. }* [% m0 `0 u& K/ G
  33. $ y" x% Z6 h3 G4 G; B. g) V
  34. return minindex;0 ]3 E# z1 S; d" o$ G4 H, F
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
! C  x, A( E9 o1 T+ J3 A

8 U1 ^5 d: r" E+ _! v/ H7 x3 T6 r7 R随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-9-6 06:18 , Processed in 0.072693 second(s), 14 queries .

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

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