Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

Projeler · Proje 3

Rüzgârda yumuşak iniş: pekiştirmeli öğrenen drone

Q-öğrenme gaz kolunu deneyerek ayarlamayı öğrenir

Senaryo. Bir teslimat drone’u 6–10 metreden iniş pistine dikey olarak inmeli. Pervanelerin dört gaz kademesi var: kapalı, %70, %100 (havada asılı kalır) ve %130. Rüzgâr hamleleri onu habersizce aşağı ya da yukarı itiyor. Yere 1 m/s’den yavaş değerse iniş yumuşaktır; daha hızlı değerse gövde zarar görür. Drone’a kimse nasıl ineceğini söylemiyor; yalnızca her denemenin sonunda puan alıyor.

Amaç. Son 100 eğitim inişinin en az %90’ı yumuşak olsun (keşif hamleleri dahil).

3B sahne yükleniyor…

bölüm 0 · eğitim arka planda · sahnede açgözlü gösteri uçuşu
Sürükle: döndür · iki parmak / tekerlek: yakınlaş

Eğitim paneli

Eğitim çalıştırılıyor…

Model bu sayfada, tarayıcında sıfırdan eğitilir (sabit tohum: aynı ayarlarla her seferinde aynı sonuç). Eğitim her karede küçük parçalar hâlinde yapılır; sekme ya da sahne görünmezken durur.

Adımlar

  1. Her 0,1 saniyede drone durumunu kutulara çevirir: kaç metrede, ne hızla iniyor, rüzgâr hangi yöne itiyor.
  2. ε olasılıkla rastgele bir gaz kademesi dener, yoksa tablodaki en yüksek puanlı kademeyi seçer.
  3. Fizik ilerler: itki eksi ağırlık artı rüzgâr ivmeyi verir, ivme hızı, hız yüksekliği değiştirir.
  4. Ödül gelir: her karar −0,1 (enerji), yumuşak iniş +100, sert iniş −50 ve hız başına −10, kaçış ya da süre dolması −60. Az önceki kararın puanı ödülle ve varılan durumun en iyi puanıyla düzeltilir.
  5. Binlerce bölüm arka planda hızla oynanır. Sahnedeki drone keşif yapmadan, o anki tabloyla uçar: tablo iyileştikçe inişi de yumuşar.

Model

Tablo hâlinde Q-öğrenme. Durum: yükseklik (10 kutu) × dikey hız (11 kutu) × rüzgâr hamlesinin yönü (3 kutu) = 330 durum; her durumda 4 gaz kademesi için bir puan, toplam 1.320 puan. Güncelleme Q-öğrenme dersindeki satırın ödüllü ve iskontolu hâli: Q ← Q + α · (ödül + γ · en iyi sonraki Q − Q). Keşif ε-açgözlü: ε her bölümde biraz azalır.

Kullanılan dersler: Q-öğrenme: şarj istasyonunu bulan robot · Gradyan inişi: kayıp arazisinde yokuş aşağı

Kendin dene

  1. Rüzgârı 0’a indir: drone yaklaşık 660 bölümde hedefe ulaşır (varsayılan 0,8 rüzgârda yaklaşık 920). Rüzgârı 2’ye çıkar: yaklaşık 1.420 bölüm gerekir, iki katından fazla. Sonra tohumu 13 yap: aynı fırtınada 4.000 bölümde bile hedefe ulaşamaz.
  2. Keşfi (ε) 0’a indir: drone yine öğrenir ama yaklaşık 1.550 bölümde. Sebep Q-öğrenme dersindekinin aynısı: tablo sıfırla başlar, gerçek puanlar ise eksidedir; denenmemiş her kademe olduğundan iyi görünür ve drone onları kendiliğinden dener. ε bu merakı hızlandırır.
  3. Öğrenme oranını (α) 0,05’e indir: her deneme tabloyu çok az değiştirir ve hedef yaklaşık 1.800 bölüme, neredeyse iki katına çıkar.

Python karşılığı

drone_inis.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(7)
  3. DT, G, YUMUSAK = 0.05, 9.81, 1.0 # adım (s), yerçekimi, iniş sınırı (m/s)
  4. GAZ = np.array([0, 0.7, 1.0, 1.3]) # itki / ağırlık
  5. HK = [0.3, 0.7, 1.2, 2, 3, 4.5, 6.5, 9, 12] # yükseklik kutuları
  6. VK = [-6, -4, -3, -2, -1.5, -1, -0.5, 0, 0.5, 1.5] # hız kutuları
  7. durum = lambda h, v, r: (np.digitize(h, HK), np.digitize(v, VK), int(np.sign(r) * (abs(r) > .6)) + 1)
  8. Q = np.zeros((10, 11, 3, 4)) # 1.320 puan, hepsi sıfır
  9. alfa, gama, eps, ruzgar = 0.2, 0.98, 0.3, 0.8
  10. history = {'episode': [], 'return': [], 'soft': [], 'epsilon': []} # eğitim geçmişi: bölüm başına
  11. for bolum in range(4000):
  12. h, v, r = rng.uniform(6, 10), -1.5 * rng.random(), 0.0
  13. s, sonuc, getiri = durum(h, v, r), None, 0.0 # getiri: bölümün toplam ödülü
  14. while sonuc is None:
  15. a = rng.integers(4) if rng.random() < eps else Q[s].argmax() # ε-açgözlü
  16. for _ in range(2): # karar 0,1 s geçerli
  17. r += -0.08 * r + ruzgar * 0.35 * rng.normal() # rüzgâr hamlesi
  18. v += (GAZ[a] * G - G + r) * DT; h += v * DT
  19. if h <= 0: sonuc = "yumusak" if abs(v) < YUMUSAK else "sert"; break
  20. if h > 16: sonuc = "kacti"; break
  21. odul = {None: -0.1, "yumusak": 100, "kacti": -60}.get(sonuc, -50 - 10 * abs(v))
  22. getiri += odul
  23. s2 = durum(h, v, r)
  24. hedef = odul + (0 if sonuc else gama * Q[s2].max())
  25. Q[s + (a,)] += alfa * (hedef - Q[s + (a,)]) # öğrenmenin tamamı bu satır
  26. s = s2
  27. for k, x in zip(history, (bolum + 1, getiri, int(sonuc == "yumusak"), eps)): history[k].append(x)
  28. eps = max(0.02, eps * 0.997) # keşif azalır
  29. son = slice(-100, None) # son 100 bölüm
  30. print(f'{"yumuşak iniş (son 100)":<26}{np.mean(history["soft"][son]):>8.2f}')
  31. print(f'{"ortalama getiri (son 100)":<26}{np.mean(history["return"][son]):>8.1f}')
  32. print(f'{"epsilon":<26}{eps:>8.3f}')
  33. import csv
  34. with open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yaz
  35. csv.writer(f).writerows([list(history), *zip(*history.values())]) # satır başına bir bölüm
  36. try:
  37. import matplotlib.pyplot as plt # varsa grafik çiz
  38. ort = np.convolve(history['return'], np.ones(50) / 50, mode='valid') # 50 bölümlük kayan ortalama
  39. plt.plot(history['episode'], history['return'], alpha=0.3, label='return'); plt.plot(history['episode'][49:], ort, label='ma50')
  40. plt.xlabel('episode'); plt.ylabel('return'); plt.legend(); plt.show()
  41. except ImportError:
  42. print('matplotlib yok: grafik atlandı')

Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.

Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide

Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.

drone_inis.pypython

Çıktı

Çıktı burada görünecek.
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç