【问题标题】:Anylogic: How to create an objective function using values of two dataset (for optimization experiment)?Anylogic:如何使用两个数据集的值创建目标函数(用于优化实验)?
【发布时间】:2022-02-10 06:56:54
【问题描述】:

在我的 Anylogic 模型中,我有一组代理(4 个终端),卡车到达、接受服务和离开。码头有两个参数(numberOfGatesservicetime)影响每小时离开码头的卡车的departures。现在我想调整这两个参数,使每小时的发车次数最接近现实(我知道每小时的实际发车次数)。我在每个终端代理中已经有两个数据集,一个是我模拟的每小时 departures 的量,另一个是来自数据的 observedDepartures

我已经在每个终端的图中比较了这两个数据集:

现在我想创建一个优化实验来调整终端的numberOfGatesservicetime,使departure 数据集最接近observedDepartures 数据集。有谁知道如何为这个优化实验创建一个(n)(目标)函数最简单的方法?

当我添加一个由abs( departures - observedDepartures) 每小时更新的变量diff 并将root.diff 放入优化实验中时,它给了我eq(null) is not allowed. Use isNull() instead 错误,在读取@987654342 的数据库的行中@(见上图),但是我正常运行模拟的时候就可以了,运行优化实验的时候才报这个错误(不知道为什么)。

【问题讨论】:

    标签: function optimization parameters dataset anylogic


    【解决方案1】:

    您可以使用每次复制的差值总和的绝对值。也就是说,创建一个每小时记录| difference | 的变量,将其命名为diff。然后在优化实验中,最小化那个变量之和的值。事实上,这接近于典型回归模型的目标。他们使用更复杂的目标函数,通过最小化差异的平方和。

    【讨论】:

    • 感谢您的评论和帮助。我没有成功完成这项工作。如何存储每小时的差异?当我给变量提供每小时变化的变量/数字之间的绝对差值时自动?或者通过添加一个循环事件(但我没有成功地将一些值从一个事件添加到一个变量)?以及如何在目标函数中对这个变量求和?现在它说该变量无法解析为变量...
    • 您实际上需要一个数字来表示整个复制,这将是偏差绝对值的总和。而且您应该能够从事件中更新一个变量。在每个小时结束时,您只需使用 diff+=abs( departures - observedDepartures) 更新 diff 变量。在优化实验中,您不需要求和。您的目标函数将是 `minimize (diff)`。
    • 我不知道你说的第一句话是什么意思。我在终端代理中添加了事件和变量(所以每个终端都有一个),优化实验(有顶级终端)最小化diff,但我收到了这个错误eq(null) is not allowed. Use isNull() instead。也许是因为我有 4 个终端代理?但不知道为什么..
    • 是.. 目标函数中的root.terminals(0).diff + root.terminals(1).diff+... 不起作用?
    • 在较小的模型中运行实验时,只有该部分的必需品,它可以工作:) 谢谢!
    【解决方案2】:

    校准实验已经完成(以更数学上正确的方式)您正在尝试做的事情,使用内置的 difference 函数来计算“两条曲线之间的面积”(这是优化试图做的)最小化)。你不需要自己计算差异或任何东西。 (该函数有两种变体来比较两个数据集(您的情况)或一个数据集和一个表函数(如果您的经验数据与您的合成模拟数据不在同一时间点,则很有用)。)

    在您的情况下,它(目标函数)需要是 4 个终端的经验数据集和模拟数据集之间差异的总和(或者如果认为某些终端的拟合比其他终端更重要,则可能是加权总和)。

    所以你的目标是这样的

    difference(root.terminals(0).departures, root.terminals(0).observedDepartures)
    + difference(root.terminals(1).departures, root.terminals(1).observedDepartures)
    + difference(root.terminals(2).departures, root.terminals(2).observedDepartures)
    + difference(root.terminals(3).departures, root.terminals(2).observedDepartures)
    

    (最好为函数中的任意数量的终端计算这个,但这是代码的“原始形状”。)

    校准实验实际上只是一个向导,它创建以特定方式设置的优化实验(使用 UI 和已为您创建的所有设置/代码),因此您可以在现有优化实验中使用该目标(但它不会像校准实验那样内置有用的 UI)。这也意味着您仍然可以在个人学习版中进行设置(没有校准实验)。

    【讨论】:

      猜你喜欢
      • 2021-02-15
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 2022-01-18
      • 2019-11-13
      • 2021-02-08
      相关资源
      最近更新 更多