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.
Stáhněte si archiv kuimaze.zip (Aktualizováno 21.4.2023)
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:
rl_sandbox.py
.
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
HardMaze
.
rl_sandbox.py
, kde je vidět základní náhodné procházení, možná inicializace tabulky Q hodnot, vizualizace atp.
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ř.
numpy
array (jak je naznačeno v souboru rl_sandbox.py
), které je indexováno třemi “souřadnicemi”: x, y, action;
q
indexovaný dvojicí state
, action
, v němž k jednotlivým prvkům budete přistupovat jako q[state, action]
;
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.
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)