Документация Engee

ReinforcementLearningEnvironments.jl

Встроенные среды

Traits12345678910111213
ActionStyleMinimalActionSet
FullActionSet
ChanceStyleStochastic
Deterministic
ExplicitStochastic
DefaultStateStyleObservation
InformationSet
DynamicStyleSimultaneous
Sequential
InformationStylePerfectInformation
ImperfectInformation
NumAgentStyleMultiAgent
SingleAgent
RewardStyleTerminalReward
StepReward
StateStyleObservation
InformationSet
InternalState
UtilityStyleGeneralSum
ZeroSum
ConstantSum
IdenticalUtility

Примечание. Многие признаки взяты из набора данных OpenSpiel.

Сторонние среды

Имя среды Имя зависимого пакета Описание

AtariEnv

ArcadeLearningEnvironment.jl

GymEnv

PyCall.jl

OpenSpielEnv

OpenSpiel.jl

SnakeGameEnv

SnakeGames.jl

SingleAgent/Multi-Agent, FullActionSet/MinimalActionSet

#list-of-environments

GridWorlds.jl

Среды в этом пакете поддерживают интерфейсы, определенные в RLBase.

Kuhn poker tree
ActionTransformedEnv(env;action_space_mapping=identity, action_mapping=identity)

action_space_mapping применяется к action_space(env) и legal_action_space(env). action_mapping применяется к действию action перед его подачей в env.

В среде с инвертированием битов имеется n битов. При выполнении i-го из n действий инвертируется i-й бит состояния. В каждом эпизоде выборка производится равномерно как из начального, так и из конечного состояния.

Назначение этой среды описывается в статье Hindsight Experience Replay.

CartPoleEnv(;kwargs...)

