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

Bölüm 9 · Yazılımın içi · Ders 42

Yığın, öbek ve closure

Yol planlayıcının özyinelemeli çağrıları bellekte ne yapar?

Veri. Depo robotu 10 ara noktadan geçen bir rotanın uzunluğunu hesaplıyor. Fonksiyon özyinelemeli: 'buradan hedefe uzunluk = bir sonraki noktaya mesafe + oradan hedefe uzunluk'. Her çağrı yığına bir çerçeve koyar; ara noktalar ise öbekte, bir listede durur. Robotun gömülü bilgisayarında yığın küçüktür; burada 16 çerçeveyle sınırladık.

noktalar listesi ve 10 demet öbekte10 çağrı · sınır 16 çerçeve
1 / 64
yigin_obek.pypython
  1. import math, sys
  2. N, SINIR = 10, 16 # çağrı sayısı, yığın sınırı
  3. sys.setrecursionlimit(SINIR + 1) # +1: modül çerçevesi
  4. noktalar = [(i, i * 7 % 5) for i in range(N)] # öbekte
  5. def uzunluk(i): # i'den hedefe yol (m)
  6. p = noktalar[i] # öbekteki demete referans
  7. if i == N - 1:
  8. return 0.0 # son nokta: çerçeve silinir
  9. d = math.dist(p, noktalar[i + 1])
  10. return d + uzunluk(i + 1) # yeni çerçeve yığına
  11. try:
  12. print('yol:', round(uzunluk(0), 2), 'm')
  13. except RecursionError:
  14. print('yığın taşması: sınır', SINIR, 'çerçeve')
  15. def sayac_yap():
  16. n = 0 # hücre (cell) nesnesine taşınır
  17. def say():
  18. nonlocal n
  19. n += 1
  20. return n
  21. return say # çerçeve gider, hücre kalır
  22. s = sayac_yap()
  23. print(s(), s(), s()) # 1 2 3
  24. print(s.__closure__[0].cell_contents) # 3

Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.

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.

yigin_obek.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Yığın: her çağrı için bir çerçeve (yerel değişkenler, dönüş adresi). Fonksiyon dönünce çerçeve hemen silinir; sırası hep "son giren ilk çıkar".
  2. Öbek: nesnelerin yaşadığı alan (liste, demetler). Çerçevedeki değişken nesnenin kendisi değil, ona bir referanstır (ok). Nesne, ona işaret eden kalmayınca silinir.
  3. Özyineleme derinliği kadar çerçeve aynı anda yığında durur. Sınırı aşan çağrı RecursionError (yığın taşması) verir.
  4. Closure: iç fonksiyon dış fonksiyonun değişkenini kullanıyorsa Python o değişkeni bir hücre (cell) nesnesine taşır. Dış çerçeve silinse de hücre öbekte yaşar; sayaç değerini çağrılar arasında korur.
  5. Şunu dene: derinliği 17 yap; 17. çağrı yığına sığmaz ve taşma olur.

Neden önemli

Mikrodenetleyicilerde yığın birkaç kilobayttır; derin özyineleme ya da büyük yerel diziler robotu sessizce çökertir, bu yüzden gömülü kodda yol arama genelde döngü ve açık bir kuyrukla yazılır. Closure ise geri çağırmalarda (sensör olayı, zamanlayıcı) durumu taşımanın en kısa yoludur.

ESOF 323, 11. hafta: robotlarda derin öğrenme →
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ç