Algoritmalar II Ders 10 Dinamik Programlama ve Açgözlü Yaklaşım Soruları-2.

Slides:



Advertisements
Benzer bir sunumlar
Yinelemeli Algoritma Analizi & Asimptotik Notasyon
Advertisements

Ayrık Yapılar Algoritma Analizi.
Bilgisayar Programlama Güz 2011
Algoritmalar Ders 8 Dinamik Programlama.
MIT503 Veri Yapıları ve algoritmalar Algoritma Oluşturma – Açgözlü algoritmalar ve buluşsallar Y. Doç. Yuriy Mishchenko.
Kofaktör Matrisler Determinantlar Minör.
Bölüm 8: EĞRİ UYDURMA Fizikte laboratuarda yapılan deneysel ölçümlerin ne kadar hata payı içerdiğini, veya belli teorik modellere ne kadar uyduğunu bilmek.
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ
Özyinelemeli(Recursive) Algoritma Tasarımı
Algoritmalar DERS 3 Böl ve Fethet(Divide and Conquer) İkili arama
Diziler.
TBF Genel Matematik I DERS – 1 : Sayı Kümeleri ve Koordinatlar
Yapısal Program Geliştirme – if, if-else
MANTIKSAL OPERATÖRLER
TBF - Genel Matematik I DERS – 8 : Grafik Çizimi
DERS 2 MATRİSLERDE İŞLEMLER VE TERS MATRİS YÖNTEMİ
GEOMETRİK PROGRAMLAMA
BM-103 Programlamaya Giriş Güz 2014 (8. Sunu)
BM-103 Programlamaya Giriş Güz 2014 (9. Sunu)
Lineer Cebir Prof.Dr.Şaban EREN
Çizge Algoritmaları Ders 2.
Yrd. Doç. Dr. Mustafa AKKOL
MATLAB’ de Programlama
Öğretmenin; Adı Soyadı :
Prof. Dr. Halil İbrahim Karakaş
Algoritmalar ve Programlama I Ders 2: Akış Diyagramları
Matrisler ( Determinant )
3. HAFTA 3. Hafta.
SİMPLEKS METOT Müh. Ekonomisi.
SAYISAL ANALİZ Doç.Dr. Cüneyt BAYILMIŞ.
Sayısal Analiz / Uygulama
Yeşilköy Anadolu Lisesi. TANıM (KONUYA GIRIŞ) a, b, c gerçel sayı ve a ¹ 0 olmak üzere, ax 2 + bx + c = 0 biçimindeki her açık önermeye ikinci dereceden.
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
5. HAFTA Mart Discussion: comp.soft-sys.matlab An unmoderated newsgroup that focuses on the.
Dinamik programlama ve açgözlü yaklaşım soruları.
Bölüm10 İteratif İyileştirme Copyright © 2007 Pearson Addison-Wesley. All rights reserved.
Dinamik programlama ve Açgözlü algoritma
Dynamic Programming Introduction to Algorithms MIT Press (Chapter 15)
Algoritmalar II Ders 6 Açgözlü Algoritmalar.
Algoritmalar II Ders 2 Dinamik Programlama Yöntemi.
Algoritmalar II Ders 5 Açgözlü Algoritmalar.
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler
Algoritmalar II Ders 13 Çizgelerde tüm ikililer arasında en kısa yollar.
Algoritmalar II Ders 1: Alan zaman takası yöntemi.
Insertion Sort Fikir: Oyun kartlarını sıralamaya benzer.
Algoritmalar II Ders 7 Açgözlü Algoritmalar.
Algoritmalar II Ders 4 Dinamik Programlama Yöntemi.
Algoritmalar II Ders 17 İteratif İyileştirme Yöntemi.
Sistem Özellikleri: Yönetilebilirlik, Gözlenebilirlik
İleri Algoritma Analizi
Sistem Özellikleri: Yönetilebilirlik, Gözlenebilirlik ve Kararlılık
9. Ders Tüm ikililer arasında en kısa yollar
Algoritmalar II Ders 3 Dinamik Programlama Yöntemi.
Problem Çözme ve Algoritmalar
İleri Algoritma Analizi
Algoritmalar II Ders 11 Çizgeler. Çizgelerin bilgisayarda gösterimi. BFS algoritması.
Chapter 6 Dönüştür ve Yönet (Transform-and-Conquer)
Chapter 3 Brute Force Copyright © 2007 Pearson Addison-Wesley. All rights reserved.
Discussion: comp.soft-sys.matlab
İleri Algoritma Analizi
7. DİZİLER Bir dizi, aynı tipteki elemanların yan yana sıralanışı ile elde edilen bir bilgi kümesidir. Matematikte kullanılan doğal sayılar (1,2,3,..),
Algoritmalar II Ders 9 Dinamik Programlama ve Açgözlü Yaklaşım Soruları.
Algoritmalar II Ders 3 Dinamik Programlama Yöntemi.
BLM-111 PROGRAMLAMA DİLLERİ I Ders-10 Diziler
İleri Algoritma Analizi
Konu : Fonksiyonların Lİmiti
İleri Algoritma Analizi
Algoritmalar II Ders 2 Dinamik Programlama Yöntemi.
Sunum transkripti:

