代理时间状态统计

时间:2018-04-01 07:29:40

标签: anylogic

我有兴趣了解AnyLogic社区用于记录州统计时间的不同方法。为了解释我的意思,我会给你一个例子:

说我正在为一家拥有多家影院的电影院进行建模。每个电影院都被建模为具有状态图表的代理人,其中电影院可以处于多个州之一:

  • 闲置(电影目前尚未使用)
  • 填充(电影是开放的,充满了顾客)
  • InSession(正在播放电影)
  • 清空(电影和顾客离开后顾客开放)
  • 弄脏了(电影会议结束后电影是空的,但尚未清理过)
  • 清洁(清洁工正在做他们的事)

假设我现在想要记录和输出每个电影所处的状态的时间和数量的统计数据:

Cinema 1 States:

+-----------+-------------+--------------+--------------+
| State     | Occurrences | Average Time | % Total Time |
+-----------+-------------+--------------+--------------+
| Idle      | 25          | 60           | 20%          |
+-----------+-------------+--------------+--------------+
| Filling   | 50          | 20           | 10%          |
+-----------+-------------+--------------+--------------+
| InSession | 50          | 90           | 40%          |
+-----------+-------------+--------------+--------------+
| Etc.      | ...         | ...          | ...          |
+-----------+-------------+--------------+--------------+

请分享您在AnyLogic中实现此目的的技术。

1 个答案:

答案 0 :(得分:0)

无论你做什么,你都需要创建一个收集信息的变量......

<强>出现次数:
你有一个名为occurrence开始的变量0和每次代理进入状态时递增1。您可以计算以后执行average(cinemas,c->c.occurrences)

的所有代理的平均值

<强>平均时间:
您可以使用代理调色板中的集合或数据集或分析中的统计数据。有很多方法可以做到这一点,我不会在这里列出它们,但是数据集中的stastics对象有它们自己的平均值( getYmean和mean分别)你可以使用的函数。 在状态空闲的情况下,你必须有一个变量timeIdle,例如你在状态空闲时每个时间单位递增

if(inState==idle) timeIdle+=timeUnit

当代理程序退出状态时,或者在模拟结束时,或者当您想要测量值时,如果使用数据集,则可以执行data.add(timeIdle),以及何时需要检索你可以做data.getYmean()的平均时间,如果它是数据集对象,或者data.mean(),如果它是统计对象

%总时间:
同样的事情,有一个名为percTotalTime的变量......只要你需要读取值就行percTotalTime=timeIdle/time()

你必须为每个州做同样的事情。