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