Stáhněte si kuimaze balík kuimaze.zip. Úkolem je naimplementovat funkce find_policy_via_value_iteration(…) a find_policy_via_policy_iteration(…) s těmito vstupy a výstupy:
Vstupy: find_policy_via_value_iteration(problem, discount_factor, epsilon)
a find_policy_via_policy_iteration(problem, discount_factor)
, kde:
problem
je prostředí - objekt typu kuimaze.MDPMaze
discount_factor
je z rozmezi (0,1)
epsilon
je maximalní povolená chyba pro Value jednotlivých stavů (pouze pro value iteration)
Výstupy:
Očekávaný výstup je slovník, kde klíčem je dvojice (x,y) tuple a hodnotou je optimální akce (stačí uvažovat dosažitelné stavy a pro terminální stavy nechť je výstup None
).
Metody implementujte v souboru mdp_agent.py
; který odevzdejte do Upload systému. V balíku kuimaze.zip je i soubor mdp_sandbox.py
, který ukazuje základní práci s MDPMaze, můžete ho použít jako start k další implementaci (viz též popis Základních metod níže).
Timeout: na jednotlivé běhy value/policy iteration pro danou instanci problému máte časový limit 30s.
Termín odevzdání úlohy lze vidět v Upload systému.
Hodnocení je rozděleno následovně:
Hodnocený výkon | min | max | poznámka |
---|---|---|---|
Kvalita algoritmu value iteration | 0 | 2.5 | Ohodnocení algoritmu automatickým evaluačním systémem. |
Kvalita algoritmu policy iteration | 0 | 2.5 | Ohodnocení algoritmu automatickým evaluačním systémem. |
Kvalita kódu | 0 | 1 | Komentáře, struktura, elegance, čistota kódu, vhodné pojmenování proměnných… |
Automatické hodnocení:
Kvalita kódu (1 bod):
Můžete následovat pro Python určený PEP8. Většina editorů (jistě PyCharm) na nedostatky s ohledem na PEP8 i sám upozorňuje. Můžete se také inspirovat např. zde nebo si přečíst o idiomatickém pythonu na mediu či u pythonu.
Ke komunikaci s prostředím MDPMaze slouží následující metody:
get_all_states()
: vrátí seznam všech dosažitelných stavů, tedy bez zdí. V tomto případě jsou to weighted stavy i s rewards, tedy (state.x, state.y, state.reward)
is_terminal_state(state)
: True pokud ze stavu nevede cesta zpět - cílový dobrý, nebo naopak cílový špatný/nebezpečný - představte si propast, nebo minu.
get_actions(state)
: Pro daný stav navrátí seznam možných akcí, které se typicky použijí v následující metodě. Akce je typu enum, ale tím se nemusíte zabývat, viz příklad použití v mdp_sandbox.py
get_state_reward(state)
: Obvykle není potřeba, vstupem je pojmenovaná dvojice (state.x, state.y).
get_next_states_and_probs(state, action)
: pro daný stav a požadovanou akci navrátí seznam dvojic ( (state.x, state.y), probability )
; např. [ ( (2,3), 0.3), ( (3,3), 0.7)]
state
je pojmenovaná n-tice buď (state.x, state.y, state.reward) nebo (state.x, state.y).
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:
env.visualise(get_visualisation_values(utils))
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