Dinamik programlama ve açgözlü yaklaşım soruları.

Slides:



Advertisements
Benzer bir sunumlar
Yinelemeli Algoritma Analizi & Asimptotik Notasyon
Advertisements

Ayrık Yapılar Algoritma Analizi.
MIT503 Veri Yapıları ve algoritmalar
STRİNG FONKSİYONLARI.
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İ
TÜREV UYGULAMALARI.
Ö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İ
MATRİS-DETERMİNANT MATEMATİK.
BM-103 Programlamaya Giriş Güz 2014 (8. Sunu)
CEBİRSEL İFADELER.
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
Bilgisayar Programlama. Tek bir değişken tanımlamak için aşağıdaki gibi bir yazım yeterlidir. int i; Hatırlanacağı gibi bu tarz bir tanımlamada.
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ı :
MATLAB’ de Programlama
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.
Adım Adım Algoritma.
SAYISAL ANALİZ Doç.Dr. Cüneyt BAYILMIŞ.
Sıralama. Sıralama, bir dizideki sayısal elemanların küçükten büyüğe veya büyükten küçüğe, sayısal olmayan bir dizideki elemanların ise A’ dan Z’ ye.
MATEMATİK DÖNEM ÖDEVİ.
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ü 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
Algoritmalar II Ders 10 Dinamik Programlama ve Açgözlü Yaklaşım Soruları-2.
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.
İleri Algoritma Analizi
Diziler.
9. Ders Tüm ikililer arasında en kısa yollar
Algoritmalar II Ders 3 Dinamik Programlama Yöntemi.
İleri Algoritma Analizi
Bilgisayar Bilimi Problem Çözme Süreci-2.
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.
İleri Algoritma Analizi
Algoritmalar II Ders 2 Dinamik Programlama Yöntemi.
Sunum transkripti:

Dinamik programlama ve açgözlü yaklaşım soruları

Problem1:Palindrom sorusu Problem: Bir sözün düzden okunuşuyla tersten okunuşu aynı ise bu söze palindrom denir. Örneğin, ve KABAK birer palindromlardır. Verilen bir sözden en az sembol silerek palindrom elde etmek istiyoruz. Örneğin, sözünden 1 sembol, yani 2 silinirse palindrom oluşur.

Dinamik programlama yaklaşımı Verilen söz S[1...n] olsun. 1. Adım. Optimal çözümün yapısını inceleme ve alt problemi tanımlama Altproblem S[i...j] dizisinden minimum sayıda harf atılarak palindrom elde etme sorusu olsun. Ana problem S[1...n ] dizisinden minimum sayıda harf atılarak palindrom elde etme sorusudur. Ana problemin optimal çözümü, alt problemin optimal çözümünü içermektedir, aksi durumda yani S[i...j] dizisinden daha az harf atılarak palindrom elde edilebilseydi S[1...n] dizisinden de daha az harf atılarak palindrom elde edilebilirdi.

Altproblemlerin optimal çözümleri arasında özyinelemeli formül S[i,j] dizisinden palindrom elde etmek için atılması gereken minimum harf sayısı f(i,j) olsun. Eğer S[i]=S[j] ise S[i...j] sözünde baştaki ve sondaki harfler aynıdır, yani bu harflerin atılması gerekmiyor, bu durumda S[i+1...j-1] sözü için atılması gereken minimum harf sayısı ile f(i,j) sayısı aynı olacaktır. Yani f(i+1,j-1)=f(i,j) eğer S[i]=S[j] ise

Eğer S[i]≠S[j] ise ya S[i], ya da S[j] nin atılması gerekiyor. Eğer S[i] atılırsa geriye S[i+1...j] sözü, eğer S[j] atılırsa geriye S[i...j-1] sözü kalacaktır. Her iki durumda atılması gereken harf sayısı 1 artacaktır. Bu iki durumdan minimum olanı seçmemiz gerektiğinden f(i,j)=min{f(i+1,j),f(i,j-1)}+1, eğer S[i]≠S[j] ise

Sonuç olarak, f(i,j) =f(i+1,j-1) eğer S[i]=S[j] ise = min{f(i+1,j),f(i,j-1)}+1, eğer S[i]≠S[j] ise Ayrıca f(i,i)=0 her i≥1 için f(i+1,i)=0 her i≥1 için

Burada f(i,j) değerleri aşağıda gibi hesaplanır önce indisler farkı 1 olanlar, yani f(1,2), f(2,3),...f(n-1,n), sonra indis farkı 2 olanlar yani f(1,3),f(2,4),...f(n-2,n), sonra indis farkı 3 olanlar... ve en sonda indis farkı n-1 olan yani f(1,n) hesaplanır. Bu işlem karesel zamanda yapılır.

Problem2: satranç tahtası 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. 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. 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(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)), K(i-1,j+1)+f((i-1,j+1),(i,j))} 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))}

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 ] + p((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 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.

Problem3 Verilen bir (a n ) 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 (a n ) dizisi, çıkış değişkenlerimiz ise istenen koşulu sağlayan minimum altdizi sayısı ve bu altdizilerdir.

Çözüm:Adım1 Altproblem P j : a 1,a 2,...a j dizisini istenen biçimde ve en az sayıda altdizilere ayırma problemi olsun. Ana problem P n : a 1,a 2,...a n 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 P j dizisi daha az sayıda altdiziye ayrılmış olabilseydi, P n de daha az sayıda altdizye ayrılmış olurdu

Çözüm: Adım2 C[j] sayısı, P j 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, a k =a j }+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: P n : C[j] L[j] 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│ │ 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 a k ==a j 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 a i 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 n=O(n 2 ) dir.

Problem4: 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: 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 x 0, o 0, x 1,o 1,...x n-1,o n-1,x n dizisidir. Burada x 0,x 1,...x n sayıları verilen n+1 tane reel sayılar ve o 1,o 2,...o n-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 P i,j matris çarpım zinciri sorusuna benzer x i, o i, x i+1, o i+1,...x j-1,o j-1,x j dizisi için aynı parantezleme sorusunu çözmektir. Burada 0≤i≤j≤n dir. Yani Θ(n 2 ) tane alt problemimiz vardır.

Çözüm:Adım2 P i,j probleminin optimal değeri M[i,j] olsun. Optimal çözümde optimal parantezin k. değerden sonra yazılması gerektiğini farz edersek P i,j problemini çözmek P ik ve P k+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]o k M[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]o k M[k+1,j]│ i≤k<j} i<j olduğunda M[i,i]=x i 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 x 0,...x n sayıları, O dizisinde verilen o 0,o 1,...o k işlemleri olsun.

Algoritma ve işlem zamanı 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(n 3 ) tür.

Problem4: 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 P ij : sağ alt köşesi (i,j) de olan en büyük kare içinde bulunan 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:Adım3 ve işlem zamanı 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 θ(n 2 ) 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

Sınav sorusu

Çözüm