2

我想在我在 OpenModelica 中构建的模型上训练强化学习代理。通过使用pyFMI,导入FMU,模拟一下,得到一些结果是没有问题的。

我的问题是,我不可能在每一步之后“暂停”模拟,获取状态,用它喂给我的 RL 代理并返回他提议的动作作为输入。

ModelicaGym 似乎是通过启动模拟、停止、获取结果、定义下一个动作并以最后的结束时间作为开始时间再次开始模拟来解决这个问题的一种方法。

阅读隆德大学的一篇论文 ( https://portal.research.lu.se/portal/files/7201641/pyfmi_tech.pdf ) 让我想到了另一个想法:

使用 Learner 创建一个 FMU,并通过 PyFMI.Master 连接两个 FMU。

这些方面的东西:

from  pyfmi  import  load_fmu
from  pyfmi.master  import  Master

controller   = load_fmu("controller.fmu")
Circuit = load_fmu("circuit.fmu")

connections = [( Circuit ,"currentSensor1.i",controller ,"feedback1.u2"),
               (controller ,"PID.y",Circuit ,"signalVoltage1.v")]

models = [Circuit , controller]
master_simulator = Master(models , connections)
res = master_simulator.simulate(final_time =1)

使用内部带有 PID 控制器的其他 FMU 控制电路是可行的,但是是否可以使用强化学习代理创建 FMU,包括所有其他所需的库、包(Keras、Tensorflow?)

根据我的观点,这样的实现可以有很好的性能,特别是对于复杂度更高的模型和学习器,这可能是一种有趣的方法。

还是我只是在追逐一些梦想,因为在 FMU 中实现强化学习算法是不可能的,或者造成了其他麻烦?

实际上,我对没有发现其他人试图实现这一点感到有点惊讶。

最好的祝福

亨里克

4

2 回答 2

1

这个答案可能会很晚,但是我在研究完全相同的问题时发现了你的问题。你的问题是——据我了解——在论文中

建筑协同仿真环境中深度强化学习控制器的集成与评估 [此处找到 PDF ]

然而,在我们的上下文中,用于研究网络物理系统的协同仿真环境是协同仿真的大师,需要能够从协同仿真中调用基于人工智能的 Python 库或工具。在协同仿真中,控制器需要在每次迭代时与受控组件进行交互。因此,有必要像其他组件一样以 FMU 的形式生成基于 AI 的控制组件。

他们使用了一种名为 DACCOSIM NG 的工具,但后来引入了他们自己的方法来使这种方法更加简化。

希望你早就找到了自己的解决方案。

于 2021-08-26T11:21:34.080 回答
0

也许您可以更新您的问题,以便更清楚地了解学习代理是如何实现的,但我知道它可以从 Python 中使用?

PyFMI 文档中的示例fmu_with_input_function.py说明了如何使用函数作为 FMU 的输入。我想你可以像这样在这个函数中从 FMU 中检索信息(未经测试的伪代码):

from pyfmi import load_fmu

define input_object(model):
  response = model.get('response_variable_name')
  return ('input_var_name', learner(response))

model = load_fmu('model.fmu')

res = model.simulate(final_time=30, input=input_object(model))

您必须设置您的模型 FMU,以便您的学习者应该更改的变量 ( input_var_name),是输入变量可调参数。如果使用不带 的参数variability="tunable",则无法在模拟过程中更改它们。

我会首先尝试使用输入变量,因为可调参数处理起来有点复杂,并且可能无法在某些工具中正确实现。

于 2019-12-20T11:10:47.923 回答