Anylogic变量未更新

时间:2019-04-15 14:19:47

标签: simulation anylogic

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

1)如果在某个时间之前收到代理(称为SDC),并且该代理在同一天下午5点之前还没有完成,则表示该代理违反了规则

2)如果业务代表在第二天的某个时间之前未完成(称为NDC),则该业务代表违反了规则

如果每个代理违反了称为RuleBreak的变量中的任何一条规则,则我为每个代理记录一个零或一个。但是,在我的模拟运行中,变量根本不会更新。我希望我只是想念一些小东西。将不胜感激! (下面的代码)

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 个答案:

答案 0 :(得分:0)

您还没有真正解释过此代码的使用位置以及接收的内容。我假定代码在接收器的on-enter动作中调用的函数中,其中ReceivedDateCompletion是每个代理存储的Date实例(源退出时间和接收器进入时间,如日期,通过AnyLogic的date()函数捕获)。

看起来您的SDC的小时数存储在SDC中,而您的NDC的小时数存储在NDC中(其中RuleBreak是{{1}中的变量}或类似的值存储规则总数。

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

(您的Java也非常“低效”,带有不必要的额外局部变量,并且在不需要时执行逻辑;例如,毫无意义地进行所有日历准备工作,并检查接收时间是否违反了类型1规则在SDC小时之后。)

但是您确定是否有 条规则突破;您如何设置模型以确保存在(进行测试)?另外,Tomorrow_at_NDC肯定是流经DES的代理之外的变量(即RuleBreak中的变量或类似变量)吗?加号MainCompletion肯定是每个代理存储的 ,例如,如果您的函数名为ReceivedDate,则将在接收器中执行以下操作退出动作:

checkForRuleBreaks

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