Algoritmalar II Ders 10 Dinamik Programlama ve Açgözlü Yaklaşım Soruları-2

Problem5: satranç tahtasi Problemi   n x n boyutlu satranç tahtanız ve bir taşınız vardır. Taşınızı en alt satırdan en üst satıra aşağıdaki kuralla hareket ettirmeniz istenmektedir. Her adımda taşınızı aşağıdaki 3 kareden birine taşıyabilirsiniz: bulunduğu karenin direk üstündeki kareye bulunduğu karenin direk üstünün bir solundaki kareye (eğer taşınız en sol sütunda değilse) bulunduğu karenin direk üstünün bir sağındaki kareye( eğer taşınız en sağ sütunda değilse)

x karesinden y karesine geçerken f(x,y) lira para kazanıyorsunuz x karesinden y karesine geçerken f(x,y) lira para kazanıyorsunuz. f(x,y) verilen bir fonksiyondur ve negatif değerler de alabilir. İlk adımda taşınızı en alt satırdaki herhangi bir kareye koyabilirsiniz. Amacınız en fazla para kazanmaktır. Verilen n x n boyutlu satranç tahtası ve verilen f(x,y) fonksiyonu için kazanılabilecek maksimum parayı ve bu parayı kazanmak için gerekli olan hamleleri karesel işlem zamanında bulabilen algoritma tasarlayınız.

Her kareyi (i,j) ile gösterelim. i satır numarası, j sütun numarasıdır Her kareyi (i,j) ile gösterelim. i satır numarası, j sütun numarasıdır. 1<=i<=n, 1<=j<=n dir. Problem: 1. satırdan n. satıra en iyi kazanç sağlayarak gelmek  Altproblem: 1. satırdan (i,j) karesine en iyi kazanç sağlayarak gelmek  

(i,j) karesine (i-1,j-1), (i-1,j), (i-1,j+1) karelerinin birinden gelinebilir. (j=1 ve j=n durumu dışında, bu durumlarda sadece 2 kareden gelinebilecektir) (i,j) karesine gelinen optimal yolun (i-1,m) karesinden geçtiğini varsayalım. m=j-1, j veya j+1 dir. Bu durumda (i-1,m) karesine gelinen yol da optimal olmalıdır.

Eğer aksi olsaydı, yani (i-1,m) karesine daha fazla para kazanılarak gelinen başka bir yol olsaydı, bu durumda bu yoldan gidilir, sonra (i,j) karesine geçilirdi. Yani (i,j) karesine gelinen ilk yol optimal olmazdı. Dolayısıyla, optimal yolun altyolu da optimaldır.

