b belajar.myudak

Return berdiskon

Agen menerima reward r0,r1,…,rT−1r_0, r_1, \dots, r_{T-1} dalam satu episode. Untuk setiap langkah tt, hitung return berdiskon, yaitu jumlah reward dari tt sampai akhir, dengan reward yang lebih jauh dikalikan γ\gamma berulang kali:

Gt=rt+γrt+1+γ2rt+2+…G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \dots
rewards = [1, 1, 1], γ = 0.9  →  [2.71, 1.9, 1.0]

Kenapa didiskon

Agen RL memaksimalkan return, bukan reward sesaat. Faktor diskon γ∈[0,1]\gamma \in [0, 1] menentukan seberapa jauh ke depan agen peduli:

  • γ=0\gamma = 0: hanya reward langkah ini (rabun jauh).
  • γ=0.99\gamma = 0.99: reward 100 langkah lagi masih bernilai 0.99100≈0.370.99^{100} \approx 0.37.
  • γ=1\gamma = 1: semua reward sama penting; hanya aman untuk episode yang pasti berakhir.

Patokan kasar: agen “melihat” sekitar 1/(1−γ)1/(1-\gamma) langkah ke depan. Untuk cart-pole dengan γ=0.99\gamma = 0.99, sekitar 100 langkah (2 detik).

Rekursi

Gt=rt+γGt+1G_t = r_t + \gamma G_{t+1}. Rumus sederhana ini adalah benih dari semua metode RL: TD-learning, Q-learning, dan GAE semuanya memakai versi “perkiraan” dari Gt+1G_{t+1}.

Penjelasan

Yang diminta. List yang sepanjang rewards, berisi GtG_t untuk setiap posisi.

Kenapa dari belakang. Menghitung tiap GtG_t langsung dengan pangkat butuh O(T2)O(T^2). Karena Gt=rt+γGt+1G_t = r_t + \gamma G_{t+1}, cukup mulai dari ujung: GT−1=rT−1G_{T-1} = r_{T-1}, lalu mundur satu per satu dalam O(T)O(T).

Langkah di kode: g = 0. Untuk t dari T-1 turun ke 0: g = rewards[t] + gamma * g, simpan ke out[t].

Cek case 1. G2=1G_2 = 1, G1=1+0.9⋅1=1.9G_1 = 1 + 0.9 \cdot 1 = 1.9, G0=1+0.9⋅1.9=2.71G_0 = 1 + 0.9 \cdot 1.9 = 2.71.

Yang dikembalikan: list float sepanjang rewards (kosong jika episode kosong).

Topik
rlreturndiskon
Petunjuk 1

Hitung dari belakang. G untuk langkah terakhir adalah reward terakhir itu sendiri.

Petunjuk 2

G_t = r_t + γ · G_{t+1}. Satu loop mundur cukup, tanpa pangkat.

Python 3.14 · NumPy

Pengaturan editor

Ukuran font
Ukuran huruf di editor.
Ukuran tab
Lebar indentasi. Otomatis: 2 spasi untuk TypeScript, 4 untuk Python.
Key bindings
Ganti ke mode Vim.
Nomor baris relatif
Nomor baris dihitung dari posisi kursor (berguna untuk gerakan Vim).
Word wrap
Baris panjang dilipat agar muat di lebar editor.
IntelliSense
Saran kode otomatis saat mengetik (Ctrl+Spasi tetap bisa dipakai saat mati).

Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.