Можно задать пользовательскую среду обучения с подкреплением путем создания и изменения класса среды шаблона. Можно использовать пользовательскую среду шаблона для:
Реализации более сложной динамики среды.
Добавьте пользовательскую визуализацию в свою среду.
Создайте интерфейс к сторонним библиотекам, заданным на языках, таких как C++, Java® или Python®. Для получения дополнительной информации смотрите Внешние Интерфейсы Языка.
Для получения дополнительной информации о создании классов 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 the necessary properties of the environment % 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 the RL environment this = this@rl.env.MATLABEnvironment(ObservationInfo,ActionInfo); % Initialize property values and precompute necessary values updateActionInfo(this); end
Эта демонстрационная функция конструктора не включает входных параметров. Однако можно добавить входные параметры для пользовательского конструктора.
reset
ФункцияДемонстрационная функция сброса тележки с шестом устанавливает начальное условие модели и возвращает начальные значения наблюдений. Это также генерирует уведомление, что среда была обновлена путем вызова envUpdatedCallback
функция, которая полезна для обновления визуализации среды.
% Reset environment to initial state and return 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 = [X0;Xd0;T0;Td0]; this.State = InitialObservation; % (Optional) Use notifyEnvUpdated to signal that the % environment is updated (for example, to update the 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 (for example, to update the 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
функция:
Создайте фигуру или экземпляр класса визуализатора вашей собственной реализации. В данном примере вы создаете фигуру и храните указатель на фигуру в объекте среды.
Вызовите envUpdatedCallback
функция.
function plot(this) % Initiate the visualization this.Figure = figure('Visible','on','HandleVisibility','off'); ha = gca(this.Figure); ha.XLimMode = 'manual'; ha.YLimMode = 'manual'; ha.XLim = [-3 3]; ha.YLim = [-1 2]; hold(ha,'on'); % Update the visualization envUpdatedCallback(this) end
В данном примере сохраните указатель на фигуру как защищенное свойство объекта среды.
properties(Access = protected) % Initialize internal flag to indicate episode termination IsDone = false % Handle to figure Figure end
В envUpdatedCallback
, постройте визуализацию фигуре или используйте ваш пользовательский объект visualizer. Например, проверяйте, был ли указатель фигуры установлен. Если это имеет, то постройте визуализацию.
function envUpdatedCallback(this) if ~isempty(this.Figure) && isvalid(this.Figure) % Set visualization figure as the current figure ha = gca(this.Figure); % Extract the cart position and pole angle x = this.State(1); theta = this.State(3); cartplot = findobj(ha,'Tag','cartplot'); poleplot = findobj(ha,'Tag','poleplot'); if isempty(cartplot) || ~isvalid(cartplot) ... || isempty(poleplot) || ~isvalid(poleplot) % Initialize the cart plot cartpoly = polyshape([-0.25 -0.25 0.25 0.25],[-0.125 0.125 0.125 -0.125]); cartpoly = translate(cartpoly,[x 0]); cartplot = plot(ha,cartpoly,'FaceColor',[0.8500 0.3250 0.0980]); cartplot.Tag = 'cartplot'; % Initialize the pole plot 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]); poleplot = plot(ha,polepoly,'FaceColor',[0 0.4470 0.7410]); poleplot.Tag = 'poleplot'; else cartpoly = cartplot.Shape; polepoly = poleplot.Shape; end % Compute the new cart and pole position [cartposx,~] = centroid(cartpoly); [poleposx,poleposy] = centroid(polepoly); dx = x - cartposx; dtheta = theta - atan2(cartposx-poleposx,poleposy-0.25/2); cartpoly = translate(cartpoly,[dx,0]); polepoly = translate(polepoly,[dx,0]); polepoly = rotate(polepoly,rad2deg(dtheta),[x,0.25/2]); % Update the cart and pole positions on the plot cartplot.Shape = cartpoly; poleplot.Shape = polepoly; % Refresh rendering in the figure window drawnow(); end end
Среда вызывает envUpdatedCallback
функция, и поэтому обновляет визуализацию, каждый раз, когда среда обновляется.
После того, как вы задаете свой пользовательский класс среды, создаете экземпляр его в рабочем пространстве MATLAB. В командной строке введите следующее.
env = MyEnvironment;
Если у вашего конструктора есть входные параметры, задайте их после имени класса. Например, MyEnvironment(arg1,arg2)
.
После того, как вы создадите свою среду, лучшая практика состоит в том, чтобы подтвердить динамику окружения. Для этого используйте validateEnvironment
функция, которая распечатывает ошибку к командному окну, если ваша реализация среды имеет какие-либо проблемы.
validateEnvironment(env)
После проверки объекта среды можно использовать его, чтобы обучить агента обучения с подкреплением. Для получения дополнительной информации об учебных агентах смотрите, Обучают Агентов Обучения с подкреплением.