K(i,j) ile (i,j) karesine gelinen en iyi yoldaki kazancı gösterelim K(i,j) ile (i,j) karesine gelinen en iyi yoldaki kazancı gösterelim. K(1,j)=0 her 1<=j<=n dir. (ilk satıra hamle yaparken para kazanmıyoruz) M(i,j) ile maksimumun kazanıldığı karenin sütun numarasını işaret edelim. i=2,3,…n için aşağıdaki formüllerimiz var

1<j<n için K(i,j)=max { K(i-1,j-1)+f((i-1,j-1),(i,j)), K(i-1,j)+ f((i-1,j),(i,j)), K(i-1,j+1)+f((i-1,j+1),(i,j))}   j=1 için K(i,j)=max { K(i-1,j)+ f((i-1,j),(i,j)), j=n için K(i-1,j)+ f((i-1,j),(i,j))}

CHECKERBOARD(n, f) for j ← 1 to n do K[1, j ] ← 0 for i ← 2 to n do for j ← 1 to n do K[i, j ]←−∞ if j > 1 then K[i, j ] ← K[i − 1, j − 1] + f((i − 1, j − 1), (i, j )) M[i, j ] ← j − 1 if K[i − 1, j ] + f((i − 1, j ), (i, j )) > K[i, j ] then K[i, j ] ← K[i − 1, j ] + f((i − 1, j ), (i, j )) M[i, j ] ← j if j < n and K[i − 1, j + 1] + f((i − 1, j + 1), (i, j )) > K[i, j ] then K[i, j ] ← K[i − 1, j + 1] + f((i − 1, j + 1), (i, j )) M[i, j ] ← j + 1 return K and M

K[i,j] tablosu aşağıdan yukarı tüm kareler için doldurulduktan sonra K(n,j) lerin en büyük olanı kazanç olacaktır (1<=j<=n için)   PRINT-MOVES(M, i, j ) if i > 1 then PRINT-MOVES(M, i − 1,M[i, j ]) print “(“ i” , “j” )” t=K(n,j) lerin maksimum olduğu j olsun İlk çağrı PRINT-MOVES(M, n, t) olur.

Problem6: Altdizilere ayirma problemi Verilen bir (an) dizisini, başlangıcı ve sonu aynı olan ve dizinin ardışık elemanlarından oluşan altdizilere ayırmak istiyoruz. Örneğin, 2,1,2,4,1,6,7,8,9,1,8 dizisini (2,1,2), (4), (1,6,7,8,9,1) ve (8) biçiminde 4 altdiziye ayırabiliriz. Aynı dizinin her elemanını ayrı bir altdizi olarak düşünerek istenen koşulu sağlayan(yani başlangıcı ve sonu aynı olan) 11 altdizye veya (2), (1,2,4,1,6,7,8,9,1), (8) gibi 3 altdiziye veya başka biçimlerde de ayırabiliriz. Amacımız verilen diziyi başlangıcı ve sonu aynı olan en az sayıda altdiziye ayırmaktır. Yani giriş değişkenimiz (an) dizisi, çıkış değişkenlerimiz ise istenen koşulu sağlayan minimum altdizi sayısı ve bu altdizilerdir.

Çözüm:Adim1 Altproblem Pj : a1,a2,...aj dizisini istenen biçimde ve en az sayıda altdizilere ayırma problemi olsun. Ana problem Pn: a1,a2,...an dizisini istenen biçimde ve en az sayıda altdizilere ayırma problemidir. Ana problemin optimal çözümü, altproblemin de optimal çözümünü içermektedir. Eğer Pj dizisi daha az sayıda altdiziye ayrılmış olabilseydi, Pn de daha az sayıda altdizye ayrılmış olurdu

