📊 Q-Table Maze – Reinforcement Learning

OpenTechLab Jablonec nad Nisou · Science Micro Elementary School

Agent se učí navigovat bludištěm metodou pokus-omyl. Žádný učitel, žádná data – pouze odměny a tresty z prostředí.

🔗 Tři paradigmata strojového učení

📚 Supervised Learning

Data: Vstup + správná odpověď
Učitel: Člověk označuje
Příklad: MLP, CNN

🔮 Unsupervised Learning

Data: Pouze vstup
Učitel: Síť sama hledá strukturu
Příklad: Autoencoder

🎮 Reinforcement Learning

Data: Stav + akce + odměna
Učitel: Prostředí (odměny)
Příklad: Q-Learning

📊 Proč tabulka, ne neuronová síť?

Ne každá AI potřebuje „mozek" v podobě neuronové sítě. Pokud je počet stavů konečný a malý (jako naše mřížka 10×10 = 100 políček), je Deep Learning zbytečně složitý.

Zde se vracíme ke kořenům: k tabulkové metodě. Q-Learning v čisté podobě je vlastně jen vyplňování „excelové tabulky" metodou pokus-omyl.

Kdy použít co?
Q-Tabulka
Bludiště, šachy (stavy)
Deep Q-Network
Atari, Super Mario (pixely)

💡 Princip učení zůstává identický – pouze „paměť" se mění z tabulky na síť.

Zde zkoumáme základ – čistý Q-Learning s tabulkou.

⚙️ Konfigurace


Zobrazit heat mapu
Zobrazit trajektorii
Auto ε decay (×0.99)


Editor bludiště:
Klikni na buňku pro úpravu
📐 Bellmanova rovnice:
Q(s,a) ← Q(s,a) + α[r + γ·max Q(s',a') - Q(s,a)]

🗺️ Bludiště 10×10

Agent
Cíl (+100)
Zeď (-10)
Láva (-50)
Q-hodnoty
📈 Historie celkových odměn

📊 Statistiky

Epizoda
0
Krok
0
Odměna
0
Úspěšnost
0%
Nejkratší cesta
Rozhodnutí
💰 Systém odměn (editovatelné)
Dosažení cíle
Každý krok
Náraz do zdi
Vstup do lávy 🔥

Q-Tabulka (stav × akce)
Stav

🧠 Co je Q-Learning?

Q-Learning je algoritmus reinforcement learningu, kde agent se učí optimální chování metodou pokus-omyl. Klíčová myšlenka je jednoduchá:

📍
Stav (s)
Kde jsem?
🎯
Akce (a)
Kam jdu?
💰
Odměna (r)
Bylo to dobré?
📊
Q(s,a)
Zapamatuj si!

Q-hodnota = očekávaná celková odměna, když ze stavu s provedu akci a a pak budu jednat optimálně.

💰 Návrh systému odměn (Reward Shaping)

Odměny jsou jediný způsob, jak agentu sdělit, co chceme. Špatně navržené odměny = špatně naučené chování!

✓ Dobře navržené
  • Velká odměna za cíl – motivuje k dosažení
  • Malá penalta za krok – motivuje k efektivitě
  • Střední penalta za zeď – učí se vyhýbat
✗ Špatně navržené
  • Krok = 0 – agent nemá důvod spěchat
  • Cíl příliš nízký – nevyplatí se riskovat
  • Zeď příliš vysoká – agent se bojí zkoumat
💡 Experiment:

Zkus změnit odměny v panelu vpravo a pozoruj, jak se změní chování agenta. Co se stane, když dáš krok = 0? Nebo lávu = -5 místo -50?

📐 Bellmanova rovnice

