Warning
This page is located in archive.

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:

  • env.get_states() vrací seznam všech volných stavů (instance třídy State), tedy bez zdí.
  • env.get_action_space() vrací seznam všech akcí, které mají smysl v daném prostředí. Výsledek není závislý na aktuálním stavu (což je rozdíl proti metodě MDPProblem.get_actions(state)).
  • env.sample_action(action_probs) náhodně vybere jednu z možných akcí. Parametr action_probs obsahuje pravděpodobnosti pro jednotlivé akce (je to slovník, kde klíčem je akce a hodnotou její pravděpodobnost). Není-li rozdělení uvedeno, vybere se rovnoměrně ze všech akcí.
  • env.reset() uvádí prostředí do výchozího stavu. Metodu je třeba zavolat před každou novou epizodou (i před tou první). Metoda vrací úvodní stav (State), v němž se agent nachází.
  • env.step(action) vykoná v prostředí zvolenou akci. Vrací trojici:
    • new_state je nový stav (State), do něhož se agent po vykonání akce dostal. Je-li prostředí stochastické, může být nový stav odlišný od toho, který by odpovídal vybrané akci.
    • reward je okamžitá odměna (float) za přechod state-action-new_state.
    • episode_finished je True, pokud daná epizoda již skončila. Další případné volání metody step() v takovém případě vyvolá vyhození výjimky. Prostředí je třeba před novou epizodou znovu resetovat metodou reset().
  • env.render() aktualizuje grafické zobrazení prostředí. (Pokud jste grafické zobrazení při vytváření prostředí nezapnuli, nedělá nic.) Umožňuje “obarvit” jednotlivé stavy a q-stavy, umožňuje v nich zobrazit texty, umožňuje zobrazit strategii, aktuální stav a vybranou akci, či cestu, kterou agent v prostředí prošel. Vysvětlení jednotlivých parametrů této metody najdete v helpu (help(env.render)). Viz také použití env.render() v pomocné metodě RLAgent.render() v ukázkovém modulu example_rl.py.

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().

courses/b3b33kui/semestralni_ulohy/kuimaze/30_rlproblem.txt · Last modified: 2024/04/16 14:11 by xposik