Sunuyu indir
Sunum yükleniyor. Lütfen bekleyiniz
YayınlayanSelim Keleş Değiştirilmiş 6 yıl önce
1
Algoritmalar II Ders 10 Dinamik Programlama ve Açgözlü Yaklaşım Soruları-2
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)
3
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.
4
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
5
(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.
6
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.
7
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
8
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))}
9
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
10
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.
11
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.
12
Çö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
13
Çö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.
14
Çözüm:Adım2 devam Soruda verilen örnek üzerinde gösterelim.
j: Pn : 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
15
Çö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
16
Çö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 n=O(n2) dir.
17
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
18
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.
19
Çö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.
20
Çö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.
21
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.
22
Çö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.
23
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.
24
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.
25
Çö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.
26
Çö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.
27
Çö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.
28
ÇÖ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.
29
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.
30
Sınav sorusu
31
Çözüm
32
Çözüm
33
Sınav sorusu
34
Çözüm
35
Çözüm
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.