710 likes | 1.06k Views
MIT503 Veri Yapıları ve algoritmalar Algoritma O luşturma – Dinamik Programlama. Y. Doç. Yuriy Mishchenko. Algoritma oluşturma. Ders planı Dinamik programlamanın kavramları Dinamik programlama uygulamaları Özet. Genel algoritma oluşturma: Dinamik Programlama.
E N D
MIT503 Veri Yapıları ve algoritmalarAlgoritma Oluşturma –DinamikProgramlama Y. Doç. Yuriy Mishchenko
Algoritma oluşturma Ders planı • Dinamik programlamanın kavramları • Dinamik programlama uygulamaları • Özet
Genel algoritma oluşturma:Dinamik Programlama • Dinamik programlama, en önemli genel algoritma geliştirme yaklaşımlarından biridir • Ne zaman kullanılır? • Optimum (en uygun) plan seçme için • Optimum adımlar sırası seçme için • Optimum süreç seçme için • “Dinamik programlama” adı, optimum üretme programı seçme sorunundan yaratmaktı
Genel algoritma oluşturma:Dinamik Programlama • Dinamik programlama, Richard Bellman tarafından 1940-1950’de geliştirilmişti • R. Bellman sorunu, üretim için optimum kararların sırasını seçmekte bulundu
Genel algoritma oluşturma:Dinamik Programlama • Bir üretim süreci var • Üretim, zaman 1’den zaman T’ye kadar sürüyor • Bütün zamanlarda bir karar vermek lazim • Örneğin, şu anda var olan parasını; • Yada üretime yatırmak • Yada üretimden çekip maaş olarak harcamak
Genel algoritma oluşturma:Dinamik Programlama • Yatıran parası, gelecekte daha çok gelir üretecek • Ama, kendimize biraz para almak için üretimden parasını da çekmek lazım • En büyük gelir için, optimum kararların sırasını o zaman seçmek istiyoruz
Genel algoritma oluşturma:Temel Dinamik Programlama • Matematiksel koşulları: • Bütün zamanlar için durum bu şekilde temsil edilir • Zaman t‘deki durum: işte var olan para – para(t) • Karar: işten çekecek para – çekmek(t)
Genel algoritma oluşturma:Temel Dinamik Programlama • Bir karariçin, durumu bu şekilde değiştiriyoruz: • gelir → gelir+f(çekmek(t)) • yatırım(t) = para(t) – çekmek(t) • para(t) → para(t+1)=A*yatırım • Çekilmiş para toplam gelire topluyor; bunun için bir “f” fonksiyonu kullanırız–gelir → gelir + f(çekmek) • Yatırılacak para daha sonra A-kat gelir üretiyor, yeni_para →(A*yatırım)
Genel algoritma oluşturma:Temel Dinamik Programlama • Sonuçta, toplam gelir bu şekilde bulunabilir: • gelir=f(çekmek(1))+f(çekmek(2))+...+f(çekmek(T)) • Bu ölçüde, şu toplamın maximumu bulmak istiyoruz • Şu soruna göre, optimum kararların sırasını bulmak istiyoruz, yani (çekmek(1),çekmek(2),...,çekmek(T))
Genel algoritma oluşturma:Temel Dinamik Programlama • Sonuçta, toplam gelir bu şekilde bulunabilir: • gelir=f(çekmek(1))+f(çekmek(2))+...+f(çekmek(T)) • Şu toplam, bütün kararların fönksyonu olsun: • gelir(çekmek(1),çekmek(2),...,çekmek(T)) • Bu ölçüde, birçok kararı aynı zamanda ve hep birlikte bulmak gerekir – öyle bu matematiksel problem çok zor!
Genel algoritma oluşturma:Temel Dinamik Programlama • Bellman’a göre, bu problem özyinelemekullanarak daha kolayca çözülebilir • Bütün birçok (T sayıda) kararseçme yerine daha kolay tek-basamaklı karar yöntemi arıyoruz • Bu tek-basamaklı karar verme için, bir “dinamik değer fonksiyonu” kullanıyoruz
Genel algoritma oluşturma:Temel Dinamik Programlama • Dinamik değer fonksiyonunun anlamı nedir? • Zaman t’de bizde olan para P olduğunu varsayayalım • P ile, bütün gelecek kararların optimum olacağını varsayayalım • Böyle gelecek gelire,dinamik değer fonksyonu, V(P;t,T), diyelim
Genel algoritma oluşturma:Temel Dinamik Programlama • V(P;t,T)’ye “dinamik” diyoruz çünkü zamanla bağlanmış • V(P;t,T)’ye “değer” diyoruz çünkü optimum olan gelecek geliri temsil eder • Önemli özellik burada ki, bugünkü gelir hesaplamasından gelecek gelir bildiğimizi varsaydık (!) • “Gelecek bütün optimum kararların sırası ne?” sorunun yerine, “Gelecek gelir bildiğimizi varsayırken şimdiki yatırım ne olmalı?” diyer soruyoruz
Genel algoritma oluşturma:Temel Dinamik Programlama • İki şeyi fark edelim; • V(P;T,T)=f(P) – yani son zamanda paranın hepsini çekmeliyiz çünkü gelecekte hiç bir şey/yatırım/gelir olamaz ki • V(P;t,T) özyineleme kullanarak hesaplanabilir: • Eğer t+1 zamanda V(P;t,T) bilinir (ve V(P;T,T) gerçekten biliyoruz), t zamanda optimum gelir tek karar verince bulabiliriz; • Yani, V(P;t,T)=max[f(C)+V(A*(P-C);t+1,T))] • Burada, A*(P-C) – zaman (t+1)’nın parasıdır (hatırlayın)
Genel algoritma oluşturma:Temel Dinamik Programlama • Bu ölçüde, V(P;t,T) T zamanla başlayarak özyineleme kullanarak hesaplanabilir: • V(P;T,T)=f(P) • V(P;t,T)=max[f(C)+V(A*(P-C);t+1,T))] • V(P;t+1,T)’yi biliyorsak, bütün zamanlarda yatırımı kolayca seçebiliriz • Bir çekilecek para C için, gelecek gelir bu şekilde olur • f(C)+V(A*(para(t)-C);t+1,T) • Çekilecek para seçmek için, C’ye göre şu maximumu buluyoruz, • max[f(C)+V(A*(para(t)-C);t+1,T)]
Genel algoritma oluşturma:Temel Dinamik Programlama • A=2 (yatırım büyüme) ve • f(çekme)=log(çekme+1) örnek: P(t) V(P;t) Son anda V(P,T)=f(P) t t=2 t=3 t=4 t=5 t=1
Genel algoritma oluşturma:Temel Dinamik Programlama • Zaman T ile başlayarak, V(P;T-1)=max[f(C)+V(A*(P-C);T))] çözüyoruz • t=T-1, son para P=1 için: • mümkün çekilecek para=0 için, şu var • f(0)+V(A*(1-0);T)=f(0)+V(2;T)=log(1+0)+log(1+2)=f(0)+f(2) • mümkün çekilecek para=1 için, şu var f(1)+V(A*(1-1);T)=f(1)+V(0;T)=log(1+1)+log(1+0) =f(1)+f(0) • optimum seçim - 0, optimum gelir - V(1;T-1)=f(0)+f(2)=log(3) P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1
Genel algoritma oluşturma:Temel Dinamik Programlama • Son para P=2 için: • mümkün çekilecek para=0 için, şu var • f(0)+V(A*(2-0);T)=f(0)+V(4;T)=f(0)+f(4)=log(1)+log(5) • mümkün çekilecek para=1 için, şu var f(1)+V(A*(2-1);T)=f(1)+V(2;T)=f(1)+f(2)=log(2)+log(3) • mümkün çekilecek para=2 için, şu var f(2)+V(A*(2-2);T)=f(2)+V(0;T)=f(2)+f(0)=log(3)+log(1) • optimum seçim - 1, optimum gelir V(2;T-1)=f(1)+f(2)=log(6) P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1
Genel algoritma oluşturma:Temel Dinamik Programlama • Bu şekilde devam ederek kalan değerleri dolaşıyoruz... P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1
Genel algoritma oluşturma:Temel Dinamik Programlama • Şimdi, zaman T-1 V(P;T-1) bulunca, V(P;T-2) benzer şekilde buluyoruz, yani V(P;T-2) =max[f(C)+V(A*(P-C);T-1))] • t=T-2, T-1’deki para P=1 için: • mümkün çekilecek para=0 için, şu var • f(0)+V(A*(1-0);T-1)=f(0)+V(2;T-1)=f(0)+(f(1)+f(2))=log(6) • mümkün çekilecek para=1 için, şu var f(1)+V(A*(1-1);T-1)=f(1)+V(0;T-1)=f(1)+(f(0))=log(1) • optimum seçim burada da 0, V(1;T-1)=f(0)+f(2) P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1
Genel algoritma oluşturma:Temel Dinamik Programlama • t=T-1, T-1’deki para P=2 için: • mümkün çekilecek para=0 için, şu var • f(0)+V(A*(2-0);T-1)=f(0)+V(4;T-1)=f(0)+(f(2)+f(4))=log(15) • mümkün çekilecek para=1 için, şu var f(1)+V(A*(2-1);T-1)=f(1)+V(2;T-1)=f(1)+(f(1)+f(2))=log(12) • mümkün çekilecek para=2 için, şu var f(2)+V(A*(2-2);T)=f(2)+V(0;T)=f(2)+f(0)=log(3) • optimum seçim - 0, gelir - V(2;T-2)=f(0)+f(2)+f(4)=log(15) P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1
Genel algoritma oluşturma:Temel Dinamik Programlama • Aynı şekilde kalan değerleri dolaşıyoruz... P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1
Genel algoritma oluşturma:Temel Dinamik Programlama • Aynı şekilde kalan değerleri dolaşıyoruz... P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1
Genel algoritma oluşturma:Temel Dinamik Programlama • Aynı şekilde kalan değerleri dolaşıyoruz... P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1
Genel algoritma oluşturma:Temel Dinamik Programlama • Sonuçta bütün “dinamik değer fonksyonu” buluyoruz P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1
Genel algoritma oluşturma:Temel Dinamik Programlama P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1 • Şimdi, başta olan para P=1 için, birimci yatırım benzer şekilde seçiyoruz, ve şu, çekilecek para C=0, yatırım=1 değirde, gelir V(2;2) bulunur
Genel algoritma oluşturma:Temel Dinamik Programlama P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1 • İkinci adım olarak, olan para P=2, ikinci yatırım benzer şekilde seçip,→ çekilecek para 0, yatırım 2 değerde, gelir V(4;3) olur
Genel algoritma oluşturma:Temel Dinamik Programlama P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1 • Benzer şekilde, üçüncü adım için, olan para P=4 için, çekilecek para 2 ve yatırım 2 değerde olmalı,
Genel algoritma oluşturma:Temel Dinamik Programlama P(t) V(P;t) t t=2 t=3 t=4 t=5 t=1 • Sonunda, çekme sırası=(0,0,2,2,4), yatırım sırası=(1,2,4,4,0), ve toplam gelir=f(0)+f(0)+f(2)+f(2)+f(4)=log(3*3*5) şekilde bulunur
Genel algoritma oluşturma:Önemli kavramları • Üretimin optimum kararların sırasını seçmesi, tarihinin dinamik programlamanın ılk uygulamasıdır • Modern zamanlarda çok farklı uygulama var • En kısa patika/yol seçme • Hanoi Kuleleri oynaması • Diziler hizalama ve arama, altdizi karşılaştırma • Genetik sıra hizalama • Veritabanı sorgusu optimizasyonu • Liste devem eder ...
Genel algoritma oluşturma:Önemli kavramları • Dinamik programlama metodunun önemli genel kavramları: • Optimum altyapı özelliği: tüm problemin çözümü, problemin parçalarının çözümlerini kullanarak sağlanabilir • Örneğin: planlamada, gelecek zaman için planı varsa (V(P;t)), onu kullanarak şimdiki adım için optimum plan da seçebiliriz • Örneğin: en kısa patika bulmada, A noktasından B noktasına en kısa patika varsa, o zaman ortasındaki bir C noktası için, AC ve CB da en kısa patikalar olmalıdır (yoksa, daha kısa patika oluşturabiliriz !) en kısa patika A AC AB=AC+CB B C CB
Genel algoritma oluşturma:Önemli kavramları • Dinamik programlama metodunun önemli genel kavramları • Örtüşen altproblemler özelliği:tüm problemin altproblemlerinin hepsi aynı şekilde olmalıdır(veya az mümkün şekilde bulunabilir) • Planlamada, gelecek zamanlar için planı V(P;t) kullanarak önceki adım için optimum planı bulma her zaman benzer sorundur; yaniV(P;t-1)=max[f(C)+V(A*(P-C);t))] • En kısa patika için, A noktasından B noktasına en kısa patikanın parçaları, benzerşekilde, en kısa patikalar dır en kısa patika A AC AB=AC+CB B C CB
Genel algoritma oluşturma:Önemli kavramları • Dijkstra algoritması – birkaç nokta için, bütün noktaların çiftları için bir yol sistemine göre uzaklığı bulmak (Mezitli’den merkezine dolmuşlar seçmek) • Optimum altyapı var • C’den B’ye yol varsa, A’dan B’ye bu şekilde gidebiliriz: ilk önce A’dan C’ye gidin, sonra C’den B’ye gidin (altproblemleri) • Örtüşem altproblemler özelliği var • B’ye bağlanmış bütün C noktalar için, A’dan B’ye en kısa patika her zaman aynı şekilde bulunur: “AB yol” = min(A’dan C’ye en kısa yol + C’den B’ye yol)
Genel algoritma oluşturma:Önemli kavramları • Dijkstra algoritması – A noktasından başka B noktasına en kısa yol bulmak min(A’dan C’ye en kısa yol + C’den B’ye direkt yol) C5 C1 B C2 A C4 C3
Genel algoritma oluşturma:Önemli kavramları • Dijkstra algoritması – A noktasından başka B noktasına en kısa yol bulmak min(A’dan C’ye en kısa yol + C’den B’ye direkt yol) C5 C1 B C2 A C4 C3
Genel algoritma oluşturma:Önemli kavramları • Dinamik programlama metodunun önemli genel kavramları: • Optimum altyapı ve • Örtüşen altproblemler özellikler; • Şunlar varsa, tüm probleminçözümü birbirine benzeyen daha küçük altproblemlerini çözürken sağlayabiliriz
Genel algoritma oluşturma:Önemli kavramları • Şunun için; • Ya da bütün mümkün altproblemlerini çözürken, onların çözümleri bir tabloya atıp sonra kullanabiliriz (yukarıdan aşağıya yaklaşım) • Ya da altproblemlerini sırayla çözüp bir tablo oluşturabiliriz (aşağıdan yukarıya yaklaşım)
Genel algoritma oluşturma:Örnekler • En kolay dinamik programlama örneği: binom katsayıları hesaplama, C(k,n) • C(k,n), toplam n nesneden mümkün k nesne seçenekleri sayıyor • Özellikleri: • C(k,n)=n!/k!(n-k)! (n!=1*2*3*...*(n-1)*n – faktöriyel) • C(k,n)=C(k,n-1)+C(k-1,n-1) (altyapı denklem) • C(0,n)=1; C(n,n)=1
Genel algoritma oluşturma: Örnekler • Büyük k ve n için, faktoriel hesaplama zor olur, ve C(k,n)=C(k,n-1)+C(k-1,n-1) formül kullanılır
Genel algoritma oluşturma: Örnekler • Direkt C(k,n)=C(k,n-1)+C(k-1,n-1) kullanma çok hesaplama gerekiyor, ama dinamik programlama için gereken bütün durumlar var: • Optimum altyapı var – C(k,n), daha küçün k ve n C-katsayıları kullanarak hesaplanır (yani – C(k,n)=C(k,n-1)+C(k-1,n-1)) • Örtüşen altproblemler özelliği var – C katsayıların hepsi aynı şekilde hesaplanır (yani şu formül tekrar tekrar kullanılır, C(k,n)=C(k,n-1)+C(k-1,n-1))
Genel algoritma oluşturma: Örnekler C(k,n) hesaplarken onları bir tabloda kaydedince, belirli C(k,n) O(kn) vakitle hesaplanabilir: Sözde kodu: döngü i=0’dan n’ye kadar // döngü döngü j=0’dan min(i,j)’ye kadar //döngüeğer j=0 veya j=i ise C(j,i)=1aksi halde C(j,i)=C(j-1,i-1)+C(j,i-1) //altproblemi hesaplamaeğer sonu//ve kaydetmedöngü sonu döngü sonu
Genel algoritma oluşturma: Örnekler • Dinamik programlama Excel’de yapılabilir (C(k,n) hesaplama):
Genel algoritma oluşturma: Örnekler • Dinamik programlama Excel’de yapılabilir (C(k,n) hesaplama): İlk değerleri dolduralım yani C(0,n)=1
Genel algoritma oluşturma: Örnekler • Dinamik programlama Excel’de yapılabilir (C(k,n) hesaplama): C(k,n-1)+C(k-1,n-1) formül girelim
Genel algoritma oluşturma: Örnekler • Dinamik programlama Excel’de yapılabilir (C(k,n) hesaplama): C(k,n-1)+C(k-1,n-1) formül kopyalama
Genel algoritma oluşturma: Örnekler • Dinamik programlama Excel’de yapılabilir (C(k,n) hesaplama): C(k,n-1)+C(k-1,n-1) formül kopyalama
Genel algoritma oluşturma: Örnekler • Levenstein mesafe - diziler için önemli bir mesafe ölçümü: iki dizinin farkı temsil ediyor • Bir A dizisi bir B disine sadece harfların silme, ekleme ve ikame operasyonları kullanırken değiştirmek istiyoruz • Levenstein mesage – şu operasyonların minimum sayısıdır • A=“kitten” B=“sitting” : • kitten→sitten - ikame op • sitten →sittin - ikame op • sittin →sitting -ekleme op • Toplam: 3 operasyon (2 ikame 1 ekleme); Levenstein mesafe 3’ye eşittir
Genel algoritma oluşturma: Örnekler • Levenstein mesafe diziler hizalama ve altdiziler arama için kullanılır (örneğin – genetik araştırmada), iki dizinin en büyük ortak parçasını bulmak için kullanılır
Özet • Dinamik programlama, üretimin optimum kararların sırasını seçmesi için geliştirildi, ama bundan sonra çok uygulama bulundu • Bir süreç için optimum program veya plan seçmek lazım • Bütün kararların sırasını seçme yerine daha kolay tek-basamaklı karar yöntemi arıyoruz • Böyle tek-basamaklı kararlar için “dinamik değer fonksiyonu” kullanıyoruz
Özet • V(P;t)’ye “dinamik” diyoruz çünkü zamanla değişiyor • V(P;t)’ye “değer” diyoruz çünkü P olan para için mümkünse optimum geliri belirliyor • “Bütün optimum planın sırası ne?” sorunun yerine “Gelecek planı bildiğimizi varsayarak şimdi karar ne olmalı?” diyer soruyoruz