OpenAI Gym - Как создать одно горячее пространство наблюдения? - PullRequest
0 голосов
/ 03 января 2019

Кроме документа openAI , мне не удалось найти более подробную документацию.

Мне нужно знать правильный способ создания:

  1. Пространство действий, которое имеет 1..n возможных действий.(в настоящее время используется пространство дискретных действий)

  2. Пространство наблюдения, которое имеет 2^n состояния - состояние для каждой возможной комбинации действий, которые были предприняты.Я хотел бы получить горячее представление вектора действия - 1 для action was already taken, 0 для action still hadn't been taken

Как мне это сделать с помощью OpenAI Gym?

Спасибо

1 Ответ

0 голосов
/ 08 февраля 2019

Ни один из gym.Spaces, предоставленных пакетом gym на момент написания, не может использоваться для зеркального отображения одного представления горячего кодирования.

К счастью для нас, мы можем определить наше собственное пространство, создав дочерний класс gym.Spaces.

Я сделал такой класс, который может быть тем, что вам нужно:

import gym
import numpy as np


class OneHotEncoding(gym.Space):
    """
    {0,...,1,...,0}

    Example usage:
    self.observation_space = OneHotEncoding(size=4)
    """
    def __init__(self, size=None):
        assert isinstance(size, int) and size > 0
        self.size = size
        gym.Space.__init__(self, (), np.int64)

    def sample(self):
        one_hot_vector = np.zeros(self.size)
        one_hot_vector[np.random.randint(self.size)] = 1
        return one_hot_vector

    def contains(self, x):
        if isinstance(x, (list, tuple, np.ndarray)):
            number_of_zeros = list(x).contains(0)
            number_of_ones = list(x).contains(1)
            return (number_of_zeros == (self.size - 1)) and (number_of_ones == 1)
        else:
            return False

    def __repr__(self):
        return "OneHotEncoding(%d)" % self.size

    def __eq__(self, other):
        return self.size == other.size

Вы можете использовать его таким образом:

-> space = OneHotEncoding(size=3)
-> space.sample()
array([0., 1., 0.])
-> space.sample()
array([1., 0., 0.])
-> space.sample()
array([0., 0., 1.])

Надеюсь, что смогу помочь

...