Algoritmalar II Ders 6 Açgözlü Algoritmalar.

Slides:



Advertisements
Benzer bir sunumlar
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ
Advertisements

Ayrık Yapılar Algoritma Analizi.
MIT503 Veri Yapıları ve algoritmalar
KARAR TEORİSİ.
IT503 Veri Yapıları ve algoritmalar
MIT503 Veri Yapıları ve algoritmalar Algoritma Oluşturma – Açgözlü algoritmalar ve buluşsallar Y. Doç. Yuriy Mishchenko.
KÜMELER.
Problemi Çözme Adımları
İçerik Ön Tanımlar En Kısa Yol Problemi Yol, Cevrim(çember)
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ
MIT503 Veri Yapıları ve algoritmalar En önemli graf problemleri
Özyinelemeli(Recursive) Algoritma Tasarımı
İŞ SIRALAMA VE ÇİZELGELEME DERS 4
Enerji Sistemlerinde Yapay Arı Kolonisi (YAK) Algoritması Kullanarak Yük Akışı Optimizasyonu Nihat Pamuk.
En Küçük Yol Ağacı (Minimum Spanning Tree)
AKIŞ ŞEMASI Akış şeması belirli bir işin yapılabilmesi için, basit işlemlerle şema halinde gösterilmesidir. Kısaca algoritmanın şemalarla gösterilmesidir.
Bölüm 2 – Kontrol Yapıları
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ
AKIŞ ŞEMASI Akış şeması belirli bir işin yapılabilmesi için, basit işlemlerle şema halinde gösterilmesidir. Kısaca algoritmanın şemalarla gösterilmesidir.
YMT219: Veri Yapıları Ders Saatleri: Pazartesi 9:15-12, 17:30-20:15
Tamsayılı Programlama
Oyun Kuramına Giriş.
AĞIRLIK MERKEZİ (CENTROID)
DOĞRUSAL EŞİTSİZLİKLER
Algoritmalar ve Programlama I Ders 2: Akış Diyagramları
İŞLEMLERDE KOLAYLIKLAR, PROBLEM KURMA ve ÇÖZME
Veri Madenciliği Birliktelik Analizi: Temel Kavramlar ve Algoritmalar
Denklemeler içerdiği değişkenin sayısına ve kuvvetine göre sınıflandırılır. Aşağıdaki örneklere bakarsak; 2x+4=15I. Dereceden I Bilinmeyenli Denklem x.
Yapay Sinir Ağları (Artificial Neural Networks) Bir Yapay Sinir Ağı Tanımı (Alexander, Morton 1990) Yapay sinir ağı, basit işlemci ünitelerinden oluşmuş,
Greedy Algorithms.
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)
“Bilgi”’nin Gösterimi “Bilgi” İnsan veya Makina Yorumlama Öngörme Uygun yanıt verme Depolanmış enformasyon veya model Kurallar: (1) Benzer sınıflardan.
PROGRAMLAMA TEMELLERİ Burak UZUN Bilişim Teknolojileri Öğretmeni Burak UZUN.
0-1 Sırt Çantası Problemi
Algoritmalar II Ders 2 Dinamik Programlama Yöntemi.
Algoritmalar II Ders 5 Açgözlü Algoritmalar.
Programlamaya Giriş.
Algoritmalar II Ders 10 Dinamik Programlama ve Açgözlü Yaklaşım Soruları-2.
Algoritmalar II Ders 13 Çizgelerde tüm ikililer arasında en kısa yollar.
Algoritmalar II Ders 1: Alan zaman takası yöntemi.
Algoritmalar II Ders 7 Açgözlü Algoritmalar.
Algoritmalar II Ders 4 Dinamik Programlama Yöntemi.
Tamsayılı Doğrusal Programlama Algoritmaları
Geçen hafta ne yapmıştık
Algoritmalar II Ders 14 Çizgelerde tüm ikililer arasında en kısa yollar.
Maksimum akış.
Kümeleme ve Regresyon Problemleri için Kolektif Öğrenme
MAKSİMUM AKİŞ PROBLEMİ
Algoritmalar II Ders 17 İteratif İyileştirme Yöntemi.
İleri Algoritma Analizi
9. Ders Tüm ikililer arasında en kısa yollar
Algoritmalar II Ders 3 Dinamik Programlama Yöntemi.
VERİ TÜRLERİ.
İleri Algoritma Analizi
İleri Algoritma Analizi
Chapter 6 Dönüştür ve Yönet (Transform-and-Conquer)
Chapter 3 Brute Force Copyright © 2007 Pearson Addison-Wesley. All rights reserved.
Çizge Algoritmalari 4. ders.
Algoritmalar II Ders 9 Dinamik Programlama ve Açgözlü Yaklaşım Soruları.
Algoritmalar II Ders 3 Dinamik Programlama Yöntemi.
İleri Algoritma Analizi
Yüzde Problemleri Ve Çözümleri
Algoritmalar II Ders 2 Dinamik Programlama Yöntemi.
Algoritmalar II Ders 16 Prim algoritması.
Çizge Algoritmalari 10. Ders.
Bölüm 5 Azalt ve yönet (Decrease-and-Conquer)
10. Ders Floyd-Warshal algoritması
Sunum transkripti:

