Создайте пользовательскую среду MATLAB из шаблона

Можно задать пользовательскую среду обучения с подкреплением путем создания и изменения класса среды шаблона. Можно использовать пользовательскую среду шаблона для:

  • Реализации более сложной динамики среды.

  • Добавьте пользовательскую визуализацию в свою среду.

  • Создайте интерфейс к сторонним библиотекам, заданным на языках, таких как 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)

После проверки объекта среды можно использовать его, чтобы обучить агента обучения с подкреплением. Для получения дополнительной информации об учебных агентах смотрите, Обучают Агентов Обучения с подкреплением.

Смотрите также

|

Похожие темы