微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

时间总和不等于模拟的持续时间

如何解决时间总和不等于模拟的持续时间

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

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

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

有什么方法可以知道问题是出自我建模时犯的错误还是 AnyLogic 本身的问题?不久前,我在 AnyLogic 计算距离并与支持人员联系的方式上遇到了类似的问题,所以我猜这一次可能又是 AnyLogic 处理时间的方式存在问题。


编辑,@Artem P. 的更多详细信息:

以下是用于计算经过时间的代码示例、代码总和以及状态图示例:

例如,这是机器的状态图。

Statechart

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

Waiting state entry and exit actions

然后我将每次添加到自己的数据集中,以便我可以在直方图中绘制它们并获得所有时间的百分比视图,因此 TnPAttente_DS.update();

如果您需要更多详细信息,我很乐意与您分享

解决方法

时间操作通常非常依赖于模型的时间单位以及实际添加的方式。因此,例如,如果您的模型时间单位是 SECOND,并且您以 SECOND 计算总数,即使用以下内容:

double startTime = time();
...
double elapsedTime += time() - startTime;

那么 elapsedTime 变量中的值为 29000 秒是不可能的,因为 time() 返回的值永远不会达到该值。

但是,如果您在几分钟内运行并需要在几秒钟内获得您的值,那么很可能在某个地方存在一个舍入问题,该问题会随着模型运行时间的累积而累积。 因此,总的来说,建议是:确保以正确的单位进行计数并避免四舍五入。

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

,

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

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

  • 您的开始和经过时间变量需要是 double 类型,每个代理的每个状态都有实例,并且这些变量除了各自的状态开始/结束时之外的任何地方都不会设置/更改. (您最好通过状态到经过时间的映射来构建它们;这也有助于避免愚蠢的错误,例如拼写错误,这意味着您正在更新另一种状态的变量而不是正确的状态。但您需要知道一个一些 Java 用于此。)看起来您正在为每个代理使用单个开始时间变量,这应该没问题,因为退出操作将始终在进入操作之前触发(因此您将在重置之前使用其值)。>

  • 您是否允许在模拟结束时留出“额外”时间(他们已经处于某种状态一段时间但并未离开)?虽然这只会导致计算时间不足,而不是过度计算。

  • 舍入问题(如 Artem 所述),如果您没有获得模型时间单位中的时间值(这需要在幕后进行划分)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。