Algoritmalar II Ders 6 Açgözlü Algoritmalar

Greedy Algorithms

Sırt Çantası( Knapsack) Problemi Ünlü sırt çantası problemi: Hırsız bir müzeye giriyor. Her tarafta resimler, heykeller ve mücevherler var. Hırsızın çok iyi gözleri vardır, bakar bakmaz bu nesnelerin ne kadar para edeceklerini görüyor. Ayrıca ağırlıklarını da hesaplayabiliyor. Hırsızın belirli bir kapasitesi olan sadece bir çantası vardır. Bu hırsızın en çok para kazanabilmesi için hangi nesneleri seçmesi gerekir?

SIRT ÇANTASI PROBLEMİ n nesne var, ağırlıkları wi > 0 fiyatları pi > 0 çanta kapasitesi: M maksimize et 0  xi  1, 1  i  n

SIRT ÇANTASI PROBLEMİ ALGORİTMA: Açgözlü algotitma: Adım 1: pi/wi sayılarını artmayacak biçimde sırala Adım 2: Sıralı dizye göre çantanın alabileceği sıradaki nesneyi (veya sonuncu ise çantaya yerleşebilecek parçasını) çantaya koy. n = 3, M = 20, (p1, p2, p3) = (25, 24, 15) (w1, w2, w3) = (18, 15, 10) Sol: p1/w1 = 25/18 = 1.32 p2/w2 = 24/15 = 1.6 p3/w3 = 15/10 = 1.5 Optimal çözüm: x1 = 0, x2 = 1, x3 = 1/2 toplam kazanç = 24 + 7.5 = 31.5

0-1 sırt çantası problemi Sırt çantasının kapasitesi W ve S kümesi veriliyor (bu kümede n nesne vardır) Her i nesnesinin ağırlığı wi ve kazancı bi ( wi , bi ve W pozitif tam sayılardır) Problem: Hangi nesneleri seçelim ki kazanç en fazla olsun? Diğer problemden farkı: Nesneleri bölemiyoruz

0-1 Sırt çantası problemi: Ağırlık Değer wi bi Nesneler 2 3 Çanta Max ağırlık: W = 20 3 4 4 5 W = 20 5 8 9 10

Sırt çantası problemi 0-1 sırt çantası problemi: Hırsız n tane nesne arasından bazılarını seçmelidir, burada i. nesnenin değeri bi ve ağırlığı wi Çanta kapasitesi W Not: bi, wi, ve W tam sayılardır “0-1” anlamı: bir nesneyi ya bütün olarak alacak, ya da hiç alamayacak kesirli sırt çantası problemi: Hırsız nesnelerin bir parçasını da alabilir

0-1 Sırt çantası problemi

