====== 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 [[.:20_MDPProblem#pouziti|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 ''(, 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 [, , , ] 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.