Именованные аргументы

  • T = Float64

  • continuous = false

  • rng = Random.default_rng()

  • gravity = T(9.8)

  • masscart = T(1.0)

  • masspole = T(0.1)

  • halflength = T(0.5)

  • forcemag = T(10.0)

  • max_steps = 200

  • dt = 0.02

  • thetathreshold = 12.0 # degrees

  • xthreshold = 2.4`

DefaultStateStyleEnv{S}(env::E)

Сбрасывает результат DefaultStateStyle, не изменяя исходное поведение.

GraphShortestPathEnv([rng]; n=10, sparsity=0.1, max_steps=10)

Значится под номером A.3 в статье Decision Transformer:https://arxiv.org/abs/2106.01345[]Reinforcement Learning via Sequence Modeling.

Более развернуто разберем пример, приведенный во введении. Задача состоит в нахождении кратчайшего пути на фиксированном направленном графе. Ее можно сформулировать как задачу MDP с равной нулю наградой, когда агент находится в целевом узле, и наградой −1 в противном случае. Наблюдением является целочисленный индекс узла графа, в котором находится агент. Действием является целочисленный индекс узла графа, к которому нужно перейти на следующем шаге. Динамика переходов переводит агент в индекс узла действия, если в графе есть ребро; в противном случае агент остается в предыдущем узле. Возвраты к старту в этой задаче соответствуют отрицательным длинам путей, а их максимизация соответствует генерированию кратчайших путей.

KuhnPokerEnv()

Более подробное описание см. здесь.

Здесь демонстрируется написание типичной игры с ZERO_SUM и IMPERFECT_INFORMATION. В реализации имеется явный игрок CHANCE_PLAYER.

TODO: добавить общедоступное состояние для SPECTATOR. Справка: https://arxiv.org/abs/1906.11110

MaxTimeoutEnv(env::E, max_t::Int; current_t::Int = 1)

Предписывает функции is_terminated(env) вернуть значение true после max_t взаимодействий.

MontyHallEnv(;rng=Random.default_rng())

Цитата из Википедии:

Представьте, что вы стали участником игры, в которой вам нужно выбрать одну из трех дверей. За одной из дверей находится автомобиль, за двумя другими дверями — козы. Вы выбираете одну из дверей, например номер 1, после этого ведущий, который знает, что находится за дверями, открывает одну из оставшихся дверей, например номер 3, за которой находится коза. После этого он спрашивает вас: «Не желаете ли вы изменить свой выбор на дверь номер 2?» Увеличатся ли ваши шансы выиграть автомобиль, если вы измените свой выбор?

Здесь мы представим первую среду в стиле FULL_ACTION_SET.

MountainCarEnv(;kwargs...)

Именованные аргументы

  • T = Float64

  • continuous = false

  • rng = Random.default_rng()

  • min_pos = -1.2

  • max_pos = 0.6

  • max_speed = 0.07

  • goal_pos = 0.5

  • max_steps = 200

  • goal_velocity = 0.0

  • power = 0.001

  • gravity = 0.0025

MultiArmBanditsEnv(;true_reward=0., k = 10,rng=Random.default_rng())

true_reward — ожидаемая награда. k — количество рук. В статье о многоруком бандите приводится более подробное объяснение.

Эта игра разовая. Выполнение среды завершается сразу после совершения действия. На этом примере демонстрируется написание настраиваемой среды с минимальным набором интерфейсов.

PendulumEnv(;kwargs...)

Именованные аргументы

  • T = Float64

  • max_speed = T(8)

  • max_torque = T(2)

  • g = T(10)

  • m = T(1)

  • l = T(1)

  • dt = T(0.05)

  • max_steps = 200

  • continuous::Bool = true

  • n_actions::Int = 3

  • rng = Random.default_rng()

Неинтерактивная среда маятника.

Принимает только действия со значением nothing, из-за чего система моделируется один временной шаг. Устанавливает env.done в значение true по достижении maximum_time. Выполняет сброс в случайное положение и импульс. Всегда возвращает нулевые награды.

Полезно для отладки и разработки, особенно в обучении с подкреплением на основе модели.

PendulumNonInteractiveEnv(;kwargs...)

Именованные аргументы

  • float_type = Float64

  • gravity = 9.8

  • length = 2.0

  • mass = 1.0

  • step_size = 0.01

  • maximum_time = 10.0

  • rng = Random.default_rng()

PigEnv(;n_players=2)

Объяснение этой игры см. в Википедии.

На этом примере демонстрируется написание игры с более чем двумя игроками.

RandomWalk1D(;rewards=-1. => 1.0, N=7, start_pos=(N+1) ÷ 2, actions=[-1,1])

Агент устанавливается в положение start_pos и может перемещаться влево или вправо (шаг указывается в действиях). Игра завершается, когда агент достигает одного из концов и получает соответствующую награду.

Сравнение с MultiArmBanditsEnv:

  1. Пространство состояний более сложное (хотя и не намного).

  2. Это последовательная игра со множеством шагов действий.

  3. Эта игра детерминированная, а не стохастическая.

RewardOverriddenEnv(env, f)

Применяет функцию f к env для генерирования пользовательской награды.

RewardTransformedEnv(env, f)

Применяет функцию f к reward(env).

RockPaperScissorsEnv()

Камень, ножницы, бумага — это одновременная игра с нулевой суммой.

Кэширует состояние, так что state(env) всегда возвращает одинаковый результат до следующего взаимодействия с env. Полезность этой функции объясняется тем, что некоторые среды сохраняют состояние во время каждого state(env). Например: StateTransformedEnv(StackFrames(...)).

StateTransformedEnv(env; state_mapping=identity, state_space_mapping=identity)

state_mapping применяется к исходному состоянию при вызове state(env), и, аналогичным образом, state_space_mapping применяется при вызове state_space(env).

StockTradingEnv(;kw...)

Эта среда изначально была представлена в работе Deep Reinforcement Learning for Automated Stock Trading:https://github.com/AI4Finance-Foundation/FinRL-Trading[]An Ensemble Strategy.

Именованные аргументы

  • initial_account_balance=1_000_000.

TicTacToeEnv()

Создает экземпляр среды TicTacToe.

TigerProblemEnv(;rng=Random>GLOBAL_RNG)

На примере задачи о тигре здесь демонстрируется решение задачи POMDP.

TinyHanabiEnv()

Среда многорукого бандита является стохастической. Итоговая награда может каждый раз отличаться, даже если были предприняты одни и те же действия. Поэтому для таких сред следует реализовать Random.seed!(env), чтобы повысить воспроизводимость, не создавая новый экземпляр того же генератора rng.

В нашей конфигурации результат выполнения действия в env будет неопределенным. Это основное отличие от интерфейсов, определенных в OpenAI/Gym. На наш взгляд, асинхронный подход лучше подходит для описания множества сложных сред. Однако есть и одно неудобство: приходится кэшировать некоторые промежуточные данные для будущих запросов. В данном случае необходимо сохранять reward и is_terminated в экземпляре env для будущих запросов.

Сначала необходимо определить пространство действий. В среде MultiArmBanditsEnv возможные действия простираются от 1 до k (что соответствует length(env.true_values)).

Хотя здесь мы решили возвращать пространство действий Base.OneTo, это не жесткое требование. Может возвращаться и другой объект (Tuple, Distribution и т. д.), если он лучше подходит для описания задачи и правильной ее обработки в функции you_env(action). Некоторые алгоритмы могут требовать, чтобы пространство действий было типа Base.OneTo. Однако за проверку и преобразование отвечает разработчик алгоритма.

Обратите внимание: хотя в этой игре два игрока, текущим всегда является фиктивный одновременный игрок.

В первом раунде у гостя есть три варианта действий, а во втором допустимы только два варианта, причем отличные от выбранного ведущим действия.

Для сред со стилем FULL_ACTION_SET эта функция должна быть реализована.

!!! warn Если среда env еще не запущена, возвращаемое значение не имеет смысла. Исключение не выдается здесь потому, что это позволяет упростить логику кода и обеспечить согласованность типов при сохранении значения в буферах.

Так как MultiArmBanditsEnv — это разовая игра, состояние после каждого действия не имеет значения. Поэтому здесь ему можно присвоить константу 1.

Для сред с несколькими агентами, как правило, реализуется максимально подробно.

Основное отличие от других сред в том, что теперь мы имеем два вида состояний: наблюдение и внутреннее состояние. По умолчанию возвращается наблюдение.

Так как это разовая игра, пространство состояний не имеет особого смысла.

discrete2standard_discrete(env)

Преобразует среду env с дискретным пространством действий в стандартную форму:

  • Пространство действий имеет тип Base.OneTo.

  • Если среда env имеет стиль FULL_ACTION_SET, каждому действию в legal_action_space(env) также соответствует значение Int в пространстве действий.

Стандартная форма полезна для некоторых алгоритмов (таких как Q-обучение).