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