exponenta event banner

Создание пользовательской среды 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Примените действие, смоделируйте среду для одного шага и выведите наблюдения и вознаграждения; также установите флаг, указывающий, завершен ли эпизод
Функция конструктораФункция с тем же именем, что и класс, создающий экземпляр класса

Функция конструктора образцов

Функция конструктора типа 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)

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

См. также

|

Связанные темы