Çözüm: Adım2 C[j] sayısı, Pj probleminin başlangıcı ve sonu aynı olan altdizilere ayrılışındaki minimum altdizi sayısı olsun. C[0]=0 C[j]=min{C[k-1]│1≤ k ≤ j, ak=aj}+1 (1) Minimum dizi sayısı=C[n] dir. L[j] ile (1) formülünde minimumun kazanıldığı değer k ise k-1 sayısını gösterelim. L[j] nin anlamı şudur: j. aşamada L[j] den sonra ayırma işareti koyacağız.

Çözüm:Adım2 devam Soruda verilen örnek üzerinde gösterelim. j: 0 1 2 3 4 5 6 7 8 9 10 11 Pn : 2 1 2 4 1 6 7 8 9 1 8 C[j] 0 1 2 1 2 2 3 4 5 6 2 3 L[j] 0 0 1 0 3 1 5 6 7 8 1 10   Bu soruda cevap C[11]=3 tür. L[11]=10 olduğunda ilk ayırma işaretini 10. sayıdan sonra koyacağız. L[10]=1 olduğuna göre şimdi ise ayırma işaretini 1. sayıdan sonra koyacağız. L[1]=0 olduğuna göre ayırma işlemi bitmiştir. 2│ 1 2 4 1 6 7 8 9 1 │ 8

Çözüm: adım3 L[0]=0 C[0]=0 for j=1 to n C[j]=C[j-1]+1 L[j]=j-1 for k=1 to j-1 if ak==aj and C[j] >C[k-1]+1 C[j]=C[k-1]+1 L[j]=k-1 Return C[n] and L

Çözüm:Adım4 Ayırdığımız dizileri yazmak için aşağıdaki algoritmayı yazabiliriz:   in2=n in1=L[n] while in2<>0 for i=in1+1 to in2 print ai in2=L[in2] in1=L[in2] İşlem zamanı: her j=1,2,..n değeri için k=1,2,..j değerlerini alacaktır yani 1+2+3+...n=O(n2) dir.

Problem7: Bulmaca sorusu Yerel üniversite gazeteniz aşağıdaki gibi bulmacalar yayınlamaya başlamıştır: İşlem sonucunun en büyük olması için verilen ifadeye parantezler yerleştiriniz: 8+0.9 Bu soruda 2 seçenek vardır: Yanlış cevap: 8+(0.9)=8 Doğru cevap: (8+0).9=72

Problem4: Bulmaca sorusu Siz bu bulmacayı çözebilen bir algoritmayı uygulama kararı alıyorsunuz. Sizin algoritmanızın girişi x0, o0, x1,o1,...xn-1,on-1,xn dizisidir. Burada x0,x1,...xn sayıları verilen n+1 tane reel sayılar ve o1,o2,...on-1 işlemleri ise toplama(+) veya çarpma (.) işlemleridir. Verilen bir ifadede en büyük sonucu polinom zamanda bulabilen dinamik bir algoritma yazınız ve algoritmanızın işlem zamanını analiz ediniz.

Çözüm: Adım1 Bu soru matris çarpım zinciri sorusunun benzeridir. Altproblemimiz Pi,j matris çarpım zinciri sorusuna benzer xi, oi, xi+1, oi+1,...xj-1,oj-1,xj dizisi için aynı parantezleme sorusunu çözmektir. Burada 0≤i≤j≤n dir. Yani Θ(n2) tane alt problemimiz vardır.

Çözüm:Adım2 Pi,j probleminin optimal değeri M[i,j] olsun. Optimal çözümde optimal parantezin k. değerden sonra yazılması gerektiğini farz edersek Pi,j problemini çözmek Pik ve Pk+1,j problemlerini çözmek demek oluyor. Burada i≤k<j dir. Yani M[i,j] değerini bulmak için bizim tüm k değerleri için M[i,k]okM[k+1,j] değerlerini hesaplamamız ve bu hesaplanan değerlerden en büyüğünü M[i,j] ye atamamız gerekmektedir.

