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 38

İkili arama

Sıralı kalibrasyon tablosunda her adımda yarıyı elemek

Veri. Robotun kızılötesi mesafe sensörü için 64 satırlık bir kalibrasyon tablosu var: her satırda bir ADC okuması (artan sırada) ve ona karşılık gelen mesafe. Sensör saniyede 100 kez okuma verir; her okumada robot tablodaki doğru satırı bulup mesafeyi oradan hesaplamalı. Satır satır aramak mı, ortadan bölmek mi?

32 satırlık sıralı kalibrasyon tablosu32 satır · sınır ⌈log2(32+1)⌉ = 6 adım
1 / 39
ikili_arama.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(7)
  3. n = 32 # tablo boyu
  4. adc = np.cumsum(rng.integers(4, 26, n)) # artan ADC tablosu
  5. x = int(adc[21]) # aranan okuma
  6. lo, hi, steps = 0, n, 0 # aralık [lo, hi)
  7. while lo < hi:
  8. mid = (lo + hi) // 2 # ortadaki satır
  9. steps += 1
  10. if adc[mid] < x: # tek karşılaştırma
  11. lo = mid + 1 # sol yarıyı ele
  12. else:
  13. hi = mid # sağ yarıyı ele
  14. found = lo < n and adc[lo] == x
  15. lin = next((i + 1 for i in range(n) if adc[i] >= x), n) # doğrusal arama
  16. print("satır", lo, "bulundu", found)
  17. print("ikili", steps, "doğrusal", lin)
  18. print("sınır", int(np.ceil(np.log2(n + 1)))) # ⌈log2(n+1)⌉

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.

ikili_arama.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Aralık [lo, hi) bütün tabloyla başlar. Ortadaki satıra (mid) bakılır.
  2. Ortadaki değer aranandan küçükse aranan sağ yarıdadır (lo = mid + 1); değilse sol yarıdadır (hi = mid). Öbür yarı bir daha hiç okunmaz.
  3. Her adım aralığı yarıya indirir: n satırda en çok ⌈log2(n+1)⌉ adım. 64 satır 7 adımda biter; doğrusal arama ortalama 32 satıra bakar.
  4. Değer tabloda yoksa lo, onun sokulacağı yeri (ekleme noktasını) verir; robot iki komşu satır arasında ara değer bulur. Python'daki bisect modülü tam olarak budur.
  5. Şunu dene: dizi boyunu 8’den 64’e çıkar; doğrusal sayaç 8 kat büyürken ikili sayaç yalnız 3 adım artar.

Neden önemli

Sıralı veride arama her yerde: sensör kalibrasyon tabloları, zaman damgalı kayıtlarda belirli bir ana gitmek, veritabanı indeksleri, git bisect ile hatalı commit'i bulmak. Robotun kontrol döngüsünde milisaniyeler sayılır; log2(n) adım, tablo büyüse de süreyi neredeyse sabit tutar.

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ç