Q-Learning

"Belajar dari Kesalahan (Trial & Error)"

1. Apa itu Q-Learning?

Berbeda dengan Supervised Learning (dikasi kunci jawaban) atau Unsupervised (cari pola), Reinforcement Learning (RL) belajar seperti bayi atau hewan peliharaan: melalu Sistem Reward (Hadiah) & Punishment (Hukuman).

Q-Learning adalah algoritma RL klasik di mana Agent belajar nilai kualitas (Quality / Q-Value) dari setiap tindakan di setiap keadaan.

  • Agent: Yang belajar (Robot/AI).
  • Environment: Dunia tempat agent hidup (Labirin/Game).
  • State ($S$): Posisi agent saat ini.
  • Action ($A$): Apa yang dilakukan (Atas, Bawah, Kiri, Kanan).
  • Reward ($R$): Nilai balik (+100 dapet Emas, -100 kena Api).

2. Visualisasi: Grid World

Start
+100
-10
-10

Agent (Bulatan Pink) harus mencari jalan ke +100 tanpa kena -10. Awalnya dia akan jalan ngawur (Exploration). Kalau kena api, dia ingat "Disitu sakit, jangan kesana lagi". Kalau dapat emas, dia ingat "Lewat sini enak!".

3. Rumus Sakti: Bellman Equation

Bagaimana cara update Q-Table (Otak Agent)?

$$ Q_{new}(s,a) = Q_{old}(s,a) + \alpha \cdot \left[ \underbrace{R + \gamma \cdot \max Q(s', a')}_{\text{Target}} - \underbrace{Q_{old}(s,a)}_{\text{Prediksi Lama}} \right] $$
  • $\alpha$ (Learning Rate): Seberapa cepat `move on` dari pengetahuan lama.
  • $\gamma$ (Discount Factor): Seberapa peduli masa depan. (0 = peduli sekarang aja, 1 = peduli jangka panjang).
  • $\max Q(s', a')$: Nilai terbaik yang BISA didapatkan dari state selanjutnya (Mimpi indah).

4. Simulasi Perhitungan Manual

Misal Agent ada di kotak A, mau ke kanan (B).
Nilai awal $Q(A, Kanan) = 0$. $\alpha=0.1, \gamma=0.9$.

Langkah 1:
  • Agent gerak dari A ke B.
  • Dapat Reward $R = -1$ (karena setiap langkah capek).
  • Di B, dia intip masa depan: Nilai max di B (misal dia tau di B bisa ke C yang rewardnya besar) saat ini masih 0 semua.
  • $Q_{new}(A, Kanan) = 0 + 0.1 \cdot [-1 + 0.9(0) - 0] = \mathbf{-0.1}$.
Langkah 100 (Setelah tau B dekat Goal):
  • Misal $Q(B, Kanan)$ sudah jadi 50 (karena dekat Goal).
  • Sekarang update lagi $Q(A, Kanan)$.
  • $Q_{new}(A, Kanan) = -0.1 + 0.1 \cdot [-1 + 0.9(50) - (-0.1)]$
  • Target = $-1 + 45 = 44$.
  • Gap = $44 - (-0.1) = 44.1$.
  • $Q_{new} = -0.1 + 4.41 = \mathbf{4.31}$.

Lihat! Nilai posisi A naik drastis karena sekarang dia tau A itu tetangga orang kaya (B).

5. Implementasi Python (Gymnasium)

import numpy as np
import gymnasium as gym # Library standar RL
import random

# 1. Buat Environment (FrozenLake: Jalan licin, ada lubang)
env = gym.make("FrozenLake-v1", is_slippery=False, render_mode="ansi")

# 2. Inisilisasi Q-Table (State x Action)
# State: 16 kotak (4x4), Action: 4 (Kiri, Bawah, Kanan, Atas)
q_table = np.zeros((env.observation_space.n, env.action_space.n))

# Parameter
alpha = 0.8  # Learning Rate
gamma = 0.95 # Discount Factor
epsilon = 0.1 # Eksplorasi (10% ngawur)

# 3. Training Loop
for episode in range(1000):
    state, _ = env.reset()
    done = False
    
    while not done:
        # Epsilon-Greedy Strategy
        if random.uniform(0, 1) < epsilon:
            action = env.action_space.sample() # Eksplorasi (Ngawur)
        else:
            action = np.argmax(q_table[state]) # Eksploitasi (Pilih terbaik)
            
        # Lakukan aksi
        next_state, reward, terminated, truncated, _ = env.step(action)
        done = terminated or truncated
        
        # --- RUMUS Q-LEARNING ---
        old_value = q_table[state, action]
        next_max = np.max(q_table[next_state])
        
        new_value = old_value + alpha * (reward + gamma * next_max - old_value)
        q_table[state, action] = new_value
        
        state = next_state

print("Q-Table Final:")
print(q_table)