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

Можно создать более простые пользовательские среды обучения с подкреплением с помощью пользовательских функций, как описано в Создают Среду MATLAB с помощью Пользовательских Функций.

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

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

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

  • Создайте интерфейс к сторонним библиотекам, заданным на языках, таких как C++, Java® или Python®. Для получения дополнительной информации смотрите Внешние Интерфейсы Языка (MATLAB).

Для получения дополнительной информации о создании классов 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 environment's necessary properties    
    % 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 RL env
    this = this@rl.env.MATLABEnvironment(ObservationInfo,ActionInfo);

    % Initialize property values and pre-compute necessary values
    updateActionInfo(this);
end

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

Демонстрационный reset Функция

Демонстрационная полюсная корзиной функция сброса устанавливает начальное условие модели и возвращает начальные значения наблюдений. Это также генерирует уведомление, что среда была обновлена путем вызова envUpdatedCallback функция, которая полезна для обновления визуализации среды.

% Reset environment to initial state and output 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 = [T0;Td0;X0;Xd0];
    this.State = InitialObservation;

    % (optional) use notifyEnvUpdated to signal that the 
    % environment has been updated (e.g. to update 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 (e.g. to update 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 функция:

  • Создайте фигуру или экземпляр visualizer класса вашей собственной реализации. В данном примере создайте фигуру и сохраните указатель как свойство среды.

  • Вызовите envUpdatedCallback функция.

function plot(this)
    % Initiate the visualization
    this.h = figure;
          
    % Update the visualization
    envUpdatedCallback(this)
end

В envUpdatedCallback, постройте визуализацию фигуре или использование вашего пользовательского объекта visualizer. Например, проверяйте, был ли указатель фигуры установлен. Если это имеет, то постройте визуализацию.

function envUpdatedCallback(this)
    % Set the visualization figure as the current figure
    figure(this.h)
    clf

    % Extract the cart position and pole angle
    X = this.State(2);
    theta = this.State(3);

    % Plot the cart
    cartpoly = polyshape([-0.25 -0.25 0.25 0.25],[-0.125 0.125 0.125 -0.125]);
    cartpoly = translate(cartpoly,[X 0]);
    plot(cartpoly,'FaceColor',[0.8500 0.3250 0.0980])
    hold on

    % Plot the pole
    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]);
    plot(polepoly,'FaceColor',[0 0.4470 0.7410])

    hold off
    xlim([-3 3])
    ylim([-1 2])
end

Среда вызывает envUpdatedCallback функция, и поэтому обновляет визуализацию, каждый раз, когда среда обновляется.

Создайте пользовательскую среду

Если вы задали свой пользовательский класс среды, создайте экземпляр его в рабочем пространстве MATLAB. В командной строке введите:

env = MyEnvironment;

Если у вашего конструктора есть входные параметры, задайте их после имени класса. Например, MyEnvironment(arg1,arg2).

После создания вашей среды это - лучшая практика подтвердить динамику среды. Для этого используйте validateEnvironment функция, которая распечатывает ошибку к командному окну, если существуют какие-либо проблемы с вашей реализацией среды.

validateEnvironment(env)

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

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

|

Похожие темы