AnyLogic sims 的函数拟合和数据拟合
Posted
技术标签:
【中文标题】AnyLogic sims 的函数拟合和数据拟合【英文标题】:Function fit and data-fitting with AnyLogic sims 【发布时间】:2021-04-30 13:22:05 【问题描述】:在模拟中,我得到一些看起来像 arctan 或 tanh 函数的数据。
我想实现一个适合 Java 的函数,以获取该函数的参数以进行优化。对于其他函数,我使用了例如多项式和高斯函数的函数拟合的 Apache 代码,但找不到切线的解决方案。
说实话,我不知道如何编写这样的函数 fit,所以也许有人可以帮助我解决这个问题,或者知道是否已经存在适合此类函数的函数。
【问题讨论】:
你的问题有点不清楚。如果,而不是 Ben 在他的回答中假设的那样,您正在谈论更普遍地将函数拟合到数据(例如,在您的模型中用作“硬编码”函数 --- 预先拟合到外部数据 --- 生成某些东西),这是您在模拟之外使用 Stat::Fit 等工具所做的事情。 (我认为其他一些模拟工具,比如 Simul8,有 Stat::Fit 作为插件,但 AnyLogic 没有。) 最后,我正在将 Excel 文件中的值(x 和 y 值)读入 Anylogic。由于我在模拟过程中需要一个优化函数,我想从这个数据中确定一个函数或一个正切函数的参数并输出它。由于这应该发生在 Anyogic 中,因此我正在寻找解决方案。如前所述,我使用了来自 Apache(通用数学曲线拟合器)的代码,其中包含高斯函数和多项式函数。不过函数还是太软了,所以想试试切线函数。 正如我所说,AnyLogic 没有内置的通用数据拟合功能(除了一些用于通用插值的功能 --- 请参阅帮助中的表函数),根据您的描述,这是'本质上不是应该在模拟中完成的事情。 (你会事先使用 Stat::Fit 之类的东西来做。)同样为切线函数确定 parameters 是有意义的,但是“确定一个 function [.. .] 对于正切函数”是什么意思? 您可能还想解释“我需要一个优化函数”是什么意思? AnyLogic(启发式)优化中没有任何内在的“需要函数”,所以我假设你只是在你的 to-have-its-parameters-optimized 模拟设计中说一些东西意味着你想要使用数据拟合函数(而不是由于某些无法解释的原因,而不是离散的经验数据值)。 再进一步,也许:我的整体模型是运行 33 年后。但是优化本身应该在一年中的每个月运行。因此,这不是对整个模型的优化,而是对中间结果的优化。由于我没有找到解决方案,因此我的想法是实现一个曲线拟合器,将我的直方图数据输出为函数,然后可以将其用作优化中的条件。但是要获得数据的函数,我需要这个曲线拟合器来给我函数的参数。 【参考方案1】:有一个名为“基于代理的 SIR 模型的校准”的示例模型可以满足您的需求:校准模型参数,使输出与给定函数匹配(在此示例中不相切,但易于调整)
【讨论】:
在哪里可以找到它?但我不想更改模型参数,我想确定最适合我的数据的函数的参数......并且该函数应该是一个正切函数 在 AnyLogic 菜单 -> 帮助 -> 示例模型中。始终检查那里的好习惯,涵盖了许多用例,非常好的资源。我认为该模型正在做您正在寻找的事情 啊,好吧,我在“SIR Agent Based Calibration”的名称下找到了它……我会试试的,但我仍然认为这不是我要寻找的……也许你看看关于我在 Stuart 下的评论【参考方案2】:简答
AnyLogic 没有任何内置的数据拟合功能,除了离散数据的简单插值(请参阅帮助中的表函数)。所以
(a) 如果您需要在模型中执行此操作(例如,由某些模型状态驱动),您需要找到一个合适的 Java 库来完成您已经尝试过的事情(Apache Commons ),并从 AnyLogic 模型中调用它;
(b) 如果您可以在模型之外执行此操作,请使用 Stat::Fit 之类的数据拟合工具(它作为 Simul8 等一些模拟工具的插件存在,但不适用于 AnyLogic)。
更长的答案
根据您的其他解释性 cmets,听起来这是一个正确解释您的上下文至关重要的问题,也许您根本不需要使用数据拟合(并且可能有更多的“AnyLogic-在这种情况下以中心的方式接近它)。特别是围绕模拟和(数学)Gurobi 优化之间的预期交互; 请注意,AnyLogic 通过 OptQuest 内置了启发式优化,因此任何关于 AnyLogic 的“优化”的正常讨论都是指这一点。
一方面,您似乎建议您希望将函数拟合到一些输入数据到您的模拟中。 (您谈到拥有 Excel 输入并希望为其拟合曲线。)
另一方面,您似乎建议您需要一种基于运行时模型状态在中间时间间隔进行优化的方法。但是优化器决定的是什么,它的结果如何影响模拟的持续执行?你说“所以这不是整个模型的优化,而是中间结果的优化。因为我没有找到解决方案”。您在寻找什么“解决方案”?这听起来类似于一种方法,您在模拟中为时间段 N 制定决策建模,其中这些决策基于使用周期 N-1 的结果作为其输入的优化(因此优化有效地基于使用函数的模拟的简化仿真,因为模拟已经被认为是真实世界系统的最准确的计算表示)。
所以也许(?)您是说您正在模拟/近似模拟作为其输入数据的函数(您碰巧认为切线函数适合)。在这种情况下,最初的建议 (a) 可能是唯一有意义的事情。尽管如此,当您在第一个时间段之后优化任何内容时,“输入”不再是原始模型输入;它们是模拟当前状态/结果的某种表示(因此尚不清楚这是否与 Excel 输入数据直接相关,因此也许我找错了树)。
【讨论】:
我还建议编辑您的问题以填写您在 cmets 中添加的详细信息,以及根据我在这里提出的问题变得更清晰的任何内容(就如何提出您的问题而言)在这个答案中。但是您的电话取决于此处的“长答案”是否有帮助! ...或者可能将其保留为特定的“与 AnyLogic sims 的数据拟合”问题,但对 sim+优化上下文以及如何实现它有一个单独的问题(?) 首先感谢您的详细解答。关于输入数据:每年,根据模拟的进度,输入数据以及直方图数据都会发生变化。由于这些对优化条件有影响,因此直方图数据应作为函数进行积分,但其参数每年都在变化。通过 Curvefitter,我每年也会得到这些,并且可以适应优化中的条件。但也许有更聪明的方法来做到这一点。 一年后,结果将保存在 Excel 文件中,并用作下一年模拟的基线。以上是关于AnyLogic sims 的函数拟合和数据拟合的主要内容,如果未能解决你的问题,请参考以下文章