繁体   English   中英

Anylogic变量不更新

[英]Anylogic Variable Not Updating

我在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;

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

看起来您的SDC时段存储在SDC ,NDC存储在NDCRuleBreak是一个变量, Main或类似存储规则中断的总数)。

您的计算看起来没问题,但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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM