Java 次数之和不';t总计为模拟的持续时间

Java 次数之和不';t总计为模拟的持续时间,java,time,simulation,anylogic,agent-based-modeling,Java,Time,Simulation,Anylogic,Agent Based Modeling,我有一个工业模拟,有两种代理类型,操作员和机器。每种代理类型都有状态图控制其逻辑的不同方面,如生产、空闲等。当进入和退出状态图的每一个状态时,计算时间,以确定每个操作员或机器在每个状态下花费的时间。因此,在模拟结束时,我将打印它们或使用直方图绘制它们,以查看每个步骤/状态的百分比 我遇到的问题是模拟的长度是480分钟或28800秒,但我计算的时间总和在运行之间和代理之间是不同的(因为我有9台机器(来自代理类型机器)和6台操作员(来自代理类型操作员))。例如,运算符1的时间为28750秒,运算符2

我有一个工业模拟,有两种代理类型,操作员和机器。每种代理类型都有状态图控制其逻辑的不同方面,如生产、空闲等。当进入和退出状态图的每一个状态时,计算时间,以确定每个操作员或机器在每个状态下花费的时间。因此,在模拟结束时,我将打印它们或使用直方图绘制它们,以查看每个步骤/状态的百分比

我遇到的问题是模拟的长度是480分钟28800秒,但我计算的时间总和在运行之间和代理之间是不同的(因为我有9台机器(来自代理类型机器)和6台操作员(来自代理类型操作员))。例如,运算符1的时间为28750秒,运算符2的时间为29000秒,依此类推

我认为时间低于28800秒的原因是,有时模拟在代理离开当前状态之前就结束了,因此函数不会更新,因为它没有启动exist操作。这对我来说很有意义。但是没有意义的是,超过模拟长度(>28800秒)的代理,一些代理的时间总和超过了整个模拟的持续时间,我不明白为什么

有没有办法知道这个问题是因为我在建模时犯了一个错误,还是因为AnyLogic本身的问题?不久前,我在AnyLogic计算距离和联系支持方面遇到了类似的问题,所以我猜这一次可能又是AnyLogic处理时间方面的问题


编辑,有关@Artem p的更多详细信息:

下面是一个用于计算所用时间的代码示例,以及代码的总和,以及一个状态图示例:

例如,这是机器的状态图

在每个状态(最低级别的状态,而不是较高级别的状态)的进入操作和退出操作中,都有计算进入时间、存在时间和减法的代码,例如,这些是等待状态的进入和退出操作:

然后我将每次都添加到它自己的数据集中,这样我就可以将它们绘制在直方图中,并拥有所有时间的百分比视图,从而得到
TnPAttente_DS.update()


如果你需要更多的细节,我很乐意与你分享

时间操作通常非常依赖于模型的时间单位和实际添加的方式。例如,如果您的模型时间单位为秒,并且您以秒为单位计算总计,即使用以下公式:

double startTime=time();
...
双elapsedTime+=time()-startTime;
然后在
elapsedTime
变量中不可能有29000秒的值,因为
time()
返回的值永远不会达到该值

然而,如果您以分钟为单位运行,并且需要以秒为单位的值,那么很可能在模型运行时的某个地方存在舍入问题。 因此,总的来说,建议是:确保以正确的单位进行计数,避免四舍五入


当然,如果您通过屏幕截图共享代码和模型布局,可以提供更详细的建议。

这不起作用的原因可能有很多:

  • 在每个简单状态下,您是否确实设置了开始时间(输入操作)并增加了经过的时间(退出操作)?您的屏幕截图显示您正在使用复合状态:确保您没有通过复合状态和简单状态重复计算时间

  • 开始时间和经过时间变量的类型必须是
    double
    ,每个代理的每个状态都有实例,并且这些变量在其各自状态开始/结束时以外的任何位置都不会设置/更改。(你最好通过状态到运行时间的映射来组织它们;这也有助于避免愚蠢的错误,例如拼写错误,这意味着你正在为另一个状态而不是正确的状态更新变量。但是你需要了解一些Java。)看起来您为每个代理使用了一个启动时间变量,这应该可以,因为退出操作总是在进入操作之前触发(因此您将在重置它之前使用它的值)

  • 您是否考虑到模拟结束时的“额外”时间(他们已经处于一种状态一段时间,但没有离开)?虽然这只会导致计数时间不足,而不是计数过度

  • 如果您没有获得模型时间单位中的时间值(需要在封面下进行分割),则会出现舍入问题(如Artem所述)


最好不要调用
time()
,而是将单位作为参数,例如
time(MINUTE)
。这样,你就可以一直依靠这些单位了。是的,我做得很像@Benjamin said。我正在使用
时间(秒)
。但它仍然没有达到模拟的28800秒,它要么少一点,要么多一点(通常在10到100秒的范围内)嗨!感谢您的回答,*是的,我的
startTime
变量的类型为
double
!由于任何逻辑的工作方式,它们没有明确说明,但在编译模拟时,它们确实属于
double
!*同样,这是AnyLogic内部的东西,我对它没有太多控制权,时间增量由AnyLogic而不是我来处理。*我同意这一点,这是我在第3段前半部分试图解释的,但这只能解释小于模拟长度的时间,不能解释更高的时间。*舍入不应该是一个问题,因为所有时间都在
秒内处理
你说的“不解释”是什么意思