KNAPSACK PAKET PROGRAMI

 

Urfat G. NURİYEV[1], Pınar DÜNDAR[2], Osman ŞEN[3]

 

 

ÖZET.

        Ekonomide ve teknik sistemlerdeki birçok karar (verme) problemleri Knapsack tipli problemler şeklinde gösterilebilir. MS Windows ortamında Delphi 4.0 ve OOP teknikleri kullanılarak bu türlü problemlerin çözümü için daha önce önermiş olduğumuz birkaç algoritmaları içeren KnapsacK Paket Programı hazırlanmıştır.

       Bu makalede KnapsacK Paket Programının imkanları ve fonksiyonları verilmiş ve kullanımı anlatılmıştır. Paket başka algoritmalar da eklenerek genişletilmeye açıktır.

       Yapılan hesaplama denemeleri önerilmiş algoritmaların verimliliğinin yüksek olduğunu göstermektedir. Makalede KnapsacK paket programı ile yapılan performans testlerinin sonuçları da verilmiştir.

 

1.Giriş

 

Ekonomik ve teknik sistemlerdeki birçok karar verme problemleri Knapsack tipli problemler şeklinde gösterilebilir [1]. Dolayısıyla Knapsack probleminin çözüm yöntemlerinin geliştirilmesi ve bunlar için efektif program sistemaları oluşturulması pratik açıdan büyük önem taşımaktadır.

Bu problem matematiksel olarak aşağıdaki gibi formalize edilir [2] :

I={1,2,...,m}  ve J={1,2,...,n}  olmak üzere, bi , cj  pozitif tam sayıları ve negatif olmayan aij, iÎI , jÎJ sayıları verilmiştir.

                             (1)

bulunması istenmektedir.

Problem çeşitli açılardan incelenmiş ve çeşitli yönlerde genelleştirilmiştir. Sürekli olarak problemin yeni uygulama alanları ve yeni anlamlı yorumları ortaya çıkmaktadır. Bunun en yaygın yorumu aşağıdaki gibi verilebilir [3].

P1, P2,...,Pn  gibi n tane proje ve her Pj  projesinden beklenilen kazanç  cj , bu projenin gerçekleşmesi durumunda Ki  kaynağına olan ihtiyacı aij , ayrılmış olan Ki kaynağının kapasitesi  bi  ile verilmiştir.

                   xj=     

olmak üzere xj  (jÎJ) değişkenleri alınarak (1) problemi elde edilir.

Bu problem, verilen kaynak hacmini arttırmamak koşuluyla, toplam gelir maksimal olacak  şekilde, verilen projeler kümesinden bir altküme seçilmesi olarak yorumlanabilir.[UN1] [UN1]

Knapsack problemi özellikle ekonomi alanında rastlanan bir tamsayı problemidir. Uygulamada karşılaşılan problemler yüzlerce sınırlayıcı koşuldan ve binlerce karar değişkeninden oluşmaktadır. Bu husus büyük boyutlu problemleri çözmek için yeni yöntemler ve efektif paket programlar kullanımını gerektirmektedir.

KnapsacK çok sayıda kısıt ve değişkenden oluşan Kapsack modelinin çözümü amacıyla geliştirilmiştir.

 

 

2.      Problemin Çözüm Yöntemleri Üzerine

 

Bu problemin çözümü için bir çok algoritma geliştirilmiştir[1]. İlk zamanlar dal - buda tekniği kullanılarak problemin çözümüne gidilmiştir. Ancak büyük sayıda girdilerde bu algoritmanın efektif olmadığı  görülmüştür. Problemin NP-tam sınıftan olduğu bilindikten sonra yaklaşık yöntemlere ağırlık verilmiştir. Fakat Knapsack probleminin mutlak yaklaşım çözümü de NP-tam sınıftandır [4]. Bundan dolayı tam çözüme yakın çözüm veren olasılıklı yaklaşım algoritmaları kullanılır. Böyle çözümlere suboptimal çözüm denir [5]. Suboptimal çözüm genellikle heuristik yöntemlerle yapılır [6].