Q(s,a) ← Q(s,a) + α[r + γ·maxa'Q(s',a') - Q(s,a)]
α = learning rate (jak rychle se učíme)
γ = discount factor (jak moc záleží na budoucnosti)
r = okamžitá odměna
max Q(s',a') = nejlepší očekávaná hodnota v novém stavu

🎲 ε-Greedy strategie

1-ε
Exploatace
Vyber nejlepší známou akci
ε
Explorace
Vyber náhodnou akci

Dilema: Využít co znám, nebo zkoumat nové možnosti?

📉 Auto ε Decay (Stmívání náhody)

Na začátku agent zkoumá svět (vysoké ε). S každou epizodou se ε násobí 0.99, takže agent postupně přechází k využívání naučených znalostí.

ε = 0.30 ×0.99 ε = 0.01 (po ~230 epizodách)

💻 Algoritmus Q-Learning – Jak agent rozhoduje?

Příklad: Agent na pozici (4,5)
Q-tabulka obsahuje 4 hodnoty pro tuto pozici:
Q = 0.3
Q = 0.1
Q = 0.2
Q = 0.8
→ Nejvyšší Q = 0.8 → Agent jde doprava
Co znamená Q-hodnota?
Q(stav, akce) = očekávaná celková odměna, pokud z tohoto políčka půjdu tímto směrem a pak budu jednat optimálně.
Vysoká Q = „Tudy vede cesta k cíli"
Nízká Q = „Tudy jsem narazil do zdi"
📝 Pseudokód:
// Na začátku: všechny Q-hodnoty = 0 (agent nic neví)

Q[každá_pozice, každý_směr] = 0



opakuj epizody:

    agent = startovní pozice

    

    dokud nedojde do cíle:

        

        // KROK 1: Kam půjdu?

        if random() < ε:                     // s pravděpodobností ε

            směr = náhodný (↑↓←→)         // EXPLORACE: zkouším nové

        else:

            směr = ten s nejvyšší Q        // EXPLOATACE: využívám znalosti

        

        // KROK 2: Pohni se a zjisti výsledek

        nová_pozice = agent + směr

        odměna = +100 (cíl) / -10 (zeď) / -1 (krok)

        

        // KROK 3: Aktualizuj Q-tabulku (učení!)

        Q[pozice, směr] += α × (odměna + γ × max(Q[nová_pozice]) - Q[pozice, směr])

        

        // KROK 4: Přesuň se

        agent = nová_pozice

💻 Implementační průvodce

1. Inicializace Q-tabulky
// Q-tabulka: objekt kde klíč = "x,y" a hodnota = [Q↑, Q↓, Q←, Q→]

const qTable = {};



function initQTable(gridSize) {

    for (let y = 0; y < gridSize; y++) {

        for (let x = 0; x < gridSize; x++) {

            const state = `${x},${y}`;

            qTable[state] = [0, 0, 0, 0];  // Čtyři směry, všechny Q = 0

        }

    }

}
2. Výběr akce (ε-greedy)
function chooseAction(state, epsilon) {

    // S pravděpodobností epsilon prozkoumávej náhodně

    if (Math.random() < epsilon) {

        return Math.floor(Math.random() * 4);  // Náhodný směr 0-3

    }

    

    // Jinak vyber směr s nejvyšší Q-hodnotou

    const qValues = qTable[state];

    const maxQ = Math.max(...qValues);

    

    // Pokud je více směrů se stejnou max Q, vyber náhodně

    const bestActions = qValues

        .map((q, i) => q === maxQ ? i : -1)

        .filter(i => i >= 0);

    

    return bestActions[Math.floor(Math.random() * bestActions.length)];

}
3. Aktualizace Q-hodnoty (Bellmanova rovnice)
function updateQ(state, action, reward, newState, alpha, gamma) {

    // Najdi nejlepší možnou Q-hodnotu v novém stavu

    const maxNextQ = Math.max(...qTable[newState]);

    

    // Bellmanova aktualizace

    const currentQ = qTable[state][action];

    const tdError = reward + gamma * maxNextQ - currentQ;  // Temporal Difference

    

    qTable[state][action] = currentQ + alpha * tdError;

}



// Příklad volání:

// updateQ("4,5", 3, -1, "5,5", 0.5, 0.9);

// → Aktualizuj Q pro pozici (4,5), směr doprava (3), odměna -1
4. Kompletní krok agenta
const ACTIONS = [[-1, 0], [1, 0], [0, -1], [0, 1]];  // ↑ ↓ ← →



function step(agentPos, alpha, gamma, epsilon) {

    const state = `${agentPos.x},${agentPos.y}`;

    const action = chooseAction(state, epsilon);

    

    // Vypočítej novou pozici

    const [dy, dx] = ACTIONS[action];

    const newPos = { x: agentPos.x + dx, y: agentPos.y + dy };

    

    // Zjisti odměnu (cíl/zeď/krok)

    const reward = getReward(newPos);

    const newState = `${newPos.x},${newPos.y}`;

    

    // Aktualizuj Q-tabulku

    updateQ(state, action, reward, newState, alpha, gamma);

    

    return newPos;  // Vrať novou pozici agenta

}

🚀 Praktické využití Q-Learningu

Princip "zkus → získej odměnu → nauč se" se používá v překvapivě mnoha oblastech:

🗄️ Databáze

Query Optimization: Agent se učí nejlepší pořadí JOIN operací. Index Selection: Automatický výběr indexů podle dotazů. Cache Management: Rozhodování co udržet v paměti.

🤖 Robotika

Robot se učí chodit metodou pokus-omyl. Odměna za stabilitu, penalta za pád. Boston Dynamics, DeepMind robotics.

🎮 Hry

AlphaGo (Go), OpenAI Five (Dota 2), AlphaStar (StarCraft II). Agent hraje sám proti sobě miliony her.

📈 Finance

Algoritmické obchodování, správa portfolia, optimalizace rizika. Odměna = zisk, penalta = ztráta.

🚗 Autonomní vozidla

Rozhodování o jízdních pruzích, zpomalení, předjíždění. Simulace milionů kilometrů před reálným testováním.

📱 Doporučovací systémy

Netflix, YouTube, Spotify. Akce = doporučit video. Odměna = uživatel klikl a sledoval.

🔗 Spojení s bludištěm:

V našem bludišti je stav = pozice agenta, akce = směr pohybu. V databázi je stav = aktuální dotaz + statistiky tabulek, akce = který index použít. Princip je identický!

🎯 Shrnutí klíčových konceptů

Q-Tabulka
Paměť: stav × akce → hodnota
Bellmanova rovnice
Q = odměna + γ × budoucí hodnota
ε-Greedy
Explorace vs. exploatace
Model-Free
Učení bez znalosti prostředí