MDPProblem

Prostředí kuimaze2.MDPProblem budete využívat v úlohách, kde jde o nalezení optimální strategie pro Markovský rozhodovací problém (MDP). Je použito ve třetí povinné úloze 08-MDPs.

Veřejné rozhraní

Po vytvoření instance třídy MDPProblem (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.is_terminal(state) vrací True, pokud je zadaný stav koncový (agent z něj už nemůže odejít). Může se jednat jak o “dobrý” koncový stav, tak i o “špatný” (nebezpečný) koncový stav (představte si propast, nebo minu).
  • env.get_reward(state) vrací odměnu pro daný stav. Odměna je “vyplácena” až při opuštění stavu, nikoli při jeho dosažení.
  • env.get_actions(state) vrací všechny akce, které jsou možné v zadaném stavu. Tyto akce se typicky použijí v kombinaci s následující metodou.
  • env.get_next_states_and_probs(state, action) pro daný stav a požadovanou akci navrátí seznam možných následných stavů a jejich pravděpodobností, tj. seznam dvojic (<State>, probability).
  • 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. Vysvětlení jednotlivých parametrů této metody najdete v helpu (help(env.render)). Viz také použití env.render() v pomocné metodě MDPAgent.render() v ukázkovém modulu example_mdp.py.

Použití

Prostředí se typicky používá následujícím způsobem:

Import prostředí:

>>> from kuimaze2 import Map, MDPProblem

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

>>> MAP = """
S.D
..G
"""
>>> map = Map.from_string(MAP)

Vytvoření prostředí, nejprve deterministického:

>>> env1 = MDPProblem(map)

Pokud chcete zapnout grafické zobrazení prostředí:

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

Pokud chceme vytvořit prostřední nedeterministické (a to v případě MDP obvykle chceme), musíme určit, s jakými pravděpodobnostmi prostředí vykoná agentovu akci a s jakými “někam uhne”.

>>> env2 = MDPProblem(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), State(r=0, c=2), State(r=1, c=0), State(r=1, c=1), State(r=1, c=2)]

Zjištění, zda je stav terminální:

>>> env2.is_terminal(State(0, 0))
False
>>> env2.is_terminal(State(0, 2))
True

Jaké odměny jsou spojeny s jednotlivými stavy? Odměny se vyplácejí při opuštění stavu.

>>> env2.get_reward(State(0,0))
-0.04
>>> env2.get_reward(State(0,2))
-1.0
>>> env2.get_reward(State(1,2))
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 = env2.get_actions(State(0, 0))
>>> actions
[<Action.UP: 0>, <Action.RIGHT: 1>, <Action.DOWN: 2>, <Action.LEFT: 3>]

Do jakých stavů a s jakou pravděpodobností se mohu dostat, pokud v nějakém stavu provedu jistou akci? V deterministickém prostředí:

>>> env1.get_next_states_and_probs(State(0, 0), actions[0])
[(State(r=0, c=0), 1.0)]
V nedeterministickém prostředí bude výsledek jiný:
>>> env2.get_next_states_and_probs(State(0, 0), actions[0])
[(State(r=0, c=0), 0.8), (State(r=0, c=1), 0.1), (State(r=1, c=0), 0.0), (State(r=0, c=0), 0.1)]
Všiměte si, že některé následné stavy se v seznamu mohou vyskytnout víckrát, protože se do nich lze dostat různými akcemi.

courses/b3b33kui/semestralni_ulohy/kuimaze/20_mdpproblem.txt · Last modified: 2024/03/27 08:04 by xposik