Dinamik Programlama (Dynamic programming)

Yazan: Şadi Evren ŞEKER

Bir problem tahlil ve çözüm yöntemi olan dinamik programlama yapı olarak parçala fethet yöntemine benzer. Tek farkı problemi parçalara böldükten sonra aynı problemin tekrarı olan parçaları bir kerede çözüp her tekrar için ayrı bir çözüm yapmamasıdır.

Örneğin fibonacci serilerini ele alalım, Bu seriyi üreten örnek kod aşağıda verilmiştir:

int fibonacci(int n)
{
if (0 == n) {
return 0;
} else if (1 == n) {
return 1;
} else {
return fibonacci(n - 2) + fibonacci(n - 1);
}
}

Yukarıda verilen bu recursive (kendi kendini çağıran) koda bakıldığında ve kodun tahlili yapıldığında aşağıdaki fonksiyon iç içe çağırma ağacı (recursion tree ) fark edilir:

fibonacci(4)
   +------------------------------
   |                             |
fibonacci(2)                 fibonacci(3)
   +-----------------            +---------------
   |                |            |              |
fibonacci(0)   fibonacci(1)  fibonacci(1)  fibonacci(2)
                                                +-----------
                                                |          |
                                           fibonacci(0) fibonacci(1)

yani yukarıdaki örnekte, fibonacci(4) fonksiyonu için çağırma işlemleri sırasıyla gösterilmiştir. Dikkat edilirse fonksiyonlar açıldğında kendisinden önceki iki sayının toplamını bulmakta, bu işlemi yaparken de ortak elemanlar kullanmaktadır. Örneğin fibonacci(2) fonksiyonu ağacın iki farklı yerinde bulunmaktadır ve iki farklı kere içi hesaplanmıştır. İşte dinamik programlamada amaç bunu kaldırarak bir kerede çözüme ulaşmaktır.

Dinamik programlamada aşağıdaki adımlar takip edilebilir:
Verimli bir çözüm için problemin yapsınının çıkarılması
Kendini çağıran bir şekilde (Recursive) verimli çözüme değer atanması
Verimli çözümün değerini aşağıdan yukarı (bottom-up) olarak hesaplanması
Hesaplanan bu çözümle daha verimli bir çözüm varsa aranıp üretilmesi

(4. adım şayet tek çözüm varsa kullanılmaz)

Örnek problemler:
En uzun Ortak Küme (longest common subsequence, Lcs)

—————————

Bu yazıyı beğendiyseniz, başkalarının da ilgisini çekebilirsiniz:


906 views

4 responses to “Dinamik Programlama (Dynamic programming)”
  1. Ezgi says:

    hocam bu fibonacciyi dinamik programlamada(c#) nasıl yapılandırabilriz?

  2. Ezgi says:

    yani tekrarlanan alt değerleri değerleri dizide mi tutarız?
    saygılar

  3. evet, bir kere çözdüğümüz ihtimali bir daha çözmemek için, çözülmüş halini hafızada (problemin tipine göre bir dizi olabilir) tutuyoruz.

  4. Tolpp says:

    Rod-cutting problem, Knapsack problem,Matrix-chain multiplication gibi problemlerde de dynamic programming kullanılabiliyor. Algoritması oturtulduğunda işe yarar bir yöntem.

Leave a Reply


- beş = 1

Benzer Yazılar:

Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Dinamik Programlama (Dynamic programming)' isimli yazı 03 Dec 2007 tarihinde, saat: 17:46 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam906 defa okunmuştur.

Benzer yazıları algoritma analizi (teory of algorithms), Automata (otomatlar, özdevinirler), bilgisayar felsefesi, Bilgisayar Matematiği, Programlama Dilleri, Temel Bilimler kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.


Category: algoritma analizi (teory of algorithms), Automata (otomatlar, özdevinirler), bilgisayar felsefesi, Bilgisayar Matematiği, Programlama Dilleri, Temel Bilimler