Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

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

Benzer bir sunumlar


... konulu sunumlar: "Dinamik programlama ve açgözlü yaklaşım soruları."— Sunum transkripti:

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

2 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.

3 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.

4 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

5 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

6 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

7 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.

8 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)

9 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.

10 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

11 (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.

12 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.

13 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

14 1

15 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

16 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.

17 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.

18 Çö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

19 Çö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.

20 Çö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

21 Çö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

22 Çö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.

23 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

24 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.

25 Çö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.

26 Çö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

27 Rekürens rekürensimiz aşağıdaki gibidir: M[i,j]=max{ M[i,k]o k M[k+1,j]│ i≤k

28 Çö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.

29 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.

30 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.

31 Çö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.

32 Çö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.

33 Çö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.

34 Çö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.

35 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.

36 Sınav sorusu

37 Çözüm

38

39 Sınav sorusu

40 Çözüm

41


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

Benzer bir sunumlar


Google Reklamları