Агент обучения с подкреплением в FMU

Я хочу обучить агента обучения с подкреплением на модели, которую я создаю в OpenModelica. Используя pyFMI, легко импортировать FMU, смоделировать его и получить некоторые результаты.

Моя проблема в том, что у меня нет возможности "приостанавливать" симуляцию после каждого шага, получать состояния, кормить им своего RL-агента и возвращать его предлагаемое действие в качестве входных данных.

ModelicaGym кажется способом решить эту проблему путем запуска моделирования, остановки, получения результатов, определения следующего действия и повторного запуска моделирования с последним временем окончания в качестве времени начала.

Чтение статьи из Лундского университета (https://portal.research.lu.se/portal/files/7201641/pyfmi_tech.pdf) заставило меня задуматься о другой идее:

Создание FMU с Learner и подключение двух FMU через PyFMI.Master.

Что-то в этом роде:

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)

Управление схемой с помощью другого FMU с помощью ПИД-регулятора внутри работает, но возможно ли создать FMU с агентом обучения с подкреплением, включая все другие необходимые библиотеки, пакеты (Keras, Tensorflow?)

По моему мнению, такая реализация могла бы иметь довольно хорошую производительность, особенно для моделей и учащихся с более высокой сложностью, это может быть интересный подход.

Или я просто преследую какие-то мечты, потому что реализация алгоритма обучения с подкреплением в FMU невозможна или вызывает другие проблемы?

На самом деле, я был немного удивлен, что не нашел других людей, пытающихся реализовать это.

С наилучшими пожеланиями

Хенрик

2 ответа

Этот ответ может быть очень поздним, но, тем не менее, я нашел ваш вопрос во время исследования той же проблемы. На ваш вопрос, насколько я понимаю, дан ответ в статье.

Интеграция и оценка контроллера обучения с глубоким подкреплением в среде построения совместного моделирования[http://www.ibpsa.org/proceedings/BSO2020/BSOV2020_Amrani.pdf]

Однако в нашем контексте среда совместного моделирования, которая используется для изучения киберфизических систем, является мастером совместного моделирования и должна иметь возможность вызывать библиотеки Python или инструменты на основе AI изнутри совместного моделирования. При совместном моделировании контроллер требует взаимодействия с управляемым компонентом на каждой итерации. Следовательно, необходимо сгенерировать компоненты управления на основе AI в форме FMU, как и в случае с другими компонентами.

Короче: о таком решении мечтаете не только вы:-3

Возможно , вы можете обновить свой вопрос, чтобы было более понятно, как реализован обучающий агент, но я понимаю, что его можно использовать из Python?

Пример fmu_with_input_function.py из документации PyFMI показывает, как использовать функцию в качестве входных данных 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", вы не можете изменить их в процессе моделирования.

Сначала я бы попробовал с входными переменными, потому что настраиваемые параметры немного сложнее обрабатывать и могут быть некорректно реализованы в некоторых инструментах.

Другие вопросы по тегам