0-1 Sırt çantası problemi: brute-force yaklaşım Aklımıza gelen ilk algoritmayla çözersek: n nesne var, 2n durum Her durum için değerleri hesapla, koşulu sağlayanlar arasından toplam değeri en büyük olanı bul İşlem zamanı O(2n)

Sırt çantası problemi Kesirli problem açgözlü yaklaşımla yapılır Nasıl? 0-1 problemi ise açgözlü yaklaşımla yapılamaz Açgözlü: değer/ağırlık en fazla olanı al Örnek: 3 nesnenin ağırlıkları 10, 20, ve 30 kg, çanta kapasitesi 50 kg olsun Nesne değerleri 60, 100, 120 lira olsun. Açgözlü algoritmaya göre önce 1. sonra da 2. nesne alınacak, yani 160 lira kazanç olur. Oysa 2. ve 3. nesneleri alırsa 220 lira kazanır

Altproblemi tanımlamaya çalışalım: Açgözlü yaklaşım çalışmadı. Brute Force kötü. Daha iyisi var mı? Var, dinamik programlama yöntemi Sadece altproblemi dikkatli tanımlamak gerekir Altproblemi tanımlamaya çalışalım: Nesne numaraları 1..n olsun. Altproblem: Sk = {1, 2, .. k} numaralı nesneler arasından optimal olanları seç

Altproblemin tanımı Nesne numaraları 1..n olsun. Altproblem: Sk = {1, 2, .. k} numaralı nesneler arasından optimal olanları seç Bu altproblem tanımı doğru gibi ama. Soru şu: Asıl problem olan (Sn ) in çözümünü (Sk) cinsinden yazabilir miyiz? Ne yazık ki, hayır….

? wi bi S4 için çözüm S5 için çözümün altparçası değil!!! Altproblem tanımı w1 =2 b1 =3 w2 =3 b2 =4 w3 =4 b3 =5 w4 =5 b4 =8 Ağırlık Değer wi bi Nesne # ? 1 2 3 Max ağırlık: W = 20 S4 için: Toplam ağırlık: 14; Toplam kazanç: 20 S4 2 3 4 S5 3 4 5 4 5 8 5 9 10 w1 =2 b1 =3 w3 =4 b3 =5 w4 =5 b4 =8 w5 =9 b5 =10 S4 için çözüm S5 için çözümün altparçası değil!!! S5 için: Toplam ağırlık: 20 Toplam kazanç: 26

Altproblem tanımı (devamı) Görüldüğü gibi S4 için olan çözüm S5 için olan çözümün altparçası değil Bunun anlamı şudur: altproblemi iyi tanımlamadık ve başka bir tanıma gereksinim vardır! Yeni bir parametre dahil edelim: w<=W parametresi çantanın değişken kapasitesini göstermektedir. Bu parametreyi 0 dan W ya kadar artırarak B[k,w] yi hesaplayacağız.

Altproblem için özyinelemeli formül Anlamı şudur: ilk k tane nesneden oluşan Sk kümesinin kapasitesi w olan çanta için en iyi altkümesi 2 sinden biri olur: 1) Ya Sk-1 kümesinin kapasitesi w olan çanta için en iyi altkümesidir, 2) Ya da Sk-1 kümesinin kapasitesi w-wk olan çanta için en iyi altkümesine k nesnesinin eklenmişidir

Özyinelemeli formül Sk kümesinin kapasitesi w olan çanta için en iyi altkümesi, k. nesneyi içerebilir veya içermez 1. durum: wk>w ise k. nesne çözümün içinde olamaz, bu nesne kapasitesi w olan çantaya giremez. 2. durum: wk <=w ise k. nesne çözümde ola da bilir, olamaya da bilir, büyük olanı alırız

0-1 Sırt Çantası Algoritması for w = 0 to W B[0,w] = 0 for i = 0 to n B[i,0] = 0 for i=1 to n if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

brute-force algoritması İŞLEM ZAMANI for w = 0 to W B[0,w] = 0 for i = 1 to n O(W) n defa tekrar ediyor O(W) İşlem zamanı? O(n*W) brute-force algoritması O(2n)

