Table of Contents

RLProblem

Prostředí kuimaze2.RLProblem využijete při učení co nejlepší strategie pro neznámý MDP metodami posilovaného učení (reinforcement learning). Je použito ve čtvrté povinné úloze 11-RL.

Veřejné rozhraní

Po vytvoření instance třídy RLProblem (viz Použití) můžete využívat následující metody:

Použití

Prostředí se vytváří prakticky stejně jako MDPProblem, ale použití je jiné.

Import prostředí:

>>> from kuimaze2 import Map, RLProblem

Vytvoření mapy, jíž budeme prostředí inicializovat:

>>> MAP = "SG"
>>> map = Map.from_string(MAP)

Vytvoření deterministického prostředí s grafickým zobrazením:

>>> env1 = RLProblem(map, graphics=True)

Vytvoření nedeterministického prostředí (určení pravděpodobností, kam se agent ve skutečnosti pohne):

>>> env2 = RLProblem(map, action_probs=dict(forward=0.8, left=0.1, right=0.1, backward=0.0))

Seznam všech validních stavů v prostředí:

>>> env2.get_states()
[State(r=0, c=0), State(r=0, c=1)]

Seznam všech akcí, které lze v nějakém stavu prostředí vykonat:

>>> env2.get_action_space()
[<Action.UP: 0>, <Action.RIGHT: 1>, <Action.DOWN: 2>, <Action.LEFT: 3>]

Může se hodit i náhodně vybraná akce:

>>> env2.sample_action()  # Výsledkem může být kterákoli z možných akcí.
<Action.UP: 0>

Metoda step se pokusí v prostředí vykonat zvolenou akci:

>>> env2.step(env2.sample_action())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "...\kuimaze2\rl.py", line 60, in step
    raise NeedsResetError(
kuimaze2.exceptions.NeedsResetError: RLProblem: Episode terminated. You must call reset() first.
Jak je vidět, před prvním použitím metody step() je třeba prostředí resetovat.

Volání metody reset() vrátí počáteční stav agenta pro danou epizodu:

>>> state = env2.reset()
>>> state
State(r=0, c=0)

Nyní můžeme zavolat metodu step():

>>> action = env2.sample_action()
>>> action
<Action.DOWN: 2>
>>> new_state, reward, episode_finished = env2.step(action)
>>> new_state
State(r=0, c=0)
>>> reward
-0.04
>>> episode_finished
False
Pokusili jsme se vykonat akci Action.DOWN, ale patrně jsme narazili do zdi, protože nový stav new_state je shodný s původním. Za vykonání akce jsme dostali okamžitou odměnu -0.04 a vidíme, že epizoda neskončila, můžeme pokračovat.

Zkusme tedy dělat náhodné kroky, dokud epizoda neskončí:

>>> while not episode_finished:
...     action = env2.sample_action()
...     new_state, reward, episode_finished = env2.step(action)
...     print(f"{state=} {action=} {reward=} {new_state=} {episode_finished=}")
...     state = new_state
...
state=State(r=0, c=0) action=<Action.DOWN: 2> reward=-0.04 new_state=State(r=0, c=0) episode_finished=False
state=State(r=0, c=0) action=<Action.RIGHT: 1> reward=-0.04 new_state=State(r=0, c=1) episode_finished=False
state=State(r=0, c=1) action=<Action.UP: 0> reward=1.0 new_state=None episode_finished=True

Další volání metody step() by opět vyvolalo výjimku. Epizoda skončila, chceme začít novou, musíme tedy opět zavolat reset().