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

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

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

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте