014 - Knapsack Analizi

advertisement
FIRAT ÜNİVERSİTESİ
TEKNOLOJİ FAKÜLTESİ
KONU : KNAPSACK PROBLEMİNİN ANALİZİ, NESNE TABANLI
PROGRAMLAMAYA GİRİŞ
DERLEYENLER:
Ahmet Can ÇAKIL
Ali Murat GARİPCAN
Özgür AYDIN
Şahin KARA
KONTROL : Prof. Dr. Asaf VAROL
Sırt Çantası Problemi (Knapsack Problem)
Sırt çantası problemi ( Knapsack Problem- SÇP)
tam sayılı programlamada en çok uğraşılan problemlerden
birisidir.
1950 yılından beri bu türde problemlerin artması
sonucu bilgisayar teknolojisi ile çözüm aranan ve çözüm
sürelerinin iyileştirmeye çalışılan problemdir.
Bilgisayar kullanımı ile birlikte karşılaşılan
problemlerin bir çoğu çözüme ulaşmıştır. Bu tip problemleri
incelersek en önemlisinin çözüm sürelerinde görülen
uzamalardır.
Torba problemi basitçe bir torbanın içerisine en fazla
eşyanın yerleştirilmesini hedefler. Problem hırsız örneğinden
daha iyi anlaşılabilir.
Buna göre bir hırsız çantasına ağırlıkça en az, pahaca en çok
eşyayı doldurmak ister.
Bu durumda her eşyanın ;
Pahası; pi
Ağırlığı; ai
Çantanın taşıyabileceği azamî kapasite; ci
olarak tanımlansın.
0-1 Torba problemi
Bu problem tipinde eşyalar ya tamamen alınır ya da
tamamen bırakılır. Alınacak olan eşyanın bir kısmını almak mümkün
değildir. Dolayısıyla bir eşyanın alınıp alınmamasını xi ile gösterecek
olursak problem aşağıdaki şekilde modellenebilir:
Bu modelde görüldüğü üzere, xi değeri, 0 veya 1
olabilmektedir.
0 olması durumunda i elemanından alınmıyor, 1 olduğunda ise i
elemanının tamamı alınıyor demektir.
Örnek:
ÜRÜN
AĞIRLIK
DEĞER
1.Saat
0,2 Kg
100 TL
2.Fotoğraf Makinası
0,5 Kg
300 TL
3.Kamera
0,7 Kg
700 TL
4.Cep Telefonu
0,3 Kg
500 TL
5.Anahtar
0,1 Kg
10 TL
Şimdi elimizdeki 1 Kg kapasiteli bir torbaya yukarıdaki
eşyaları en fazla para edecek şekilde yerleştirelim.
Bu durumda ci=1kg olarak tanımlamış oluyoruz.
Örnek Çözümler;
i = { 1,2,4} 100+300+500=900 TL
i = { 1,3,5} 100+700+10=810 TL
i = { 3,4}
700+500=1200 TL
Çözümde ise i = { 3,4} kümesi alınıyor.
Yani kamera ve cep telefonunu aldığımızda
1200 TL ile en pahalı ve torbamıza sığan
kümeyi almış oluyoruz.
Sınırlı Torba Problemi (Bounded Knapsack
Problem)
Bu problem tipinde ise her eşyadan
alınabilecek miktarda sınır vardır.
Bu problemin modeli aşağıda verilmiştir:
bi=Üründen alınabilecek maksimum miktar
Örnek:
ÜRÜN
KG FİYATI
MEVCUT
1.Elma
2 TL
100 Kg
2.Armut
5 TL
300 Kg
3.Kiraz
4 TL
700 Kg
3,5 TL
500 Kg
4.Portakal
Şeklinde verilen ürünlerden 10kg’lık bir
fileye en pahalı nasıl bir seçim yapılmalıdır sorusu
sorulabilir.
PYTHON PROGRAMLAMA DİLİ
Bu durumda her üründen değişik miktarlarda var.
Örneğin en fazla 4kg elma alabiliyoruz bu değer
modelimizdeki bi ile gösterilen ve bir üründen en fazla
alınabilen değerdir.
Toplamda en fazla alabileceğimiz değer ise hala ci‘dir.
Bu problem tipinde her üründen alınan miktar ise
değişmektedir ve bu miktar xi ile gösterilir.
Örneğin yukarıdaki problemin çözümünde
1kg portakal fileye konulacaksa, bu durumda
x4 = 1, b4 = 5 , p4 = 3.5 olarak alınmalıdır.
Nesne Tabanlı Programlama (NTP)
(Object Oriented Programming)
Temelde NTP belirli bir problemin çözüm adımlarını
parçalara bölerek bunları objeler haline dönüştürmektir. Buradaki
temel amaç ileriki zamanlarda aynı problem ile karşılaşıldığında bu
objelerin kullanılması.
Tabii çözümü bir bütün olarak değil de bir parçalar olarak ele
alındığından dolayı müdahalesi ve değişimi de daha hızlı olmaktadır.
Nesne Tabanlı Programlama dillerinden ;
Simula, Smalltalk, C++, Object Pascal, Objective-C, Eiffel, Python,
Java, C Sharp programlama dili, Visual Basic .NET ve REALbasic'i
sayabiliriz.
PYTHON PROGRAMLAMA DİLİ
Nesne Tabanlı Programlama
Örnek vermemiz gerekirse ;
Mesela bir araba üreticisinin yeni bir araba serisi
üretmek istediğini düşünün. Bu araba serisinin belirli
özellikleri olduğu gibi birbirinden farklı özellikleri de
olacaktır.
Yapılacak araba serisi: A10, A11, A12 diye
adlandırıldığını farz edelim.
Her üç araba serisi içinde klima, merkezi kilit, müzik
sistemi olacaktır. A11 serisinde ekstra olarak yol bilgisayarı,
yağmur sensörü olacaktır. A12 serisinde ise yol bilgisayarı,
yağmur sensörü, hava yastığı, sesli kontrol sistemi yer
alıyor.
Nesne Tabanlı Programlama
Her üç araba serisi içinde kullanılan ortak materyaller
klima, merkezi kilit, müzik sistemi, camlar, kapılar, farlar,
direksiyon, vb materyallerdir. Firma bu materyallerin tasarımı ve
üretimini bir sefer yapmaktadır. Ama aynı materyalleri üç farklı
araba serisinde kullanmaktadır.
NTP’daki ana mantık da budur. Problemimiz araba
yapmaktır, problemin çözümü için gerekli olan yol belirlenir. Daha
sonra bu çözüm yolu parçalara bölünür.
Bütün parçalar birer objedir. Ve objeler birleşimi problemin
çözümüdür.
Nesne Tabanlı Programlamanın Ortaya Çıkışı
ve Faydaları
NTP aslında bir mecburiyetten ortaya çıkmıştır. NTP nın en büyük
avantajı büyük çaplı projelerdeki zaman ve para kaybını önlemesidir.
1960 ların sonuna doğru programların git gide büyümesi ve
programlardaki değişikliklerin çok uzun zaman alması ve maliyetinin yüksek
olması ile ortaya çıkmış bir programlama yaklaşımıdır.
Prosedürel Programlama (sınıf yapısı olmadan) ile kodlanan
yazılımlardaki değişiklikler çok uzun zaman alır.
Mesela değiştirmek istediğiniz bir işlev için binlerce satır kod
arasına girip saatlerce belki günlerce uğraşmanız gerekmektedir. NTP da ise
bu mantık farklıdır. Değiştirmek istediğiniz işlevi sınıf yapısı içerisinde
değiştirip hemen güncelleyebilirsiniz. Bu hem kodların daha derli toplu
olmasını sağlar. Hem yapılacak olan değişiklikler için zaman kaybı olmaz ve
maliyeti düşürür. Ayrıca yazılan sınıf yapılarını tekrar tekrar kullanabilirsiniz.
Yani bir proje içerisinde yer alan sınıf yapısını farklı bir projede
Nesne Tabanlı Programlamanın Kullanımı
NTP kullanmadaki temel amaç iş gücünü düşürtmek ve aynı
işlemleri tekrar tekrar yapmamaktır. Diyelim ki sıklıkla kullandığınız bir
animasyonun temel işlevlerini bir sınıf haline dönüştürmek istiyorsunuz.
Böylece her seferinde aynı kodları yazmak zorunda kalmadan
sorununuzu çözmüş olursunuz.
Ancak sırf şaşalı olsun diye de her zaman sınıf yapılarını
kullanmak mantıklı değildir. Yani sadece bir sefer yapacağınız bir işlem
için oturup sınıflar yazmanızın bir anlamı yoktur. Çünkü işlemi sadece
bir sefer yapıyorsunuzdur.
Sonuç Olarak;
Nesne Yönelimli Programlama (Object Oriented
Programming) önce ne yapacağınıza karar veririsiniz sonra
bunları oluşturmaya başlarsınız.
Her bir parça ayrı ayrı sınıf (class) yapılarından oluşur.
Bu yapılara istediğiniz zaman müdahale edebilir istediğiniz
zaman değiştirebilirsiniz. Tabii bu yapıları farklı projeler için
kullanabilirsiniz.
Buradaki ana mantık bir sefer oluşturduğunuz sınıfı farklı
projelerde kullanabilmenizdir. Tabii zaman ve maliyette
düşmektedir.
KAYNAKLAR
MIT Üniversitesinin ders notları
http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/600-introduction-to-computer-science-and-programming-fall-2008/lecturevideos/

http://www.python.org/
http://www.cyberwarrior.org/FORum/display_topic_threads.asp?ForumID=124&TopicID=394
638&light=1&ThreadPage=1
http://www.istihza.com
Download