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