Bu yöntemlerin kalitesi, problemin özelliğinin göz önüne alınma derecesiyle, problemin tam formalize edilmesi ile belirlenen mümkün çözümlerinin gerçek pekiştirme kurallarının seçilme prensibine bağlılık derecesi ile ilişkilidir [7] .

           [2] makalesinde çok boyutlu Boole değişkenli Knapsack Problemini çözmek  için yukarıdaki  prensiplere dayanan “sert kısıtlama yöntemi” önerilmiştir. Önerilen sert kısıtlama yöntemi, geçerli bilgiye göre çözüm arama sürecinde değişebilen bir esnek tarama şeması tanımlama olanağı sağlamaktadır.

            [8] çalışmasında bu yöntem geliştirilerek kendi kendini düzenleyen bir algoritma  (AS) tasarlanmıştır, öyle ki, bu algoritma verilen problemin özelliklerine uyan bir taramayı da mümkün kılmaktadır.

            [9] çalışmasında ise  sert kısıtlama yöntemindeki katsayıları hesaplamak için duallık prensibine dayalı bir algoritma (AD) geliştirilmiştir.

           Yapılan hesaplama denemeleri önerilmiş algoritmaların verimliliğinin yüksek olduğunu göstermektedir. Knapsack paket programı bu algoritmaları içermektedir.

Makalede KnapsacK paket programı ile yapılan performans testlerinin sonuçları da verilmiştir.

 

 

3. Knapsack paket programı

 

3.1.  Program hakkında ön bilgi

 

Program sadece çok boyutlu Knapsack problemi için tasarlanmıştır. Buna yönelik olarak sadece AS ve AD algoritmalarını içermektedir. Program Delphi 4.0 ile OOP ( nesneye yönelik programlama ) teknikleri kullanılarak hazırlanmıştır. Dolayısıyla çok boyutlu Knapsack problemi için geliştirilmiş olan diğer algoritmaların eklenmesi de son derece kolaydır.

 

 

 

 

3.2.  Programın genel görünümü

 

Program girdi dosyaları üzerinden çalışmakta ve birden fazla girdi dosyasını aynı anda görüntüleyebilmektedir. Girdiler algoritmadan bağımsız olarak oluşturulmakta ve istenen algoritma ile sonuç elde edilebilmektedir. Çıktılar ise ortak bir pencerede verilmektedir.

 

 


Şekil 1. Programın ana penceresi

 

 

3. 3. Yeni girdi oluşturma

 

‘Dosya’ mönüsünden ‘Yeni’ seçeneği seçilerek yeni bir girdi oluşturulabilir. Oluşturulan yeni girdinin boyutları ‘m’ ve ‘n’ veri alanlarından değiştirilebilir. Boyutlar değiştirildiğinde  değer tablolarının boyutları da otomatik olarak değişecektir.

Probleme ait değerler tablolardan girilir. Oluşturulan örneğin daha sonra tekrar kullanılabilmesi için kaydedilmesi gerekir.

 

3.4. Girdinin kaydedilmesi

 

‘Dosya’ mönüsünden ‘Kaydet’ seçeneği seçilir.

Girdi yeni oluşturulmuş ise girdiye bir isim verilmesi için kaydetme diyaloğu gelecektir. Burada girdiye bir isim verilerek girdi belirtilen isim ile kaydedilir.Eğer girdi daha önceden oluşturulmuş ise eski girdi dosyası girdinin son hali ile güncellenir.

 

 

3.5. Girdinin farklı bir isim ile kaydedilmesi

 

Önceden oluşturulmuş bir girdiyi farklı bir isim ile kaydetmek için ‘Dosya’ mönüsünden ‘Farklı kaydet’ seçeneği seçilir. Gelecek olan kayıt diyalogunda girdiye yeni bir isim verilir ve girdi verilen isim ile kaydedilir.

 

 


 

Şekil 2. Farklı kaydet diyaloğu

 

3.6. Önceden oluşturulan girdilerin yüklenmesi

 

‘Dosya’ mönüsünden ‘Aç’ seçeneği seçilir. Ekrana gelen dosya açma diyaloğu kullanılarak istenen girdi dosyası seçilir. Seçilen girdi dosyasının içeriği oluşturulacak yeni bir girdi penceresinde görüntülenecektir.

 


 

Şekil 3. Dosya açma diyaloğu

3.7. Girdi penceresini kapatma

 

Kapatılmak istenen girdi dosyasına ait sekme seçilerek aktif hale getirilir. ‘Dosya’ mönüsünden Kapat’ seçeneği seçilerek istenen girdi dosyası kapatılmış olur. Eğer girdi üzerinde değişiklik yapılmış ise değişikliklerin kaydedilip kaydedilmeyeceğini soran bir mesaj penceresi gelecektir.

 

3.8.  Diğer seçenekler

 

‘Dosya’ mönüsünde ‘Hepsini kaydet’ ve ‘Hepsini kapat’ seçenekleri de bulunmaktadır.

‘Hepsini kaydet’ seçildiğinde üzerinde değişiklik yapılmış olan  bütün girdiler kaydedilir.

‘Hepsini kapat’ seçildiğinde açılık durumdaki bütün girdi pencereleri kapatılır. Üzerinde değişiklik yapılmış olan girdiler için uyarı pencereleri gelecektir.

 

