====== 4. Posilované učení ======
Vaším úkolem je najít co nejlepší strategii v prostředí, o němž nemáte žádné informace (posilované učení). Můžete jen vykonávat dostupné akce a pozorovat jejich účinky.
* Úloha bude opět probíhat v prostředí KUIMaze: {{section>courses:b3b33kui:kuimaze:00_instalace#download&noheader&firstsectiononly}}
* [[.:hodnoceni|Hodnocení úlohy]].
* Termín odevzdání úlohy je uveden v [[https://cw.felk.cvut.cz/brute|BRUTE]].
===== Specifikace =====
V modulu ''rl_agent.py'' implementujte funkci ''learn_policy(env)''. Hledáme strategii, která nás dovede do cíle s co nejvyšším očekávaným součtem zlevněných odměn. Během přednášek jste slyšeli o několika metodách pro řešení tohoto problému (Q-learning, Sarsa, ...).
**Výstupem** funkce má být **strategie (policy)**. Její reprezentace je shodná s předchozí úlohou (MDP), tj. slovník, který **každému stavu přiřadí akci**. Akce jsou označeny hodnotami [0,1,2,3], což odpovídá akcím up, right, down, left (N,E,S,W).
**Vstupem** funkce (''env'') je instance třídy ''HardMaze''. Inicializace prostředí a vizualizační metody jsou stejné, jako u ''MDPMaze'', ale práce s prostředím je odlišná. Připomeňme z přednášky, že akce je nutná, abychom se o prostředí vůbec něco dozvěděli. Nemáme mapu a prostředí můžeme prozkoumávat pomocí hlavní metody ''env.step(action)''. Prostředí-simulátor ví, jaký je aktuální stav.
{{ :courses:b3b33kui:cviceni:sekvencni_rozhodovani:agent-environment-reward.png?400 |}}
Další požadavky:
* Limit na učení na jednom postředí je 20 sekund.
* Nezapomeňte před odevzdáním vypnout vizualizace, viz VERBOSITY v ''rl_sandbox.py''.
===== Pokyny pro vypracování =====
==== Jak bude váš kód volán hodnotícím skriptem? ====
Váš kód bude hodnoticím skriptem volán cca takto:
import rl_agent
env = kuimaze.HardMaze(...) # tady skript vytvoří prostředí
# Volání vaší funkce!
policy = rl_agent.learn_policy(env) # limit 20 sekund
# Ohodnocení jedné epizody využívající vaší policy
observation = env.reset()
state = observation[0:2]
is_done = False
while not is_done:
action = int(policy[state])
observation, reward, is_done, _ = env.step(action)
next_state = observation[0:2]
total_reward += reward
state = next_state
==== Jak začít s implementací? ====
* Začněte [[courses:b3b33kui:kuimaze:3_hardmaze|popisem prostředí]] ''HardMaze''.
* Zkuste porozumět kódu v souboru ''rl_sandbox.py'', kde je vidět základní náhodné procházení, možná inicializace tabulky Q hodnot, vizualizace atp.
==== Reprezentace Q-funkce ====
Při implementaci budete patrně potřebovat pracovat s Q-funkcí. V našem diskrétním světě bude mít podobu tabulky. Tuto tabulku lze reprezentovat různými způsoby, např.
* jako 3D ''numpy'' array (jak je naznačeno v souboru ''rl_sandbox.py''), které je indexováno třemi "souřadnicemi": //x//, //y//, //action//;
* jako slovník ''q'' indexovaný dvojicí ''state'', ''action'', v němž k jednotlivým prvkům budete přistupovat jako ''q[state, action]'';
* jako slovník seznamů ''q'', kde slovník je indexován stavem a vnitřní seznam číslem akce, takže k jednotlivým prvkům budete přistupovat jako ''q[state][action]''; atd.
==== Inicializace Q-funkce ====
Ať už si reprezentaci Q-funkce vyberete jakoukoli, budete potřebovat ji nějak inicializovat, k čemuž by se hodilo znát množinu stavů.
V reálných RL úlohách nemáme "mapu" prostředí a často ani neznáme množinu všech stavů. RL pak nikdy nekončí, protože si nikdy nemůžeme být jistí, že jsme se už dostali do všech dosažitelných stavů. V naší úloze ale RL musí skončit a vy musíte vrátit úplnou strategii, tedy co nejlepší akci pro každý stav. Proto i zde lze získat seznam všech validních stavů v prostředí pomocí metody ''get_all_states()'':
>>> env.get_all_states()
[(x=0, y=0),
...
(x=4, y=2)]
Případně si lze všechny stavy vygenerovat, znáte-li rozměry mapy:
>>> x_dims = env.observation_space.spaces[0].n
>>> y_dims = env.observation_space.spaces[1].n
>>> maze_size = (x_dims, y_dims)