【问题标题】:Decrease delay of an agent减少代理的延迟
【发布时间】:2019-04-08 06:41:12
【问题描述】:

在流程建模库中的anylogic块中有一个名为Delay的对象,它有一个函数extendDelay

void extendDelay(Agent agent, double dt) - 延长给定的延迟 代理(如果可以将 null 作为参数传递,则全部延迟 代理会受到影响)。

它不接受负数的dt,但我需要减少代理延迟时间,这里是错误:

java.lang.RuntimeException: root.UnicastService:
Parameter dt has invalid value: -0.9652996653680965

我的问题是:我如何减少延迟时间或为代理设置新的延迟时间,是否可以在不退出延迟对象的情况下这样做。

【问题讨论】:

    标签: anylogic


    【解决方案1】:

    几种方式,取决于模型中实际发生的情况。

    一个选项:将延迟对象替换为等待对象。这有一个 myWait.free(agent) 的方法,您可以在任何时候使用它来释放任何特定代理,即当您的模型确定“现在是时候”时。

    无需减少/修改延迟时间。

    另一种方法可能是将延迟模式从默认的“指定时间”切换到“直到 stopDelay() 被调用”,在延迟对象属性的顶部。现在所有代理都等到您直接呼叫他们。同样,这可能比减少等待时间更优雅。

    干杯

    【讨论】:

    • 延迟对象非常适合我的问题:我有 1 个源和 1 个延迟对象,延迟时间等于 N*du/C,其中 C 是常数(例如 5 位/秒)和 N是服务的设备数量,du 是一个常数(例如 20 位)。我需要的是每次新代理到达延迟对象或离开它时重新计算剩余的服务(延迟)时间。
    【解决方案2】:

    我同意 Ben 的观点,即您应该使用等待块...对我来说这听起来更自然...但是如果您无论如何都坚持使用延迟,那么您可以这样做:

    1. 在您的代理中创建一个名为 totalReduction 的变量,类型为 double 初始值 0
    2. 在您的代理中创建一个名为reduceDelay 的事件,该事件由超时和模式用户控制触发...在延迟操作中您将拥有main.delay.stopDelay(this);
    3. 现在...每次你想减少延迟时间都可以使用下面的代码,假设“a”是你想减少延迟的代理

      double remainingDelay=delay.getRemainingTime(a);
      double delayReduction=4;//或任何你想减少的时间
      a.totalReduction+=delayReduction;
      double newRemainingDelay=remainingDelay-a.totalReduction;
      if(newRemainingDelay<=0){
      delay.stopDelay(a) ;
      } 否则{
      a.reduceDelay.restart(newRemainingDelay);
      }

    【讨论】:

      猜你喜欢
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2019-12-12
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      相关资源
      最近更新 更多