3.9.  Algoritma seçimi ve problemin çözümü

 

Programda çözüm için kullanılabilecek iki adet algoritma vardır. Bunlar önceki bölümlerde anlatılan AS ve AD algoritmalarıdır.

Öncelikle çözümü araştırılan problemin girdisi aktif duruma getirilmelidir. Sonra istenen algoritma ‘Çözüm’ mönüsünden seçilmelidir. İterasyon tamamlandığında elde edilen çözüm ve çözüm ile ilgili bilgiler ‘Sonuçlar’ penceresinde görüntülenecektir.

Elde edilen çözüm ‘Kopyala/Yapıştır’ yöntemi ile istenen herhangi bir kelime işlemcisi ortamına taşınabilir.

 

 

4.  Hesaplama Denemesinin Sonuçları

 

Önerilen algoritmanın efektifliğini değerlendirmek için IBM PC(Pentium-166) bilgisayarında KnapsacK paket programı ile literatürden bilinen test problemlerle [5,10-12], hesaplama denemesi yapılmıştır.

            Hesaplama denemesinin sonuçlarını göstermek için aşağıdaki işaretlemeler kullanılmıştır:

m- problemdeki koşulların sayısı,

n- değişkenlerin sayısı,

F(a) - a algoritması ile alınmış çözüm için amaç fonksiyonunun değeri.

Fopt - verilmiş problem için amaç fonksiyonun optimal değeridir.

d={[Fopt-F(a)]/Fopt}.100=(1-F(a)/Fopt).100 nispi hatadır.

Tablo 1’de 7 problem için amaç fonksiyonlarının optimal, AS ve AD algoritmaları ile alınmış değerleri gösterilmiştir. Buradaki problemler ve onların optimal değerleri [10] makalesinden götürülmüştür.

 

Tablo 1. [10]’de verilmiş testlerle yapılmış hesaplama denemelerinin sonuçları

 

Prob. No

1

2

3

4

5

6

7

Mxn

10x6

10x10

10x15

10x20

10x28

5x39

5x50

F(AS)

3800

8319.3

4005

6110

12400

10584

16529

F(AD)

3800

8319.3

4005

6120

12400

10547

16529

F opt

3800

8706.1

4015

6120

12400

10618

16537

Tablo 2’de mxn=30x60 boyutlu iki test probleminin amaç fonksiyonlarının optimal ve farklı algoritmalarla alınmış değerleri gösterilmiştir. Bu problemler ve M1, M2, M3, M4 algoritmalarının bulduğu değerler [11] makalesinden alınmıştır.Optimal değer ise QSB3 paketi ile hesaplanmıştır.

 

 

Tablo 2. [11] ‘de verilmiş testlerle yapılmış hesaplama denemelerinin sonuçları

 

Test\Algo.

Fopt

F(AS)

F(AD)

F(M1)

F(M2)

F(M3)

F(M4)

Test 1

7770

7761

7761

7643

7700

7643

7700

Test 2

8722

8722

8709

8698

8687

8698

8685

 

 

 

Tablo 3’de 10 grup test problem için AS ve AD algoritmaları ile alınmış çözümlerin nispi hatası gösterilmiştir. Buradaki problemler [5] makalesinde verilmiş algoritma ile oluşturulmuştur. Bu zaman parametrelerin değerleri aşağıdaki gibi kabul edilmiştir :    L = 0,  R = 3,  Q = 1.33   ve   T = 1,2,..,10 ;  b değeri tabloda verilmiştir, bi = . Problemlerin optimal değeri ise QSB3 paketi ile hesaplanmıştır.

 

 

 

Tablo 3. [5]’de verilmiş algoritma ile alınmış testlerle yapılan hesaplama  

              denemelerinin sonuçları.

 

Alg.

b=0.5

b=0.6

b=0.7

b=0.8

m x n

AS

AD

AS

AD

AS

AD

AS

AD

10x10

2.34

2.12

0.62

0.51

1.48

1.36

0.94

0.84

10x15

0.57

0.61

1.09

0.94

0.75

0.62

0.76

0.68

10x20

1.60

1.24

1.26

1.15

0.43

0.38

1.12

1.02

10x25

0.84

0.46

0.62

0.54

0.80

0.66

0.59

0.46

10x30

1.12

0.89

0.67

0.48

0.32

0.28

0.17

0.24

20x10

0.52

0.62

2.35

1.87

1.64

1.42

0.00

0.16

20x15

2.31

1.81

0.82

0.76

0.06

0.12

0.94

0.84

20x20

2.23

1.96

1.07

0.98

1.02

0.88

0.29

0.35

20x25

1.17

1.22

0.39