Algoritmalar II Ders 7 Açgözlü Algoritmalar
Greedy Algorithms
Para Bozdurma Sorusu
Soru N lira para ve her birinden yeterli miktarda x1, x2,…,xk birimlik bozuk paralar veriliyor. N ve x1, x2,…xk sayıları pozitif tam sayılardır. Amacımız N lira parayı toplam bozuk para sayısı en az olacak biçimde bozdurmaktır.
Sorunun matematiksel ifadesi Yani öyle a1, a2,…ak negatif olmayan tam sayılarını bulmak gerekir ki N=a1.x1+a2.x2+…ak.xk ve a1+a2+…ak toplamı en az olsun.
Açgözlü Algoritma? Bu soruyu çözmek için açgözlü (greedy) algoritma uygulanabilir mi? Yani önce S={x1, x2,…xk} kümesinin mümkün olabilecek en büyük elemanını mümkün olabilecek sayıda kullanırız. Sonra da N in artan kısmına aynı algoritmayı tekrar tekrar uygularız.
Açgözlü Algoritma? S={x1, x2,…xk}={1, 4, 5, 10} ve N=8 olursa Açgözlü algoritmaya göre önce 5, sonra 3 tane 1 alınır, yani N=5+1+1+1 bulunur. Bu durumda 4 bozuk para bulunur. Oysaki N=4+4 optimal çözümdür, yani 2 bozuk para ile 8 lirayı bozabiliriz. Yani Açgözlü algoritma çalışmaz
Dinamik programlama 1. adım. Optimal çözümün yapısını karakterize etme N=a1.x1+a2.x2+…an.xn+…ak.xk olsun. Bu çözümü her hangi bir bozuk paraya göre iki parçaya ayırdığımızda, örneğin, b=a1.x1+…an.xn ve diğer parça da N-b olduğunda b lira paranın bozuk paralara optimal ayrılışı b=a1.x1+…an.xn olacaktır. Aynısı N-b için de geçerlidir.
ispat b nin bozuk paralara ayrılışı daha az sayıda bozuk para ile mümkün olsaydı N=b+N-b sayısının da bozuk paralara ayrılışı daha az sayıda bozuk para ile yapılabilirdi, bu ise N=a1.x1+a2.x2+…ak.xk ayrılışının optimal olması ile çelişmektedir
Optimal çözümün değeri için formül 2. adım. Optimal Çözümün değeri için özyinelemeli (rekursive) formül bulunması C[p] ile p lira paranın optimal bozulması için gerekli olan bozuk para sayısını işaret edelim. xi<=p koşuluna uyan ve p lira paranın optimal bozulmasında kullanılan ilk bozuk para birimi xi olsun.
Optimal çözümün değeri için formül 1. adıma göre p-xi lira para da optimal bozulmuş olur. Yani C[p]=1+C[p-xi] olur. Biz xi nin kaç olduğunu bilmiyoruz ama k tane i için tüm durumlara bakabiliriz. C[p]= 0, eğer p=0 ise, min {1+C[p-xi] }, eğer p>0 ise 1<=i<=k xi<=p
Optimal Çözümün değerinin hesaplanması 3. adım. Optimal Çözümün değerlerini aşağıdan yukarıya doğru hesaplayabiliriz. Aşağıdaki sözde kodda x bozuk para birimleri dizisini, k bu dizinin eleman sayısını, n ise bozulması gereken para değerini göstermektedir
Sözde Kod Change(x, k, n) 1 C[0] ← 0 2 for p ← 1 to n 3 min ← ∞ 4 for i ← 1 to k 5 if x[i] <= p then 6 if 1 + C[p − x[i]] < min then 7 min ← 1 + C[p − x[i]] 8 coin ← i 9 C[p] ← min 10 S[p] ← coin 11 return C and S
Hesaplanan değerlerden optimal çözümün oluşturulması 4. adım Make-Change(S, x, n) 1 while n > 0 2 Print S[n] 3 n ← n − x[S[n]]