====== MDPMaze ======
===== Příklad použití =====
Vytvořme mapu jednoduchého bludiště:
>>> EMPTY = (255, 255, 255)
>>> WALL = (0, 0, 0)
>>> GOAL = (255, 0, 0)
>>> START = (0, 0, 255)
>>> MAP1 = ((EMPTY, START, EMPTY, EMPTY, EMPTY),
(EMPTY, WALL, WALL, WALL, EMPTY),
(EMPTY, EMPTY, EMPTY, WALL, GOAL))
Import balíku kuimaze a třídy ''State'':
>>> import kuimaze
>>> from kuimaze import State
Vytvoření prostředí, nejprve deterministického:
>>> env = kuimaze.MDPMaze(MAP1)
Pokud chceme vytvořit prostřední nedeterministické (a to v případě MDP obvykle chceme), musíme zadat přechodové pravděpodobnosti:
env2 = kuimaze.MDPMaze(MAP1, probs=(0.8, 0.1, 0.1, 0.0))
Seznam všech validních stavů v prostředí:
>>> env.get_all_states()
[(x=0, y=0),
(x=0, y=1),
(x=0, y=2),
(x=1, y=0),
(x=1, y=2),
(x=2, y=0),
(x=2, y=2),
(x=3, y=0),
(x=4, y=0),
(x=4, y=1),
(x=4, y=2)]
Zjištění, zda je stav terminální:
>>> env.is_terminal_state(State(0, 0)), env.is_terminal_state(State(4, 2))
(False, True)
Jaké odměny jsou spojeny s jednotlivými stavy? Odměny se vyplácejí při opuštění stavu.
>>> env.get_reward(State(1,0)), env.get_reward(State(4,2))
(-0.04, 1.0)
Jaké akce jsou ve stavu přípustné? V našem prostředí budou přípustné vždy všechny 4 akce, ale pokud narazíme do zdi, zůstaneme na místě.
>>> actions = tuple(env.get_actions(State(1,0)))
>>> actions
(, , , )
Do jakých stavů a s jakou pravděpodobností se mohu dostat, pokud v aktuálním stavu provedu danou akci?
>>> env.get_next_states_and_probs(State(1,0), actions[0])
[((x=1, y=0), 1), ((x=2, y=0), 0), ((x=0, y=0), 0)]
V nedeterministickém prostředí bude výsledek jiný:
>>> env2.get_next_states_and_probs(State(1,0), actions[0])
[((x=1, y=0), 0.8), ((x=2, y=0), 0.1), ((x=0, y=0), 0.1)]
===== Popis potřebných metod =====
V následující dokumentaci se vyskytuje proměnná ''state'':
* Pokud je ''state'' vstupem do funkce/metody, může to být buď dvojice (x,y) celých kladných čísel, nebo instance třídy ''kuimaze.State'', která je [[https://docs.python.org/3/library/collections.html#collections.namedtuple|pojmenovanou n-ticí]] a umožňuje k souřadnicím přistupovat jako ''state.x'' a ''state.y''.
* Pokud některá z funkcí vrací ''state'', bude to vždy instance třídy ''State'' (s níž ve svém kódu můžete nakládat stejně jako s dvojicí hodnot (x,y)).
Ke komunikaci s prostředím ''MDPMaze'' slouží následující metody:
''get_all_states()'': vrátí seznam všech dosažitelných stavů (instance třídy ''State''), tedy bez zdí.
''is_terminal_state(state)'': vrací ''True'', pokud je zadaný stav koncový. Může se jednat jak o "dobrý" koncový stav, tak i o "špatný" (nebezpečný) koncový stav (představte si propast, nebo minu).
''get_reward(state)'': Vrací reward pro daný stav. Reward je "vyplácen" až při opuštění stavu, nikoli při jeho dosažení.
''get_actions(state)'': Pro daný stav postupně generuje možné akce, které se typicky použijí v kombinaci s následující metodou. Akce je typu [[https://docs.python.org/3.4/library/enum.html|enum]], ale tím se nemusíte zabývat, viz příklad použití výše (nebo v ''mdp_sandbox.py''). Pokud chcete získat seznam možných akcí, použijte ''list(get_actions(state))''.
''get_next_states_and_probs(state, action)'' : pro daný stav a požadovanou akci navrátí seznam dvojic ''(, probability)'' ; např. ''[(State(x=1, y=0), 0.8), (State(x=2, y=0), 0.1), (State(x=0, y=0), 0.1)]''
''visualise(dictlist=None)'' : bez parametru visualizuje obvyklé bludiště. Jinak očekává seznam slovníků ''{'x': x_coord, 'y': y_coord, 'value: val'}'', kde val může být buď skalární hodnota, nebo seznam/n-tice o čtyřech prvcích. Zde můžete konkrétně využít k vizualizaci:
- rewards ci values přirazených jednotlivým stavům - viz ''env.visualise(get_visualisation_values(utils))''
- policy - viz ''env.visualise(get_visualisation_values(policy))''
Rovněž zůstávají k dispozici obvyklé metody ''render()'', ''reset()''
Základní příklad použítí je vidět v souboru ''mdp_sandbox.py''.