Vaším úkolem je implementovat algoritmus Q-learning pro nalezení co nejlepší strategie v prostředí, o němž máte jen velmi neúplné informace. Můžete jen vykonávat dostupné akce a pozorovat jejich účinky (posilované učení).
V modulu rl_agent.py
implementujte třídu RLAgent
. Třída musí implementovat následující rozhraní:
metoda | vstupní parametry | výstupní parametry | vysvětlení |
---|---|---|---|
__init__ | env: RLProblem , gamma: float , alpha: float | žádné | Inicializace agenta. |
learn_policy | žádné | Policy | Vrátí co nejlepší strategii, tedy slovník dvojic (stav, akce). |
env
je prostředí, tj. objekt typu kuimaze2.RLProblem
,
gamma
je tzv. “discount factor” (zlevnění) z rozmezi (0,1)
,
alpha
je tzv. “learning rate” (rychlost učení); předanou hodnotu považujte pouze za doporučení: chcete-li použít jinou, příp. ji v průběhu učení měnit/adaptovat, klidně můžete.
learn_policy()
musí být strategie (policy) reprezentovaná jako slovník, kde klíčem je vždy stav (instance třídy kuimaze2.State
) a hodnotou je optimální akce pro daný stav (instance třídy kuimaze2.Action
). Strategie musí obsahovat akci pro všechny volné stavy, včetně terminálních. U terminálních stavů na konkrétní zvolené akci nezáleží.
learn_policy()
implementujete algoritmus Q-learning.
RLProblem
nebo že potřebujete využít neveřejné proměnné a metody (jejichž jméno začíná na _
), proberte to se svým cvičícím.
Poznámka: Prostředí (env
) je instance třídy RLProblem
. Inicializace prostředí a vizualizační metody jsou stejné, jako u MDPProblem
, ale práce s prostředím je odlišná. Vykonání 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 jen pomocí hlavní metody env.step(action)
. Prostředí-simulátor ví, jaký je aktuální stav.
kuimaze2
. Zprovozněte si v něm aktualizovanou verzi balíčku kuimaze2
.
kuimaze2
najdete také skript example_rl.py
. Skript obsahuje kostru třídy RLAgent, demonstruje náhodné procházení prostředí, inicializaci tabulky q-hodnot, i vizualizaci. Lze jej využít jako výchozí kód pro implementaci třídy RLAgent
.
Váš kód bude hodnoticím skriptem volán cca takto:
import kuimaze2 import rl_agent env = kuimaze2.RLProblem(...) # tady skript vytvoří prostředí # Volání vaší funkce! agent = rl_agent.RLAgent(env, gamma, alpha) policy = agent.learn_policy() # limit 20 sekund # Ohodnocení jedné epizody využívající vaší policy state = env.reset() episode_finished = False while not episode_finished: action = policy[state] next_state, reward, episode_finished = env.step(action) total_reward += reward state = next_state
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ř.
q_table
(jak je vidět v modulu example_rl.py
), kde lze k jednotlivým prvkům přistupovat jako q_table[state][action]
;
numpy
array , které je indexováno třemi “souřadnicemi”: r, c, action;
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ů (a že jsme se všechny q-hodnoty naučili dostatečně dobře). V naší úloze ale RL skončit musí a vy musíte vrátit úplnou strategii, tedy co nejlepší akci pro každý stav. Musí tedy existovat možnost, jak zjistit množinu všech stavů. Seznam všech validních stavů lze získat pomocí metody get_states()
.
Ve skriptu example_rl.py
je již implementována inicializace q_table
ve formě slovníku slovníků. Zvolíte-li jinou reprezentaci tabulky q-hodnot, je třeba inicializaci adekvátně upravit.
11-RL
.
rl_agent.py
, příp. ZIP archiv s modulem rl_agent.py
a dalšími vámi vytvořenými moduly, které váš agent potřebuje/importuje. Tyto soubory musí být v kořeni archívu, archív nesmí obsahovat žádné adresáře! Neodevzdávejte žádné moduly, které jste dostali od nás!
Seznamte se s bodovým hodnocením úlohy.