⚙️ Konfigurace
🗺️ Bludiště 10×10
📊 Statistiky
| Stav | ↑ | ↓ | ← | → |
|---|
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í.
Data: Vstup + správná odpověď
Učitel: Člověk označuje
Příklad: MLP, CNN
Data: Pouze vstup
Učitel: Síť sama hledá strukturu
Příklad: Autoencoder
Data: Stav + akce + odměna
Učitel: Prostředí (odměny)
Příklad: Q-Learning
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.
💡 Princip učení zůstává identický – pouze „paměť" se mění z tabulky na síť.
| Stav | ↑ | ↓ | ← | → |
|---|
Q-Learning je algoritmus reinforcement learningu, kde agent se učí optimální chování metodou pokus-omyl. Klíčová myšlenka je jednoduchá:
Q-hodnota = očekávaná celková odměna, když ze stavu s provedu akci a a pak budu jednat optimálně.
Odměny jsou jediný způsob, jak agentu sdělit, co chceme. Špatně navržené odměny = špatně naučené chování!
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?
Dilema: Využít co znám, nebo zkoumat nové možnosti?
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í.
// 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
// 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
}
}
}
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)];
}
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
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
}
Princip "zkus → získej odměnu → nauč se" se používá v překvapivě mnoha oblastech:
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.
Robot se učí chodit metodou pokus-omyl. Odměna za stabilitu, penalta za pád. Boston Dynamics, DeepMind robotics.
AlphaGo (Go), OpenAI Five (Dota 2), AlphaStar (StarCraft II). Agent hraje sám proti sobě miliony her.
Algoritmické obchodování, správa portfolia, optimalizace rizika. Odměna = zisk, penalta = ztráta.
Rozhodování o jízdních pruzích, zpomalení, předjíždění. Simulace milionů kilometrů před reálným testováním.
Netflix, YouTube, Spotify. Akce = doporučit video. Odměna = uživatel klikl a sledoval.
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ý!