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