Dinamik Programlama Nasıl Çalışır?
Dinamik programlama, büyük bir problemi birbiriyle örtüşen daha küçük alt problemlere böler. Her alt problemin çözümü bir kez hesaplanır ve tabloya (tabulation) ya da önbelleğe (memoization) kaydedilir; aynı alt problemle tekrar karşılaşıldığında hesap yeniden yapılmak yerine saklanan sonuç doğrudan kullanılır. Bu yaklaşım, özellikle üstel karmaşıklıktaki problemleri polinom zamana indirerek büyük verimlilik sağlar. Örneğin Fibonacci sayılarını özyinelemeyle hesaplamak O(2^n) süre alırken, DP ile O(n) süreye düşer.
Bottom-Up ve Top-Down Stratejileri
Bottom-up (tabulation): En küçük alt problemden başlanır ve büyük probleme doğru iteratif biçimde ilerlenir. Tüm sonuçlar bir tabloya yazılır; özyineleme yoktur, yığın taşması riski bulunmaz ve bellek kullanımı öngörülebilirdir. Top-down (memoization): Problem yukarıdan özyinelemeli olarak çözülür; daha önce hesaplanan sonuçlar bir sözlükte (dictionary veya hash map) saklanır. Algoritmanın doğal ve okunabilir ifadesini korur; yalnızca gerçekten ihtiyaç duyulan alt problemler hesaplanır.
Pekiştirmeli Öğrenmede Dinamik Programlama
Pekiştirmeli öğrenmede (RL) dinamik programlama, hem politika değerlendirme (policy evaluation) hem de politika yineleme (policy iteration) algoritmalarının temelidir. Richard Bellman'ın formüle ettiği Bellman optimallik denklemi, bir durumun değerini gelecekteki beklenen ödüllere göre ifade eder: V(s) = max_a [R(s,a) + γ·V(s')]. Bu denklem Q-öğrenmesinin ve DQN, PPO, SAC gibi derin RL algoritmalarının matematiksel çerçevesini oluşturur. Ortam dinamikleri tam bilindiğinde (model-based RL) DP doğrudan optimal politikayı bulur; model-free durumda ise Bellman denkleminin stokastik yaklaşımları kullanılır.
Doğal Dil İşleme ve Konuşma Tanımada Kullanım
NLP'de dinamik programlama birden fazla kritik görevde rol oynar. Levenshtein (düzenleme) mesafesi, iki dizi arasındaki minimum ekleme/silme/değiştirme sayısını DP tablosuyla O(m·n) sürede hesaplar; yazım denetimi, DNA dizilimi hizalaması ve makine çevirisi değerlendirmesinde (BLEU skoru temeli) kullanılır. Viterbi algoritması, Gizli Markov Modellerinde en olası durum dizisini bulur; konuşma tanıma ve sözcük türü etiketlemede (POS tagging) temeldir. CTC kaybı, ses tanıma modellerinde etiket ile çıktı uzunluğu uyuşmazlığını DP ile çözer.
Klasik Problemler ve Modern Uygulamalar
DP'nin klasik örnekleri: En Uzun Ortak Alt Dizi (LCS) iki dizi arasındaki en uzun ortak parçayı O(m·n)'de bulur; 0/1 Sırt Çantası kısıtlı kapasitede maksimum değeri elde eder; Matris Zinciri Çarpımı toplam çarpım maliyetini minimize eder; Floyd-Warshall tüm çiftler arasındaki en kısa yolları O(n³)'te hesaplar. Modern yapay zekada Monte Carlo Ağaç Araması (MCTS), BPE tokenizasyonu ve bazı neural architecture search (NAS) yaklaşımları DP fikirlerinden faydalanır.
Sık Sorulan Sorular
- check_circle Dinamik programlama ile böl ve yönet arasındaki fark nedir?: Böl ve yönet (divide and conquer) alt problemleri bağımsız olarak çözer; DP ise örtüşen alt problemlerin çözümlerini yeniden kullanır. Merge sort böl ve yönet örneğidir; Fibonacci veya en kısa yol DP örneğidir.
- check_circle Her problem DP ile çözülebilir mi?: Hayır. Bir problem optimal altyapı ve örtüşen alt problemler özelliklerini taşımalıdır. Gezgin Satıcı Problemi gibi NP-hard problemler DP ile kesin çözüme kavuşsa da üstel durum uzayı nedeniyle pratikte ölçeklenmez.
- check_circle Memoization ve tabulation hangi durumda tercih edilir?: Tabulation (bottom-up) tüm alt problemler gerektiğinde ve yığın taşması riski olduğunda tercih edilir; memoization (top-down) yalnızca gerekli alt problemleri hesapladığı için seyrek alt problem yapısında verimlidir ve kodun okunabilirliğini korur.
- check_circle Q-öğrenmesi neden dinamik programlamaya dayanır?: Q-öğrenmesi, Bellman optimallik denklemini iteratif biçimde yaklaşarak Q-değerlerini günceller: Q(s,a) ← Q(s,a) + α[r + γ·max Q(s',a') − Q(s,a)]. Bu güncelleme kuralı doğrudan DP'nin değer yineleme (value iteration) adımından türetilmiştir.