Algoritmalar II Ders 2 Dinamik Programlama Yöntemi
Introduction to Algorithms MIT Press (Chapter 15) Dynamic Programming Introduction to Algorithms MIT Press (Chapter 15)
Dinamik Programlama Algoritma tasarlama yöntemidir (böl ve yönet yöntemine benzer) Böl ve yönet yöntemi Problemi bağımsız altproblemlere böler Her altproblemi özyinelemeli olarak çözer Altproblemlerin çözümlerini birleştirerek ana problemin çözümünü bulur
Dinamik programlama Dinamik programlama (DP) yönteminde -Problem altproblemlere bölünür ama bu altproblemler bağımsız olmayabilirler, yani altproblemler altaltproblemleri paylaşabilirler -Her altproblem çözülerek sonuçlar bir tabloya yazılır, yani DP yönteminde hafızadan ek alan kullanılır -Tablodaki değerler kullanılarak ana problemin çözümü bulunur
Dinamik programlama Yani böl-yönet yönteminde aynı altproblem tekrar tekrar çözülebilir ama DP yönteminde her altproblem sadece bir defa çözülür
Dinamik Programlama Altproblemler bağımsız olmadığı durumlarda kullanılır :Altproblemler altaltproblemleri paylaşabilriler Örnek: Kombinasyonlar Böl ve yönet yönteminde aynı altproblem tekrar tekrar çözülecektir Dinamik programlama yönteminde her altproblem sadece bir defa çözülecek ve sonucu bir tabloda tutulacaktır n k n-1 k-1 = + n 1 n =n =1
Örnek: Kombinasyonlar = +
Dinamik programlama Optimizasyon problemlerinde kullanılır Bir sürü seçenek arasından en iyi olanı (optimal çözümü) bulmak gerekir Yöntem optimal değeri (minimum veya maksimum) olan çözümü buluyor Optimal değeri veren çok sayıda çözüm olabilir Amaç: Bir optimal çözümü bulmaktır
Dinamik Programlama Yöntemi Verilen problem için altproblemler tanımla ve optimal çözümün yapısı incele. Optimal çözümün değerini özyinelemeli tanımla Optimal çözümün değerlerini aşağıdan yukarı hesapla Hesaplanmış bilgilerden yola çıkarak optimal çözümü oluştur (her zaman gerekli olmayabilir)
Bellman Optimallık Prensibi Bellman: Optimal çözümün altprobleme karşılık gelen parçası da altproblemin optimal çözümüdür. DP yönteminin ilk adımında altproblem tanımlandıktan sonra Bellman prensibinin bu tür tanımlanan altproblem için doğru olup olmadığı kontrol edilir. Eğer Bellman prensibi sağlanmıyorsa altproblem iyi tanımlanmamıştır ve DP yöntemi doğru sonucu bulmayabilir. Buna örenği gelecek derslerde Hırsız çantası probleminde göreceğiz.
Örnek1: Montaj hattı planlama Araba fabrikasının 2 montaj hattı olsun Her hatta n tane terminal vardır: S1,1, . . . , S1,n ve S2,1, . . . , S2,n Hatlardaki uygun terminallerde S1, j ve S2, j aynı iş yapılır ama bu iş için gerekli süreler a1, j ve a2, j farklı olabilir Giriş zamanları: e1 ve e2; çıkış zamanları: x1 and x2
Montaj hattı planlama Her terminalden aşağıdakilerden biri yapılır: Aynı hatta kalınır ve bunun bir bedeli olmaz (yani eksta süre geçmez) veya Diğer hatta geçilir: Si,j den sonra gerekli süre ti,j , j = 1, . . . , n - 1
Montaj hattı planlama Problem: 1. veya 2. hattayken hangi terminali seçelim ki bir arabanın üretimi için geçen toplam süre en az olsun?
Bir çözüm Brute force Çözüm: Tüm seçilebilir terminalleri numarala Tüm durumları hesapla ve en iyisini seç Çözüm: 2n durum vardır ways Büyük n için hesaplamak imkansız!! 1 1 demek 1. hattı seçildi j. (= n) adımda 2 3 4 n 0 demek 2. hatt seçildi j. (= 3) adımda
1. Optimal Çözümün Yapısı Minimum zaman nasıl hesaplanır?
1. Optimal Çözümün Yapısı S1,j terminalinde bulunduğumuzu varsayalım S1, j terminaline gelmek için 2 seçeneğimiz var S1, j - 1, den direk S1, j ye geçmişiz S2, j - 1, den transferle S1, j ye gelmişiz a1,j a1,j-1 a2,j-1 t2,j-1 S1,j S1,j-1 S2,j-1 Hatt1 Hatt 2
1.Optimal Çözümün Yapısı S1, j ye gelen en kısa yolun S1, j – 1 den geçtiğini varsayalım Bu durumda S1, j – 1 yi seçmek gerekir ve S1, j - 1, ye gelen en kısa yolu bulmak gerekir Benzer olarak S2, j – 1 için yapılır a1,j a1,j-1 a2,j-1 t2,j-1 S1,j S1,j-1 S2,j-1 Hatt 1 Optimal altyapı Line 2
Optimal Altyapı Genelleme: “S1, j den geçen en kısa yolu bulunuz ” probleminin çözümü “S1, j - 1 ve S2, j – 1 ye gelen en kısa yolu bulunuz “ probleminin çözümüne dönüşür Bu özelliğe optimal altyapı özelliği denir Bu özelliği kullanarak altproblemlerin optimal çözümünden ana problemin optimal çözümü bulunur
2. Özyinelemeli çözüm Optimal çözümün değerini altproblemlerin optimal çözümünün değeri cinsinden ifade edelim
2. Özyinelemeli çözüm (devam) Tanımlar: f* : tüm fabrika boyunca en kısa zaman fi[j] : başlangıç noktadan Si,j ye gelmek için geçen en kısa zaman f* = min (f1[n] + x1, f2[n] + x2)
2. Özyinelemeli çözüm (devam) Temel durum: j = 1, i=1,2 f1[1] = e1 + a1,1 f2[1] = e2 + a2,1
2. Özyinelemeli çözüm (devam) Genel durum: j = 2, 3, …,n, ve i = 1, 2 S1, j den geçen en kısa yol: a S1, j - 1 den geçer, sonra da direk S1, j ye gelir, yani f1[j - 1] + a1,j ya da S2, j - 1 den geçer, sonra da 2. hattan 1. hatta transfer olarak S1, j ye gelir, yani f2[j -1] + t2,j-1 + a1,j f1[j] = min(f1[j - 1] + a1,j ,f2[j -1] + t2,j-1 + a1,j) a1,j a1,j-1 a2,j-1 t2,j-1 S1,j S1,j-1 S2,j-1 Hatt1 Hatt 2
2. Özyinelemeli çözüm (devam) e1 + a1,1 if j = 1 f1[j] = min(f1[j - 1] + a1,j ,f2[j -1] + t2,j-1 + a1,j) if j ≥ 2 e2 + a2,1 if j = 1 f2[j] = min(f2[j - 1] + a2,j ,f1[j -1] + t1,j-1 + a2,j) if j ≥ 2
3. Optimal değerleri hesapla f* = min (f1[n] + x1, f2[n] + x2) f1[j] = min(f1[j - 1] + a1,j ,f2[j -1] + t2,j-1 + a1,j) f2[j] = min(f2[j - 1] + a2,j ,f1[j -1] + t1,j-1 + a2,j) Yukarıdan aşağıya çözüm yine de üstel işlem zamanı gerektirir 1 2 3 4 5 f1[j] f1(1) f1(2) f1(3) f1(4) f1(5) f2[j] f2(1) f2(2) f2(3) f2(4) f2(5) 4 defa 2 defa
3. Optimal çözümü hesaplama Herj ≥ 2 için fi[j] değeri sadece f1[j – 1] ve f2[j - 1] değerlerine bağlıdır Fikir: fi[j] değerlerini aşağıdaki gibi hesapla: Aşağıdan yukarıya hesaplama Önce altproblemlerin optimal çözümlerini bul Altproblemlerin optimal çözümlerinden problemin optimal çözümünü bul j nin artan değerleri sırasıyla 1 2 3 4 5 f1[j] f2[j]
Örnek e1 + a1,1, if j = 1 f1[j] = min(f1[j - 1] + a1,j ,f2[j -1] + t2,j-1 + a1,j) if j ≥ 2 1 2 3 4 5 f1[j] 9 18[1] 20[2] 24[1] 32[1] f* = 35[1] f2[j] 12 16[1] 22[2] 25[1] 30[2]
FASTEST-WAY(a, t, e, x, n) O(N) f1[1] ← e1 + a1,1 f2[1] ← e2 + a2,1 for j ← 2 to n do if f1[j - 1] + a1,j ≤ f2[j - 1] + t2, j-1 + a1, j then f1[j] ← f1[j - 1] + a1, j l1[j] ← 1 else f1[j] ← f2[j - 1] + t2, j-1 + a1, j l1[j] ← 2 if f2[j - 1] + a2, j ≤ f1[j - 1] + t1, j-1 + a2, j then f2[j] ← f2[j - 1] + a2, j l2[j] ← 2 else f2[j] ← f1[j - 1] + t1, j-1 + a2, j l2[j] ← 1 Başlangıç değerler f1 ve f2 O(N) Hesapla: f1[j] ve l1[j] Hesapla f2[j] ve l2[j]
FASTEST-WAY(a, t, e, x, n) (devam) if f1[n] + x1 ≤ f2[n] + x2 then f* = f1[n] + x1 l* = 1 else f* = f2[n] + x2 l* = 2 Fabrika boyunca en kısa zaman hesabı
4. Optimal çözümü oluşturma Alg.: PRINT-STATIONS(l, n) i ← l* print “line ” i “, station ” n for j ← n downto 2 do i ←li[j] print “line ” i “, station ” j - 1 1 2 3 4 5 f1[j]/l1[j] 9 18[1] 20[2] 24[1] 32[1] l* = 1 f2[j]/l2[j] 12 16[1] 22[2] 25[1] 30[2]