Anylogic变量未更新

Posted

技术标签:

【中文标题】Anylogic变量未更新【英文标题】:Anylogic Variable Not Updating 【发布时间】:2019-09-05 13:23:03 【问题描述】:

我在 AnyLogic 中使用离散事件模拟器。我遇到了一些代码问题,这些代码更新了我的模拟中的变量。我存储了代理离开源块的日期时间和它进入接收器块的日期时间。我正在尝试记录所有代理的“规则中断”次数。规则中断定义如下(两种中断方式):

1) 如果在某个时间(称为SDC)之前收到代理,并且在当天下午5点之前没有完成代理,那么代理已经违反了规则

2)如果代理在第二天的某个时间(称为NDC)还没有完成,那么代理已经违反了规则

如果每个代理违反了名为 RuleBreak 的变量中的任一规则,我会为他们记录一个 0 或 1。但是,在我的模拟运行中,变量根本不会更新。我希望我只是错过了一些小东西。将不胜感激任何帮助! (代码如下)

Calendar received = Calendar.getInstance();
received.setTime(ReceivedDate);

Calendar completion = Calendar.getInstance();
completion.setTime(Completion);

Calendar SD_at_5 = Calendar.getInstance();
SD_at_5.setTime(ReceivedDate);
SD_at_5.set(Calendar.HOUR_OF_DAY,17);
SD_at_5.set(Calendar.MINUTE, 0);
SD_at_5.set(Calendar.SECOND, 0);

Calendar Tomorrow_at_NDC = Calendar.getInstance();
Tomorrow_at_NDC.setTime(ReceivedDate);
if(Tomorrow_at_NDC.get(Calendar.DAY_OF_WEEK) == 6)
    Tomorrow_at_NDC.add(Calendar.DATE, 3);
else 
    Tomorrow_at_NDC.add(Calendar.DATE, 1);
Tomorrow_at_NDC.add(Calendar.DATE, 1);
Tomorrow_at_NDC.set(Calendar.HOUR_OF_DAY,NDC);
Tomorrow_at_NDC.set(Calendar.MINUTE, 0);
Tomorrow_at_NDC.set(Calendar.SECOND, 0);

int Either_rule_break = 0;
double time_diff_SDC = differenceInCalendarUnits(TimeUnits.SECOND,completion.getTime(),SD_at_5.getTime());
double time_diff_NDC = differenceInCalendarUnits(TimeUnits.SECOND,completion.getTime(),Tomorrow_at_NDC.getTime());

if((received.get(Calendar.HOUR_OF_DAY) < SDC) && (time_diff_SDC <= 0))  
    Either_rule_break = Either_rule_break + 1;
else
   Either_rule_break = Either_rule_break + 0;

if((received.get(Calendar.HOUR_OF_DAY) >= SDC) && (time_diff_NDC <= 0))
    Either_rule_break = Either_rule_break + 1;
else
    Either_rule_break = Either_rule_break + 0;

if((Either_rule_break >= 1))
    RuleBreak = RuleBreak + 1;
else 
    RuleBreak = RuleBreak + 0;

【问题讨论】:

【参考方案1】:

您还没有真正解释此代码的使用位置和接收内容。我假设代码在一个函数中,在接收器的输入操作中调用,其中ReceivedDateCompletion 是每个代理存储的Date 实例(源退出时间和接收器进入时间,作为日期,通过 AnyLogic 的@ 987654324@函数)。

看起来您的 SDC 小时数存储在 SDC 中,而您的 NDC 小时数存储在 NDC 中(RuleBreakMain 中的变量或类似的存储总数违反规则)。

您的计算看起来不错,只是 Tomorrow_at_NDC 日历计算似乎错误:您将 1 天加两次(如果不是星期六)或 3 天加 1 天(如果是星期六;在 Java 日历中,第 1 天是星期一)。

(您的 Java 也非常“低效”,带有不必要的额外局部变量并在您不需要时执行逻辑;例如,没有必要做所有日历准备并检查您的类型 1 规则中断如果接收时间是在 SDC 小时之后。)

但是你确定有什么违反规则的吗?你如何设置你的模型以确保有(测试它)?另外,RuleBreak 绝对是流经您的 DES 的代理之外的变量(即,Main 或类似的)?另外,CompletionReceivedDate 肯定存储每个代理,因此,例如,如果您的函数被称为checkForRuleBreaks,您将在接收器退出操作中执行以下操作:

agent.Completion = date();   // Agent received date set earlier in Source action
checkForRuleBreaks(agent.ReceivedDate, agent.Completion);

(事实上,您根本不需要将完成日期存储在代理中,因为这将始终是您函数中的当前模拟日期,因此您可以在那里进行计算。)

【讨论】:

感谢您的意见。认为我可以根据您的帮助解决此问题,然后我将发布解决方案。为糟糕的解释道歉。

以上是关于Anylogic变量未更新的主要内容,如果未能解决你的问题,请参考以下文章

AnyLogic - 修改代理变量

在 AnyLogic 中保存变量

Anylogic:从模拟菜单访问变量

AnyLogic:有没有办法在优化实验中指定决策变量数组?

获取anylogic中最大值的变量名

Anylogic - 从其他代理访问变量