全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。% R# Z2 V) H7 O1 X! o: w0 e+ |
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
! ?( U$ ~. M3 n' N5 c
$ v: _8 i0 w! \: [  T; ]7 f
  1. treenode tasksequence = param(1);: C! S3 v+ M  y7 A% ?0 J
  2. Object current = ownerobject(c);* s8 ~: L  z: ~: f8 ^. A
  3. /**找到距离最近的任务执行器*/
    0 E  V8 S& a' z! @, `& J1 l
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/8 S9 i& Q) t0 X
  5. double curmin = GLOBAL_UNREACHABLE;
    $ A, l$ W  `" {9 z' x8 c
  6. int minindex = 0;
    9 @* \- y* k3 j; }# Y2 l1 V4 r
  7. treenode destination = NULL;+ l# O/ ]  q5 W$ Y
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) 5 p9 y- d+ t8 B  W* j
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。
    2 |  n; P, y5 V+ j2 ~5 [# ~
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
    5 ~- E( l/ X, n7 r
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);
      I$ N, l6 X. L2 R
  12. }8 A& @2 S; M' w9 m7 P# E- ~, \! `

  13. % e5 U* Q& V  ^# x! ?
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。* }5 B1 z& O% S
  15.         return 0;
    4 p: P) ]. u# G8 c
  16. ) W3 b* L  d6 Y2 n4 J8 I
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    5 Q0 K( D$ Q3 G* E
  18. for (int index = 1; index <= current.outObjects.length; index++) 2 ?) N9 f& j6 k* k" R
  19. {1 w; p. |8 M% f) ~. v/ d" y7 w' Q$ D
  20.         treenode curobj = current.outObjects[index];/ R- w# f( p7 S, U
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) % I" U) ]# I: U/ m+ R8 Z, z% L$ a: z
  22.         //中间端口有连接实体,并且该实体为任务执行器3 j- p& y4 k- l" g5 Q4 z
  23.         {# v, S, Z( c1 G, y
  24.                 double curdist = distancetotravel(curobj, destination);7 z6 O* T- ]$ X8 b, U% \9 q7 T
  25.                 //计算任务执行器和目的地之间的距离5 w' B) h  V. A! V
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    , p9 i" }7 L+ q
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。
    , L) W: g/ E- K7 }& _
  28.                         curmin = curdist;
    9 ]* o- ]' f6 D' C/ ?# t7 P
  29.                         minindex = index;
    ; Q& L/ z" F& v& R$ s$ {
  30.                 }
    " I3 q$ Y+ d0 A! b0 ]; E
  31.         }3 B/ e. D: B/ M2 B8 ~# J+ x" Q
  32. }+ b" h8 S8 a$ ~& e# Z0 d
  33. 9 ^6 D0 N9 ?5 _% {; }
  34. return minindex;
    6 |( T( f6 g/ n, M0 P* Q0 B
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
# c5 C$ M  i+ X

" s& h9 _# u+ |: a# J随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

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

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

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