Создайте пользовательскую среду 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)

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

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

|

Похожие темы