Autorouter geliştirmeden önce bilseydim dediğim şeyler
(blog.autorouting.com)"Dünyanın en hızlı otomatik yönlendiricisini (Autorouter) yapmak için önemli dersler"
A* algoritmasını her yerde kullanmak
- A*, arama problemlerinde en güçlü ve esnek algoritmalardan biridir
- Yalnızca basit 2D gridlerde değil, çok çeşitli problemlerde kullanılabilir
- A*, BFS'ye göre daha hızlı ve verimli biçimde hedefe yakın düğümleri önceliklendiren bir 'bilgi tabanlı arama' yöntemidir
- Mevcut kodda kullanılan DFS veya BFS'nin büyük bölümü A* ile değiştirilebilir
- Performansı iyileştirmek için birden fazla A* örneği çalıştırıp, aralarından iyi performans gösteren ayarlara daha fazla kaynak ayırma tekniği kullanılabilir
Programlama dilinden daha önemli olan şey algoritmadır
- Autorouter'ı Javascript ile geliştirmek hiç sorun olmadı
- Optimizasyonun özü tekrar sayısını azaltmaktır
- Dil performansından çok, “ne kadar akıllı bir algoritmayı ne kadar hızlı geliştirebildiğiniz” daha önemlidir
- Javascript, hızlı iterasyondan ziyade akıllı algoritmalar geliştirmeye daha uygundur
Ağaç yapıları yerine Spatial Hash Indexing daha verimlidir
- Quadtree gibi ağaç tabanlı veri yapıları genelde yavaştır
- Spatial Hash Index, nesnelerin konumunu hash'leyerek uzamsal olarak yakın nesneleri birlikte işlemeye olanak tanır
- Hash tabanlı yapılar O(1)'e yakın arama performansı sunar
- Hücre boyutunu doğru seçmek gerekir; uygun boyutu belirlemek de o kadar zor değildir
Uzamsal bölümlendirme ve önbellek, algoritmadan 1000 kat daha önemlidir
- Karmaşık devre kartlarının çoğu yineleyen kalıplar içerir
- Oyun geliştirmede olduğu gibi, önceden hesaplanmış sonuçları önbelleğe alarak performans büyük ölçüde artırılabilir
- Önbelleklenebilir yapılar ve uzamsal bölümlendirme, gelecekteki autorouter'ların temelini oluşturacaktır
- Depolama alanı hızla ucuzluyor ve birkaç GB'lık önbellekle bile büyük performans artışı sağlanabilir
Görselleştirme olmadan problem çözmek mümkün değil
- Her problem için önce görselleştirme aracı yaparak işe başlandı
- Görselleştirme sayesinde hata ayıklama hızı 10 katın üzerinde artırılabildi
- Basit algoritma adımları bile görselleştirildiğinde sorunun kaynağı hızlıca bulunabiliyor
Javascript'in profilleme araçları çok kullanışlıdır
- Chrome geliştirici araçlarındaki Performance sekmesinde kod bazında harcanan süre görülebilir
- Ek bir framework olmadan da Flame Chart, bellek kullanımı gibi veriler kolayca analiz edilebilir
- Performans hata ayıklaması için son derece yararlı araçlardır
Özyinelemeli fonksiyonlar kullanmayın
- Özyinelemeli fonksiyonlar genellikle senkrondur ve A*'ya dönüştürülmeleri zordur
- İterasyon tabanlı uygulamalar daha hızlıdır ve ziyaret edilen düğümleri takip etmeyi kolaylaştırır
- Özyinelemeli fonksiyonlarda durumu değiştirmek zordur ve verimsizdir
- Mümkün olduğunca döngü tabanlı yazın
Monte Carlo algoritmalarından kaçının
- Rastgeleliğe dayalı algoritmalar belirleyici değildir ve hata ayıklaması zordur
- Alana özgü sezgiseller her zaman daha iyi performans sağlar
- Rastgele çizgi çizen bir PCB tasarımcısı yoktur → bu gerçekçi bir yaklaşım değildir
- Yine de başlangıçta fikir edinmek için yararlı olabilir
Algoritma adımlarını gerçek problem uzayına sabitleyin
- Alt algoritmaları orijine göre normalize etmek, genel akışı anlamayı zorlaştırır
- Her adımın giriş ve çıkışlarını görselleştirerek hangi aşamanın hataya yol açtığı anlaşılabilir
- Koordinat sistemini tutarlı koruyarak algoritma akışını sürdürmek önemlidir
İteratif süreci animasyonla görselleştirin
- Algoritmanın ne kadar verimsiz arama yaptığını görsel olarak fark etmek mümkündür
- Animasyon, yineleme sayısını azaltmak ve verimliliği artırmak için çok etkilidir
- Problemli durumlar kolayca yakalanabilir (ör. sonsuz döngüye giren arama gibi)
Grid olmadan da kesişim tespiti matematiği yeterlidir
- Grid kullanmak yerine vektör matematiğinden yararlanmak çok daha hızlıdır
- Bellek erişiminden daha hızlı olan matematiksel işlemler de sıkça vardır
- LLM sayesinde kesişim tespiti matematiğini uygulamak da kolaylaştı
- Gereksiz grid kullanımı performans düşüşüne neden olur
Her adımın başarısızlık olasılığını ölçerek çözüm önceliklerini belirleyin
- Her uzamsal bölümlendirme düğümünde başarısızlık olasılığı tahmin edilebilir
- Daha sonraki aşamalarda başarısız olma ihtimali yüksek düğümler öncelikli olarak yeniden yapılandırılabilir veya yeniden aranabilir
- Başarısızlık olasılığı açık biçimde ölçülebilir ve sezgisellerden daha fazla iyileştirme potansiyeli taşır
- Tüm çözüm olasılığını artırmak, optimizasyonu hedeflemekten daha etkili olabilir
Weighted A* ile hız 100 kat artırılabilir
- Temel A*, en iyi yolu garanti eder ama yavaştır
- Weighted A*, daha açgözlü arama yaparak hızı ciddi biçimde artırabilir
- Yalnızca
f(n) = g(n) + w * h(n)ağırlığını ayarlayarak uygulanabilir - Bir miktar optimallikten ödün verilse bile problem çok daha hızlı çözülebilir
- Oyun geliştirmede de sık kullanılan, incelenmeye değer bir tekniktir
1 yorum
Hacker News görüşleri
Monte-Carlo yöntemini hızlıca göz ardı etmek büyük bir hata
"Otomatik router'a güvenme" tarafındayım
Yazı, görselleştirme ve cache etkileri hakkında önemli bir noktaya değiniyor
Otomatik routing üzerine harika bir tartışma
Odağın %95'i iterasyon sayısını azaltmak üzerinde olmalı
QuadTree ve genel ağaç veri yapıları çok yavaş
Neredeyse her şey oyun geliştirmedeki sezgisel yöntemlerle örtüşüyor
"Uzamsal hash indeksleme > ağaç veri yapıları" bu alanda iyi olabilir, ama dünya çapında geçerli bir gerçek olarak kabul edilmemeli
Üniversitede öğrendiğim anahtar kelimeleri hatırlıyorum
2D/3D uzamsal problemlerle doğrudan ilgilenmeyen biri olarak, görselleştirmenin değeri benim için en büyük ders