全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2017-4-24 01:03:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务分配器的pass to选项,返回的是一个端口值。将任务分配给与该中间端口连接的任务执行器。
. M& H, S  |( P8 v% O: i+ O. Q以下为flexsim17.1自带,寻找行进距离最短的任务分配器:
" y3 W2 l# U- y& [0 p
6 R9 J' K" d- k8 [
  1. treenode tasksequence = param(1);
    * ^# N9 Q  @! Y4 C* T5 |$ K
  2. Object current = ownerobject(c);, b) ]) G+ E5 t- X3 d
  3. /**找到距离最近的任务执行器*/# M- _4 _" l  K
  4. /**如果任务执行器在网络路径上,则计算网络路径的距离,否则计算实体中心点间距。*/
    2 h, l  M1 o; [" ~# j; b+ n, J
  5. double curmin = GLOBAL_UNREACHABLE;
    7 C9 `4 k: U: J0 r
  6. int minindex = 0;1 |3 C8 l( V& |# E1 |1 F. q
  7. treenode destination = NULL;
    5 d6 {6 }0 M; s+ }# u
  8. for (int taskrank = 1; taskrank <= gettotalnroftasks(tasksequence) && destination == NULL; taskrank++) ( @4 H: w0 R# a; m; L" _* {9 S
  9. {  // 找到第一个行进任务,并获取行进目的地。&& destination == NULL确保一旦找到行进目的地就退出for循环。/ q* [* H$ {/ S  Y9 N2 _1 {* |( D
  10.         if (gettasktype(tasksequence,taskrank) == TASKTYPE_TRAVEL)
    1 l- z0 {/ E' h
  11.                 destination = gettaskinvolved(tasksequence,taskrank,1);
    ' p5 e3 y" G6 y' e( p2 K" a: H
  12. }
    8 o. K$ j( a$ h  b% ^

  13. ! i# `& L4 Y" U1 p5 s5 n, G! s+ Z
  14. if (destination==NULL) // 如果没有行进任务,把任务传递给第一个可用任务执行器。
    5 P" S& N4 u$ K
  15.         return 0;
    2 F: o( p, F3 n: t; n
  16. - e9 U2 e- [# f! {$ Z3 {: _% p. Z
  17. //如果有行进目的地,则遍历所有任务执行器,寻找距离最近的那个。, _  j6 l) i2 X( a# z4 L9 C9 s
  18. for (int index = 1; index <= current.outObjects.length; index++) ; }0 t/ ]( v& z) W' h7 y  \( A  M
  19. {
    4 g: M% K$ J5 c* c
  20.         treenode curobj = current.outObjects[index];
    * R; O7 w( U% t" l
  21.         if (curobj && isclasstype(curobj, CLASSTYPE_TASKEXECUTER)) 6 h. R6 m3 s/ Y+ O$ s1 U* c
  22.         //中间端口有连接实体,并且该实体为任务执行器
    . g& g# |8 Q6 X1 b; a! q
  23.         {
    ; Q2 S, n4 I1 v9 V* R* Q
  24.                 double curdist = distancetotravel(curobj, destination);
    . V; k9 Y  c) n* q7 {% j
  25.                 //计算任务执行器和目的地之间的距离
      H" z# p5 R. d0 I% R
  26.                 if (curdist != GLOBAL_UNREACHABLE && (curmin == GLOBAL_UNREACHABLE || curmin > curdist)) 5 _& Q, Z$ ~: }  h
  27.                 {//如果计算出来的距离小于curmin,则更新curmin,把当前距离作为最小距离。' A1 [# Z! ?: X9 Y* {
  28.                         curmin = curdist;! C# o0 u, g9 A' c3 d2 ?, w
  29.                         minindex = index;1 i5 w' f1 @! ?: V( V3 V" p
  30.                 }( ]/ m, e: [4 |1 r$ h- q
  31.         }
    9 G" F! F) L7 b  l8 [9 q" p; I1 W! G; Y
  32. }" A0 [% [+ f- U$ A0 F% g; T( R- R; T

  33. / z7 [6 X. d' W% U" Y* D7 G
  34. return minindex;* s* |" d3 c/ e' H/ X6 i2 l
  35. //返回minindex,距离最近的那个任务执行器在任务分配器上的中间端口号。
复制代码
4 F3 T* U9 W# x' B5 K7 I
5 _' V0 T7 w$ O& w3 z1 W
随手翻,不保证正确性、可读性。

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-6-30 17:39 , Processed in 0.064229 second(s), 14 queries .

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

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