FMU中的强化学习代理

时间:2019-12-19 12:28:25

标签: tensorflow keras fmi pyfmi

我想在OpenModelica中建立的模型上训练强化学习代理。通过使用pyFMI,可以导入FMU,对其进行仿真并获得一些结果。

我的问题是我无法在每个步骤之后“暂停”仿真,获取状态,向我的RL代理提供反馈并返回他的拟议行动作为输入。

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

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

用学习者创建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中实施强化学习算法或引起其他麻烦?

实际上,我没有找到其他尝试实施此方法的人感到有些惊讶。

最诚挚的问候

亨里克

1 个答案:

答案 0 :(得分: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)是输入变量。如果使用参数,则无法在仿真过程中更改它们。