全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。+ @4 r3 l7 h5 Q' ^' B2 U9 O! C
以下为flexsim17.1自带,寻找行进距离最短的任务分配器:) [9 o3 b$ B8 \" _0 M  R! p# E

5 u  F2 a, w& o8 H4 D2 r1 E# I: [
  1. treenode tasksequence = param(1);
    / j2 ^, v8 a5 [4 O! F- \
  2. Object current = ownerobject(c);( h2 ^- K5 X" I6 _, @7 n2 [
  3. /**找到距离最近的任务执行器*/! G. u: K' {# g& X/ L8 _5 K
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*// a4 v8 s+ t2 s3 b. h! D& M
  5. double curmin = GLOBAL_UNREACHABLE;! ~) o* X6 w& j' g% D
  6. int minindex = 0;
    4 ?# _$ c; i2 ^) J4 e: C5 N3 F6 i" v
  7. treenode destination = NULL;; O) V& \) A7 R5 ~8 n) ^4 M
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++)
    3 K! h9 S' {6 ^' T, N
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。6 B; x  W; E2 l& d
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL); q. `+ v. X* v- k7 e; `
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);
    7 ], n) {2 q- s( |6 X
  12. }
    . g  a% h( F7 {: k. M5 C) X, |
  13. 4 c. ?3 e  @% G+ `
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    6 L' K' D0 u2 m$ z6 Y8 Y( g4 B3 X
  15.         return 0;
    3 ?& X9 q% t9 N9 v( P: o

  16. 4 S* }1 @9 y2 [9 K/ C: S5 z1 n6 H
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。
    7 d! E- _0 B' j# a5 _0 B
  18. for (int index = 1; index <= current.outObjects.length; index++)
    4 g) d0 I+ |) Z* T2 b, r
  19. {" X& l  r4 h& O5 @3 e- U
  20.         treenode curobj = current.outObjects[index];
    ( e3 J. B$ H1 _
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) 9 c$ C+ i# I* e1 m6 L; q$ w
  22.         //中间端口有连接实体,并且该实体为任务执行器1 a' p. r- K8 S) m1 H6 [
  23.         {
    $ f0 n( p# y# m& q4 Q; i
  24.                 double curdist = distancetotravel(curobj, destination);4 X3 B" E# l! q* b$ x* y- l
  25.                 //计算任务执行器和目的地之间的距离
    , V1 G! ~* k! E: K  ]/ ]7 f
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist))
    " y/ N9 k6 R3 C8 s
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。7 w) E; I# L, j; S( K& ]3 B
  28.                         curmin = curdist;
    9 K+ i5 _& S9 S2 X+ ~3 B
  29.                         minindex = index;/ N8 [) I7 p/ A- ~# p* y5 n
  30.                 }& e. b+ P& E$ |
  31.         }( e! O0 y, N6 `, O5 r; r
  32. }
    7 [8 B7 y8 V& s4 t/ K

  33. 8 h* d- }! W$ A  g" U# `
  34. return minindex;
    , w* z- |& U+ [' e  ^
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码

: ~$ w  t3 x8 Y& G; N$ _
9 e( N3 Z2 L  l# U2 \随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-9-6 08:12 , Processed in 0.060742 second(s), 15 queries .

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

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