Jak stworzyć nowe środowisko siłowni w OpenAI?

83

Mam zadanie stworzyć agenta AI, który nauczy się grać w gry wideo przy użyciu ML. Chcę utworzyć nowe środowisko przy użyciu OpenAI Gym, ponieważ nie chcę korzystać z istniejącego środowiska. Jak mogę utworzyć nowe, niestandardowe środowisko?

Czy jest też inny sposób, w jaki mogę zacząć rozwijać, aby agent AI mógł grać w określoną grę wideo bez pomocy OpenAI Gym?

Rifat Bin Reza
źródło

Odpowiedzi:

124

Zobacz mój banana-gymdla wyjątkowo małego środowiska.

Twórz nowe środowiska

Zobacz stronę główną repozytorium:

https://github.com/openai/gym/blob/master/docs/creating-environments.md

Kroki są następujące:

  1. Utwórz nowe repozytorium ze strukturą pakietu PIP

To powinno wyglądać tak

gym-foo/
  README.md
  setup.py
  gym_foo/
    __init__.py
    envs/
      __init__.py
      foo_env.py
      foo_extrahard_env.py

Aby zapoznać się z treścią, kliknij powyższy link. Szczegóły, o których nie ma mowy, dotyczą zwłaszcza tego, jak foo_env.pypowinny wyglądać niektóre funkcje w programie . Spojrzenie na przykłady i na gym.openai.com/docs/ pomaga. Oto przykład:

class FooEnv(gym.Env):
    metadata = {'render.modes': ['human']}

    def __init__(self):
        pass

    def _step(self, action):
        """

        Parameters
        ----------
        action :

        Returns
        -------
        ob, reward, episode_over, info : tuple
            ob (object) :
                an environment-specific object representing your observation of
                the environment.
            reward (float) :
                amount of reward achieved by the previous action. The scale
                varies between environments, but the goal is always to increase
                your total reward.
            episode_over (bool) :
                whether it's time to reset the environment again. Most (but not
                all) tasks are divided up into well-defined episodes, and done
                being True indicates the episode has terminated. (For example,
                perhaps the pole tipped too far, or you lost your last life.)
            info (dict) :
                 diagnostic information useful for debugging. It can sometimes
                 be useful for learning (for example, it might contain the raw
                 probabilities behind the environment's last state change).
                 However, official evaluations of your agent are not allowed to
                 use this for learning.
        """
        self._take_action(action)
        self.status = self.env.step()
        reward = self._get_reward()
        ob = self.env.getState()
        episode_over = self.status != hfo_py.IN_GAME
        return ob, reward, episode_over, {}

    def _reset(self):
        pass

    def _render(self, mode='human', close=False):
        pass

    def _take_action(self, action):
        pass

    def _get_reward(self):
        """ Reward is given for XY. """
        if self.status == FOOBAR:
            return 1
        elif self.status == ABC:
            return self.somestate ** 2
        else:
            return 0

Użyj swojego środowiska

import gym
import gym_foo
env = gym.make('MyEnv-v0')

Przykłady

  1. https://github.com/openai/gym-soccer
  2. https://github.com/openai/gym-wikinav
  3. https://github.com/alibaba/gym-starcraft
  4. https://github.com/endgameinc/gym-malware
  5. https://github.com/hackthemarket/gym-trading
  6. https://github.com/tambetm/gym-minecraft
  7. https://github.com/ppaquette/gym-doom
  8. https://github.com/ppaquette/gym-super-mario
  9. https://github.com/tuzzer/gym-maze
Martin Thoma
źródło
1
Otrzymuję brzydki „ gym_fooimportowany, ale nieużywany”. Jak mogę się go pozbyć?
hipoglucido
@hipoglucido Aby pozbyć się pliku „gym_foo zaimportowanego, ale nieużywanego”, musisz powiedzieć swojemu edytorowi, aby zignorował ten import. Jest to powszechne w przypadkuimport gym_foo # noqa
Martin Thoma
7
Myślę, że należy głośno powiedzieć, że nie potrzebujesz nic z tego, tylko klasa pochodna, prawda? Naprawdę nie ma powodu, aby tworzyć pakiet, jeśli nie odstajesz od ekosystemu siłowni?
mathtick
z powodu błędu importu „gym_foo” po wykonaniu powyższych czynności, wykonanie pip install -e . polecenia pomogło @hipoglucido
praneeth
17

Jest to zdecydowanie możliwe. Mówią o tym na stronie Dokumentacja, blisko końca.

https://gym.openai.com/docs

Jeśli chodzi o to, jak to zrobić, powinieneś poszukać inspiracji w kodzie źródłowym istniejących środowisk. Jest dostępny na github:

https://github.com/openai/gym#installation

Większości ich środowisk nie zaimplementowali od zera, ale raczej stworzyli opakowanie wokół istniejących środowisk i nadali wszystkim interfejs, który jest wygodny do uczenia się przez wzmacnianie.

Jeśli chcesz stworzyć własny, prawdopodobnie powinieneś pójść w tym kierunku i spróbować dostosować coś, co już istnieje, do interfejsu siłowni. Chociaż jest duża szansa, że ​​jest to bardzo czasochłonne.

Istnieje inna opcja, która może być interesująca dla twojego celu. To wszechświat OpenAI

https://universe.openai.com/

Może integrować się ze stronami internetowymi, dzięki czemu możesz trenować swoje modele, na przykład w grach kongregate. Jednak Universe nie jest tak łatwe w użyciu jak Gym.

Jeśli jesteś początkującym, radzę zacząć od implementacji wanilii w standardowym środowisku. Po rozwiązaniu problemów z podstawami przejdź do zwiększania ...

Guilherme de Lazari
źródło
A jeśli chcesz stworzyć środowisko dla działań niecyfrowych, takich jak kółko i krzyżyk lub kostka Rubika, w którym możliwe stany są skończone i można je dobrze zdefiniować? Czy mam po prostu stworzyć listę ze wszystkimi możliwymi stanami? W jaki sposób symulacja może ustalić, jakie są prawidłowe statusy miejsc docelowych na podstawie danego statusu?
Hendrik