减少代理的延迟

时间:2019-04-07 12:00:36

标签: anylogic

在Process Modeling Library块中的anylogic中,有一个名为Delay的对象,它具有功能 extendDelay

  

void extendDelay(Agent agent,double dt)-扩展给定延迟   代理(如果可以将null作为参数传递,则所有延迟   代理商将受到影响。)

它不接受带有负数的dt,但是我需要减少座席延迟时间,这是错误消息:

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

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

2 个答案:

答案 0 :(得分:1)

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

一个选项:用Wait对象替换Delay对象。该方法具有myWait.free(agent)的一种方法,您可以在任意时候使用它来释放任何特定的代理,即,只要模型确定“现在是时候”。

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

另一种方法可能是在“延迟”对象属性的顶部,将“延迟”模式从默认的“指定时间”切换为“直到调用stopDelay()”。现在,所有座席都会等到您直接将他们召唤出去。再说一次,可能比减少等待时间更优雅。

欢呼

答案 1 :(得分:1)

我同意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);
    }