我在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;
答案 0 :(得分:0)
您还没有真正解释过此代码的使用位置以及接收的内容。我假定代码在接收器的on-enter动作中调用的函数中,其中ReceivedDate
和Completion
是每个代理存储的Date
实例(源退出时间和接收器进入时间,如日期,通过AnyLogic的date()
函数捕获)。
看起来您的SDC的小时数存储在SDC
中,而您的NDC的小时数存储在NDC
中(其中RuleBreak
是{{1}中的变量}或类似的值存储规则总数。
您的计算看起来不错,除了Main
日历计算似乎是错误的:您将两次添加1天(如果不是星期六)或添加3天加上1天(如果是星期六;在Java日历中,是星期几) 1是星期一)。
(您的Java也非常“低效”,带有不必要的额外局部变量,并且在不需要时执行逻辑;例如,毫无意义地进行所有日历准备工作,并检查接收时间是否违反了类型1规则在SDC小时之后。)
但是您确定是否有 条规则突破;您如何设置模型以确保存在(进行测试)?另外,Tomorrow_at_NDC
肯定是流经DES的代理之外的变量(即RuleBreak
中的变量或类似变量)吗?加号Main
和Completion
肯定是每个代理存储的 ,例如,如果您的函数名为ReceivedDate
,则将在接收器中执行以下操作退出动作:
checkForRuleBreaks
(实际上,您完全不需要在代理中存储完成日期,因为该日期始终是函数中的当前模拟日期,因此您可以在那里进行计算。)