Rekürens rekürensimiz aşağıdaki gibidir:   M[i,j]=max{ M[i,k]okM[k+1,j]│ i≤k<j} i<j ise M[i,i]=xi dir.

Çözüm: Adım3 Bizim bu soruda da aynen matris çarpımı zinciri sorusunda olduğu gibi önce 1 uzunluklu, sonra 2 uzunluklu,... altproblemleri çözmemiz gerekmektedir. X dizisinde verilen x0,...xn sayıları, O dizisinde verilen o0,o1,...ok işlemleri olsun.

ALGORİTMA VE İŞLEM ZAMANI   Par(X,O) n=length(X)-1 for i=0 to n M[i,i]=X[i] for l=2 to n+1 for i=0 to n-l+1 j=i+l-1 M[i,j]=-∞ for k=i to j-1 q=M[i,k]O[k]M[k+1,j] if q>M[i,j] M[i,j]=q S[i,j]=k return M and S Bu algoritmada S matrisi parantezlerin yerini göstermektedir. İç içe 3 tane O(n) uzunluklu döngü olduğu için algoritmanın işlem zamanı O(n3) tür.

Problem8: kare içinde boş kareler Verilen n x n karesi bu karenin kenarlarına paralel dikey ve yatay doğrularla birim karelere ayrılmıştır. Bazı birim kareler dolu, bazı birim kareler ise boştur. Amacımız verilen n x n karesinin içinde bulunan ve tüm birim kareleri boş olan en büyük karenin kenar uzunluğunu bulmaktır.

Çözüm Öncelikle verilen kareyi aşağıdaki örnekte olduğu gibi bir A[i,j] matrisi ile ifade edelim. Bu matriste 0 dolu yerleri, 1 ise boş yerleri göstermektedir.  

Çözüm: Adım1 Altproblem Pij: sağ alt köşesi (i,j) de olan istenen özellikteki en büyük karenin kenar uzunluğunu bulma problemidir. Bu problemin optimal değeri S[i,j] olsun. Bu durumda ana problem max{s[i,j]│0≤i≤n, 0≤j≤n}dir.

Çözüm: Adım2 i=0 veya j=0 ise S[i,j]=A[i,j] olduğu açıktır. Genel durumda A[i,j]=0 ise S[i,j]=0 olduğu da açıktır. A[i,j]=1 olduğu durumu ele alalım. Sağ alt köşesi (i,j) karesinde olan a uzunluklu istenen özellikte bir karenin olabilmesi için (i-1,j-1),(i-1,j) ve (i,j-1) karelerinin her biri için sağ alt uçları bu karelerde bulunan istenen özellikte a-1 uzunluklu bir kare bulunabilmelidir. Buradan da A[i,j]=1 olduğunda S[i,j]=1+min{S[i- 1,j-1],S[i,j-1],S[i-1,j]} formülünü yazabiliriz.

ÇÖZÜM:ADIM3 VE İŞLEM ZAMANI for j=0 to n S[0,j]=A[i,j] for i=0 to n S[i,0]=A[i,j] for i=1 to n for j=1 to n if A[i,j]==0 S[i,j]=0 else S[i,j]=1+min{S[i-1,j-1],S[i,j-1],S[i-1,j]} İç içe iki döngü var ve her biri n defa çalışmaktadır. Bu nedenle de çalışma süresi θ(n2) dir.

Uyarı: Bu soruda altproblemi aşağıdaki gibi tanımlamak bir sonuç vermiyor: Sağ alt köşesi (i,j) karesinde olan dikdörtgen içinde bulunan istenen özellikteki en büyük karenin uzunluğunu bulma problemi. Altproblem böyle tanımlandığında (i,j) problemini daha önceki problemlerle ilişkilendirmek kolay değildir.

Sınav sorusu

Çözüm

Çözüm

Sınav sorusu

Çözüm

Çözüm