Можно создать более простые пользовательские среды обучения с подкреплением с помощью пользовательских функций, как описано в Создают Среду MATLAB с помощью Пользовательских Функций.
В качестве альтернативы можно задать пользовательскую среду обучения с подкреплением путем создания и изменения класса среды шаблона. Можно использовать пользовательскую среду шаблона для:
Реализуйте динамику более сложной среды.
Добавьте пользовательскую визуализацию в свою среду.
Создайте интерфейс к сторонним библиотекам, заданным на языках, таких как C++, Java® или Python®. Для получения дополнительной информации смотрите Внешние Интерфейсы Языка (MATLAB).
Для получения дополнительной информации о создании классов MATLAB®, смотрите Пользовательские Классы (MATLAB).
Чтобы задать вашу пользовательскую среду, сначала создайте файл шаблонного класса, задав имя класса. В данном примере назовите класс MyEnvironment
.
rlCreateEnvTemplate("MyEnvironment")
Программное обеспечение создает и открывает файл шаблонного класса. Шаблонный класс является подклассом rl.env.MATLABEnvironment
абстрактный класс, как показано в определении класса в начале файла шаблона. Этот абстрактный класс - тот же используемый другими объектами среды обучения с подкреплением MATLAB.
classdef MyEnvironment < rl.env.MATLABEnvironment
По умолчанию шаблонный класс реализует простую полюсную корзиной модель балансировки, похожую на полюсные корзиной предопределенные среды, описанные в Загрузке Предопределенные Среды Системы управления.
Чтобы задать вашу динамику среды изменяют шаблонный класс, задавая следующее:
Свойства среды
Необходимые методы среды
Дополнительные методы среды
В properties
раздел шаблона, задайте любые параметры, необходимые для создания и симуляции среды. Эти параметры могут включать:
Физические константы — демонстрационная среда задает ускорение из-за силы тяжести (Gravity
).
Геометрия среды — демонстрационная среда задает корзину и массы полюса (CartMass
и PoleMass
и поясной из полюса (HalfPoleLength
).)
Ограничения среды — демонстрационная среда задает угол полюса и пороги расстояния корзины (AngleThreshold
, и DisplacementThreshold
). Среда использует эти значения, чтобы обнаружить, когда эпизод тренировки закончен.
Переменные, требуемые для оценки среды — демонстрационная среда, задают вектор состояния (State
) и флаг для указания, когда эпизод закончен (IsDone
)
Константы для определения действий или пространств наблюдений — демонстрационная среда задают максимальную силу для пробела действия (MaxForce
).
Константы для вычисления сигнала вознаграждения — демонстрационная среда задают константы RewardForNotFalling
и PenaltyForFalling
.
properties % Specify and initialize environment's necessary properties % Acceleration due to gravity in m/s^2 Gravity = 9.8 % Mass of the cart CartMass = 1.0 % Mass of the pole PoleMass = 0.1 % Half the length of the pole HalfPoleLength = 0.5 % Max Force the input can apply MaxForce = 10 % Sample time Ts = 0.02 % Angle at which to fail the episode (radians) AngleThreshold = 12 * pi/180 % Distance at which to fail the episode DisplacementThreshold = 2.4 % Reward each time step the cart-pole is balanced RewardForNotFalling = 1 % Penalty when the cart-pole fails to balance PenaltyForFalling = -10 end properties % Initialize system state [x,dx,theta,dtheta]' State = zeros(4,1) end properties(Access = protected) % Initialize internal flag to indicate episode termination IsDone = false end
Среда обучения с подкреплением требует, чтобы следующие функции были заданы. getObservationInfo
, getActionInfo
\sim
, и validateEnvironment
функции уже заданы в основном абстрактном классе. Чтобы создать вашу среду, необходимо задать конструктора, reset
, и step
функции.
Функция | Описание |
---|---|
getObservationInfo | Возвращает информацию о наблюдениях среды |
getActionInfo | Возвращает информацию о действиях среды |
sim | Симулируйте среду с агентом |
validateEnvironment | Подтвердите среду путем вызова reset функция и симуляция среды для одного временного шага с помощью step |
reset | Инициализируйте среду, утверждают и очищают любую визуализацию |
step | Применяет действие, симулирует среду для одного шага и выводит наблюдения и вознаграждения. Кроме того, устанавливает флаг, указывающий, завершен ли эпизод |
Функция конструктора | Функция с тем же именем как класс, который создает экземпляр класса |
Демонстрационная полюсная корзиной функция конструктора создает среду:
Определение спецификаций действия и наблюдения. Для получения дополнительной информации о создании этих спецификаций, смотрите rlNumericSpec
и rlFiniteSetSpec
.
Вызов конструктора основного абстрактного класса.
function this = MyEnvironment() % Initialize Observation settings ObservationInfo = rlNumericSpec([4 1]); ObservationInfo.Name = 'CartPole States'; ObservationInfo.Description = 'x, dx, theta, dtheta'; % Initialize Action settings ActionInfo = rlFiniteSetSpec([-1 1]); ActionInfo.Name = 'CartPole Action'; % The following line implements built-in functions of RL env this = this@rl.env.MATLABEnvironment(ObservationInfo,ActionInfo); % Initialize property values and pre-compute necessary values updateActionInfo(this); end
Эта демонстрационная функция конструктора не включает входных параметров. Однако можно добавить входные параметры для пользовательского конструктора.
reset
ФункцияДемонстрационная полюсная корзиной функция сброса устанавливает начальное условие модели и возвращает начальные значения наблюдений. Это также генерирует уведомление, что среда была обновлена путем вызова envUpdatedCallback
функция, которая полезна для обновления визуализации среды.
% Reset environment to initial state and output initial observation function InitialObservation = reset(this) % Theta (+- .05 rad) T0 = 2 * 0.05 * rand - 0.05; % Thetadot Td0 = 0; % X X0 = 0; % Xdot Xd0 = 0; InitialObservation = [T0;Td0;X0;Xd0]; this.State = InitialObservation; % (optional) use notifyEnvUpdated to signal that the % environment has been updated (e.g. to update visualization) notifyEnvUpdated(this); end
step
ФункцияДемонстрационный полюсный корзиной step
функция:
Обрабатывает входное действие
Оценивает среду динамические уравнения для одного временного шага
Вычисляет и возвращает обновленные наблюдения
Вычисляет и возвращает сигнал вознаграждения
Проверки, если эпизод закончил и возвращает IsDone
предупредите как соответствующие
Генерирует уведомление, что среда была обновлена
function [Observation,Reward,IsDone,LoggedSignals] = step(this,Action) LoggedSignals = []; % Get action Force = getForce(this,Action); % Unpack state vector XDot = this.State(2); Theta = this.State(3); ThetaDot = this.State(4); % Cache to avoid recomputation CosTheta = cos(Theta); SinTheta = sin(Theta); SystemMass = this.CartMass + this.PoleMass; temp = (Force + this.PoleMass*this.HalfPoleLength*ThetaDot^2*SinTheta)... /SystemMass; % Apply motion equations ThetaDotDot = (this.Gravity*SinTheta - CosTheta*temp)... / (this.HalfPoleLength*(4.0/3.0 - this.PoleMass*CosTheta*CosTheta/SystemMass)); XDotDot = temp - this.PoleMass*this.HalfPoleLength*ThetaDotDot*CosTheta/SystemMass; % Euler integration Observation = this.State + this.Ts.*[XDot;XDotDot;ThetaDot;ThetaDotDot]; % Update system states this.State = Observation; % Check terminal condition X = Observation(1); Theta = Observation(3); IsDone = abs(X) > this.DisplacementThreshold || abs(Theta) > this.AngleThreshold; this.IsDone = IsDone; % Get reward Reward = getReward(this); % (optional) use notifyEnvUpdated to signal that the % environment has been updated (e.g. to update visualization) notifyEnvUpdated(this); end
Можно задать любые другие функции в шаблонном классе как требуется. Например, можно создать функции помощника, которые вызваны любым step
или reset
. Полюсная корзиной модель шаблона реализует getReward
функция для вычисления вознаграждения каждый временной шаг.
function Reward = getReward(this) if ~this.IsDone Reward = this.RewardForNotFalling; else Reward = this.PenaltyForFalling; end end
Можно добавить визуализацию в пользовательскую среду путем реализации plot
функция. В plot
функция:
Создайте фигуру или экземпляр visualizer класса вашей собственной реализации. В данном примере создайте фигуру и сохраните указатель как свойство среды.
Вызовите envUpdatedCallback
функция.
function plot(this) % Initiate the visualization this.h = figure; % Update the visualization envUpdatedCallback(this) end
В envUpdatedCallback
, постройте визуализацию фигуре или использование вашего пользовательского объекта visualizer. Например, проверяйте, был ли указатель фигуры установлен. Если это имеет, то постройте визуализацию.
function envUpdatedCallback(this) % Set the visualization figure as the current figure figure(this.h) clf % Extract the cart position and pole angle X = this.State(2); theta = this.State(3); % Plot the cart cartpoly = polyshape([-0.25 -0.25 0.25 0.25],[-0.125 0.125 0.125 -0.125]); cartpoly = translate(cartpoly,[X 0]); plot(cartpoly,'FaceColor',[0.8500 0.3250 0.0980]) hold on % Plot the pole L = this.HalfPoleLength*2; polepoly = polyshape([-0.1 -0.1 0.1 0.1],[0 L L 0]); polepoly = translate(polepoly,[X,0]); polepoly = rotate(polepoly,rad2deg(theta),[X,0]); plot(polepoly,'FaceColor',[0 0.4470 0.7410]) hold off xlim([-3 3]) ylim([-1 2]) end
Среда вызывает envUpdatedCallback
функция, и поэтому обновляет визуализацию, каждый раз, когда среда обновляется.
Если вы задали свой пользовательский класс среды, создайте экземпляр его в рабочем пространстве MATLAB. В командной строке введите:
env = MyEnvironment;
Если у вашего конструктора есть входные параметры, задайте их после имени класса. Например, MyEnvironment(arg1,arg2)
.
После создания вашей среды это - лучшая практика подтвердить динамику среды. Для этого используйте validateEnvironment
функция, которая распечатывает ошибку к командному окну, если существуют какие-либо проблемы с вашей реализацией среды.
validateEnvironment(env)
После проверки объекта среды можно использовать его, чтобы обучить агента обучения с подкреплением. Для получения дополнительной информации об учебных агентах смотрите, Обучают Агентов Обучения с подкреплением.