Table of Contents

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.

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.

Další požadavky:

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í?

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ř.

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)