Можно создать более простую пользовательскую среду обучения укрепления с помощью пользовательских функций, как описано в Создают Среду 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)
После проверки объекта среды можно использовать его, чтобы обучить агент изучения укрепления. Для получения дополнительной информации об учебных агентах смотрите, что Укрепление Train Изучает Агенты.