W = 5 (maksimum kapasite) Elemanlar (ağırlık, değer): Örnek n = 4 (nesne sayısı) W = 5 (maksimum kapasite) Elemanlar (ağırlık, değer): (2,3), (3,4), (4,5), (5,6)

Örnek i 1 2 3 4 W 1 2 3 4 5 for w = 0 to W B[0,w] = 0

Örnek i 1 2 3 4 W 1 2 3 4 5 for i = 0 to n B[i,0] = 0

Örnek Nesneler: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=1 bi=3 wi=2 w=1 1 2 3 4 W i=1 bi=3 wi=2 w=1 w-wi =-1 1 2 3 4 5 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Items: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=1 bi=3 wi=2 w=2 1 2 3 4 W i=1 bi=3 wi=2 w=2 w-wi =0 1 2 3 3 4 5 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Items: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=1 bi=3 wi=2 w=3 1 2 3 4 W i=1 bi=3 wi=2 w=3 w-wi=1 1 2 3 3 3 4 5 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Items: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=1 bi=3 wi=2 w=4 1 2 3 4 W i=1 bi=3 wi=2 w=4 w-wi=2 1 2 3 3 3 4 3 5 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Items: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=1 bi=3 wi=2 w=5 1 2 3 4 W i=1 bi=3 wi=2 w=5 w-wi=2 1 2 3 3 3 4 3 5 3 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Nesneler: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=2 bi=4 wi=3 w=1 1 2 3 4 W i=2 bi=4 wi=3 w=1 w-wi=-2 1 2 3 3 3 4 3 5 3 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Nesneler: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=2 bi=4 wi=3 w=2 1 2 3 4 W i=2 bi=4 wi=3 w=2 w-wi=-1 1 2 3 3 3 3 4 3 5 3 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Nesneler: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=2 bi=4 wi=3 w=3 1 2 3 4 W i=2 bi=4 wi=3 w=3 w-wi=0 1 2 3 3 3 3 4 4 3 5 3 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Nesneler 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=2 bi=4 wi=3 w=4 1 2 3 4 W i=2 bi=4 wi=3 w=4 w-wi=1 1 2 3 3 3 3 4 4 3 4 5 3 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Nesneler 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=2 bi=4 wi=3 w=5 1 2 3 4 W i=2 bi=4 wi=3 w=5 w-wi=2 1 2 3 3 3 3 4 4 3 4 5 3 7 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Nesneler: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=3 bi=5 wi=4 1 2 3 4 W i=3 bi=5 wi=4 w=1..3 1 2 3 3 3 3 3 4 4 4 3 4 5 3 7 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Nesneler: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=3 bi=5 wi=4 w=4 1 2 3 4 W i=3 bi=5 wi=4 w=4 w- wi=0 1 2 3 3 3 3 3 4 4 4 3 4 5 5 3 7 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Nesneler: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=3 bi=5 wi=4 w=5 1 2 3 4 W i=3 bi=5 wi=4 w=5 w- wi=1 1 2 3 3 3 3 3 4 4 4 3 4 5 5 3 7 7 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Nesneler: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=3 bi=5 wi=4 1 2 3 4 W i=3 bi=5 wi=4 w=1..4 1 2 3 3 3 3 3 3 4 4 4 4 3 4 5 5 5 3 7 7 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w

Örnek Nesneler: 1: (2,3) 2: (3,4) 3: (4,5) 4: (5,6) i=3 bi=5 wi=4 w=5 1 2 3 4 W i=3 bi=5 wi=4 w=5 1 2 3 3 3 3 3 3 4 4 4 4 3 4 5 5 5 3 7 7 7 if wi <= w // item i can be part of the solution if bi + B[i-1,w-wi] > B[i-1,w] B[i,w] = bi + B[i-1,w- wi] else B[i,w] = B[i-1,w] else B[i,w] = B[i-1,w] // wi > w