Агент обучения с подкреплением в 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"
, вы не можете изменить их в процессе моделирования.
Сначала я бы попробовал с входными переменными, потому что настраиваемые параметры немного сложнее обрабатывать и могут быть некорректно реализованы в некоторых инструментах.