ReinforcementLearningEnvironments.jl
Встроенные среды
Traits | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ActionStyle | MinimalActionSet | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ||
FullActionSet | ✔ | ✔ | ||||||||||||
ChanceStyle | Stochastic | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ||||||
Deterministic | ✔ | ✔ | ✔ | |||||||||||
ExplicitStochastic | ✔ | ✔ | ✔ | |||||||||||
DefaultStateStyle | Observation | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ||
InformationSet | ✔ | ✔ | ||||||||||||
DynamicStyle | Simultaneous | ✔ | ||||||||||||
Sequential | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ||
InformationStyle | PerfectInformation | ✔ | ✔ | ✔ | ||||||||||
ImperfectInformation | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ||||
NumAgentStyle | MultiAgent | ✔ | ✔ | ✔ | ✔ | ✔ | ||||||||
SingleAgent | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ||||||
RewardStyle | TerminalReward | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
StepReward | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||||
StateStyle | Observation | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ||
InformationSet | ✔ | ✔ | ||||||||||||
InternalState | ✔ | |||||||||||||
UtilityStyle | GeneralSum | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
ZeroSum | ✔ | ✔ | ✔ | |||||||||||
ConstantSum | ✔ | |||||||||||||
IdenticalUtility | ✔ |
Примечание. Многие признаки взяты из набора данных OpenSpiel.
Сторонние среды
Имя среды | Имя зависимого пакета | Описание |
---|---|---|
|
||
|
||
|
||
|
|
|
Среды в этом пакете поддерживают интерфейсы, определенные в |
#
ReinforcementLearningEnvironments.KUHN_POKER_REWARD_TABLE
— Constant
#
ReinforcementLearningEnvironments.ActionTransformedEnv
— Method
ActionTransformedEnv(env;action_space_mapping=identity, action_mapping=identity)
action_space_mapping
применяется к action_space(env)
и legal_action_space(env)
. action_mapping
применяется к действию action
перед его подачей в env
.
#
ReinforcementLearningEnvironments.BitFlippingEnv
— Type
В среде с инвертированием битов имеется n битов. При выполнении i-го из n действий инвертируется i-й бит состояния. В каждом эпизоде выборка производится равномерно как из начального, так и из конечного состояния.
Назначение этой среды описывается в статье Hindsight Experience Replay.
#
ReinforcementLearningEnvironments.CartPoleEnv
— Method
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`
#
ReinforcementLearningEnvironments.DefaultStateStyleEnv
— Method
DefaultStateStyleEnv{S}(env::E)
Сбрасывает результат DefaultStateStyle
, не изменяя исходное поведение.
#
ReinforcementLearningEnvironments.GraphShortestPathEnv
— Type
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 в противном случае. Наблюдением является целочисленный индекс узла графа, в котором находится агент. Действием является целочисленный индекс узла графа, к которому нужно перейти на следующем шаге. Динамика переходов переводит агент в индекс узла действия, если в графе есть ребро; в противном случае агент остается в предыдущем узле. Возвраты к старту в этой задаче соответствуют отрицательным длинам путей, а их максимизация соответствует генерированию кратчайших путей.
#
ReinforcementLearningEnvironments.KuhnPokerEnv
— Method
KuhnPokerEnv()
Более подробное описание см. здесь.
Здесь демонстрируется написание типичной игры с ZERO_SUM
и IMPERFECT_INFORMATION
. В реализации имеется явный игрок CHANCE_PLAYER
.
TODO: добавить общедоступное состояние для SPECTATOR
. Справка: https://arxiv.org/abs/1906.11110
#
ReinforcementLearningEnvironments.MaxTimeoutEnv
— Method
MaxTimeoutEnv(env::E, max_t::Int; current_t::Int = 1)
Предписывает функции is_terminated(env)
вернуть значение true
после max_t
взаимодействий.
#
ReinforcementLearningEnvironments.MontyHallEnv
— Method
MontyHallEnv(;rng=Random.default_rng())
Цитата из Википедии:
Представьте, что вы стали участником игры, в которой вам нужно выбрать одну из трех дверей. За одной из дверей находится автомобиль, за двумя другими дверями — козы. Вы выбираете одну из дверей, например номер 1, после этого ведущий, который знает, что находится за дверями, открывает одну из оставшихся дверей, например номер 3, за которой находится коза. После этого он спрашивает вас: «Не желаете ли вы изменить свой выбор на дверь номер 2?» Увеличатся ли ваши шансы выиграть автомобиль, если вы измените свой выбор?
Здесь мы представим первую среду в стиле FULL_ACTION_SET
.
#
ReinforcementLearningEnvironments.MountainCarEnv
— Method
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
#
ReinforcementLearningEnvironments.MultiArmBanditsEnv
— Method
MultiArmBanditsEnv(;true_reward=0., k = 10,rng=Random.default_rng())
true_reward
— ожидаемая награда. k
— количество рук. В статье о многоруком бандите приводится более подробное объяснение.
Эта игра разовая. Выполнение среды завершается сразу после совершения действия. На этом примере демонстрируется написание настраиваемой среды с минимальным набором интерфейсов.
#
ReinforcementLearningEnvironments.PendulumEnv
— Method
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()
#
ReinforcementLearningEnvironments.PendulumNonInteractiveEnv
— Type
Неинтерактивная среда маятника.
Принимает только действия со значением nothing
, из-за чего система моделируется один временной шаг. Устанавливает env.done
в значение true
по достижении maximum_time
. Выполняет сброс в случайное положение и импульс. Всегда возвращает нулевые награды.
Полезно для отладки и разработки, особенно в обучении с подкреплением на основе модели.
#
ReinforcementLearningEnvironments.PendulumNonInteractiveEnv
— Method
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()
#
ReinforcementLearningEnvironments.RandomWalk1D
— Type
RandomWalk1D(;rewards=-1. => 1.0, N=7, start_pos=(N+1) ÷ 2, actions=[-1,1])
Агент устанавливается в положение start_pos
и может перемещаться влево или вправо (шаг указывается в действиях). Игра завершается, когда агент достигает одного из концов и получает соответствующую награду.
Сравнение с MultiArmBanditsEnv
:
-
Пространство состояний более сложное (хотя и не намного).
-
Это последовательная игра со множеством шагов действий.
-
Эта игра детерминированная, а не стохастическая.
#
ReinforcementLearningEnvironments.RewardOverriddenEnv
— Type
RewardOverriddenEnv(env, f)
Применяет функцию f
к env
для генерирования пользовательской награды.
#
ReinforcementLearningEnvironments.RewardTransformedEnv
— Type
RewardTransformedEnv(env, f)
Применяет функцию f
к reward(env)
.
#
ReinforcementLearningEnvironments.RockPaperScissorsEnv
— Type
RockPaperScissorsEnv()
Камень, ножницы, бумага — это одновременная игра с нулевой суммой.
#
ReinforcementLearningEnvironments.StateCachedEnv
— Type
Кэширует состояние, так что state(env)
всегда возвращает одинаковый результат до следующего взаимодействия с env
. Полезность этой функции объясняется тем, что некоторые среды сохраняют состояние во время каждого state(env)
. Например: StateTransformedEnv(StackFrames(...))
.
#
ReinforcementLearningEnvironments.StateTransformedEnv
— Method
StateTransformedEnv(env; state_mapping=identity, state_space_mapping=identity)
state_mapping
применяется к исходному состоянию при вызове state(env)
, и, аналогичным образом, state_space_mapping
применяется при вызове state_space(env)
.
#
ReinforcementLearningEnvironments.StockTradingEnv
— Method
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
.
#
ReinforcementLearningEnvironments.TicTacToeEnv
— Method
TicTacToeEnv()
Создает экземпляр среды TicTacToe.
#
ReinforcementLearningEnvironments.TigerProblemEnv
— Type
TigerProblemEnv(;rng=Random>GLOBAL_RNG)
На примере задачи о тигре здесь демонстрируется решение задачи POMDP.
#
ReinforcementLearningEnvironments.TinyHanabiEnv
— Method
TinyHanabiEnv()
#
Random.seed!
— Method
Среда многорукого бандита является стохастической. Итоговая награда может каждый раз отличаться, даже если были предприняты одни и те же действия. Поэтому для таких сред следует реализовать Random.seed!(env)
, чтобы повысить воспроизводимость, не создавая новый экземпляр того же генератора rng
.
#
ReinforcementLearningBase.act!
— Method
В нашей конфигурации результат выполнения действия в env
будет неопределенным. Это основное отличие от интерфейсов, определенных в OpenAI/Gym. На наш взгляд, асинхронный подход лучше подходит для описания множества сложных сред. Однако есть и одно неудобство: приходится кэшировать некоторые промежуточные данные для будущих запросов. В данном случае необходимо сохранять reward
и is_terminated
в экземпляре env
для будущих запросов.
#
ReinforcementLearningBase.action_space
— Method
Сначала необходимо определить пространство действий. В среде MultiArmBanditsEnv
возможные действия простираются от 1
до k
(что соответствует length(env.true_values)
).
Хотя здесь мы решили возвращать пространство действий |
#
ReinforcementLearningBase.current_player
— Method
Обратите внимание: хотя в этой игре два игрока, текущим всегда является фиктивный одновременный игрок.
#
ReinforcementLearningBase.legal_action_space
— Method
В первом раунде у гостя есть три варианта действий, а во втором допустимы только два варианта, причем отличные от выбранного ведущим действия.
#
ReinforcementLearningBase.legal_action_space_mask
— Method
Для сред со стилем FULL_ACTION_SET
эта функция должна быть реализована.
#
ReinforcementLearningBase.reward
— Method
!!! warn
Если среда env
еще не запущена, возвращаемое значение не имеет смысла. Исключение не выдается здесь потому, что это позволяет упростить логику кода и обеспечить согласованность типов при сохранении значения в буферах.
#
ReinforcementLearningBase.state
— Method
Так как MultiArmBanditsEnv
— это разовая игра, состояние после каждого действия не имеет значения. Поэтому здесь ему можно присвоить константу 1
.
#
ReinforcementLearningBase.state
— Method
Для сред с несколькими агентами, как правило, реализуется максимально подробно.
#
ReinforcementLearningBase.state
— Method
Основное отличие от других сред в том, что теперь мы имеем два вида состояний: наблюдение и внутреннее состояние. По умолчанию возвращается наблюдение.
#
ReinforcementLearningBase.state_space
— Method
Так как это разовая игра, пространство состояний не имеет особого смысла.
#
ReinforcementLearningEnvironments.discrete2standard_discrete
— Method
discrete2standard_discrete(env)
Преобразует среду env
с дискретным пространством действий в стандартную форму:
-
Пространство действий имеет тип
Base.OneTo
. -
Если среда
env
имеет стильFULL_ACTION_SET
, каждому действию вlegal_action_space(env)
также соответствует значениеInt
в пространстве действий.
Стандартная форма полезна для некоторых алгоритмов (таких как Q-обучение).