Bir İşlem

Şu adreste karşılaştığım Bir İşlem yarışmasının genetik programlama ile çözümü yazısı sayesinde şimdiye kadar yazdığım genetik algoritma yazılarına örnek bir java projesi yapabileceğimi farkettim. Bir kaç haftadır üzerinde az az uğraştığım projeyi tamamladım. Bu yazıyı yaptığım projeyi anlatmak için yazmaya karar verdim. Sonunda eksikliğini farkettiğim Java Genetik Programlama örneğini yapmış olacağım.

Gelelim projeye,

Bir İşlem yarışması TRT'de bir ara yayınlanan Bir Kelime Bir İşlem yarışmasındaki işlem sorularını çözmeye yönelik bir proje. Yarışmadan hatırlayacağınız gibi 1-10 arasında 5 sayı ve 10,25,50,75 veya 100 sayılarından biri (toplam 6 sayı) verilerek bir hedef sayıya sadece 4 işlem kullanarak ulaşmaya çalışıyoruz.

Örnek: Hedef sayı 200, Hesaplamada kullanılacak sayılar : 1 3 4 8 10 100
Çözüm: 8/4 = 2, 2*100 = 200
(evet çok kolay bir örnek oldu ama amacı anladınız :D )

Projede kullanıcılar bu sayıları rastgele üreterek genetik hesaplamayı başlatıp en yakın çözümü bulmaya çalışabilirler, bunu resimlerle gösterelim:

Başlangıç Ekranı:

Hesaplama yapılmış bir örnek (Aşağıdaki java çıktıları incelenerek hangi nesilde sonuca ulaşıldığı görülebilir):
Programın kullanımı oldukça kolay. Rastgele sayı üretebilirsiniz veya elinizdeki girdileri uygun olarak girebilirsiniz. Biçimli metin alanı kullandığım için basamak sayısını uygun şekilde girmeniz gerekiyor. Yazdıklarınız silinebiliyor.

Proje ile ilgili önemli ayrıntılar:
Genetik algoritmanın başarımını (performans) arttırmak için aşağıdaki sezgi diyebileceğim özellikler gerçekleştirildi, kaynak kodlarda gözünüze çarpabilir:
- Hesaplama sayılarının çarpımları eğer hedef sayıdan küçük ise hedef sayıya asla ulaşamayız. Bu durumda hesaplama yapmaya gerek yok.
- Eğer hesaplama yapılırken hedef sayıya tüm operatörleri uygulamadan ulaşırsak hesaplamayı erken bitiriyoruz
- Bölmelerde tam sayı sonuç olmuyorsa o bireyi kötü birey olarak değerlendiriyoruz.

Projedeki yorumların yapılan işi anlatmaya yeteceğini düşünüyorum. Burada ayrıca anlatmaya gerek yok. Bu sitedeki genetik algoritma yazılarını okuduysanız kodu incelediğiniz zaman yapılan işi de anlayacaksınız. Aşağıdaki bağlantılardan ilgili dosyaları indirerek inceleyebilirsiniz. Ayrıca yazdığım birim testleri de (junit) inceleyebilirsiniz. Testlerde neyi test etmeye çalıştığım sizin kendi testleriniz için de bir örnek oluşturacaktır.

Kaynak Kodlar

Güncelleme: Java kaynak kodları ve çalıştırılabilir JAR dosyası JDK 1.5 ile uyumlu hale getirildi.

5 yorum:

M.Onur dedi ki...

Selam,

Emre Bey, programinizi çalistirirken su sekilde bir exception aldim:

java.lang.UnsupportedClassVersionError: Bad version number in .class file

'$java -version' çiktisi su sekilde
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build diablo-1.5.0-b01)
Java HotSpot(TM) Client VM (build diablo-1.5.0_07-b01, mixed mode)

Java API'sine baktiğimda sunu yaziyordu:
Thrown when the Java Virtual Machine attempts to read a class file and determines that the major and minor version numbers in the file are not supported.

Bu sebeple kaynak kodlari derlemek amaciyla Jad ile jar dosyasinin içindeki *.class dosyalarini decompile ettikten sonra programi FreeBSD altinda diablo jdk 1.5.0-7 ile derlemeye çalistim.

java.util.Arrays sinifinin copyOf() metodunun 5.0'in apisinda bulunmadiğini farkettim. Zannedersem Java SE 6 ile bu metod eklendi. -- javac'in verdiği hatalardan yola çikarak.

Bu programi geriye uyumlu yapabilir misiniz?

Tahir Emre KALAYCI dedi ki...

Merhaba,

Kodu inceledim ve belirttiğiniz şekilde Java 6'ya özgü olan copyOf metodu yerine kendi yazdığım bir metodu kullanarak Java 5 uyumlu hale getirdim. Yeni kodu ve JAR dosyasını sorunsuz bir şekilde çalıştırabilmeniz lazım. Umarım bu şekliyle program işinize yarar.

(Aslında jad ile decompile etmek yerine kaynak kodları indirip inceleyebilirdiniz. İndirme bağlantısını ayrıca vermiştim.)

İyi çalışmalar.

M.Onur dedi ki...

IDE olarak, Eclipse kullanmadiğim için decompile etmek zorunda kaldim.

Özür dilerim.

Çabaniz ve yardiminiz için tesekkürler.

Iyi çalismalar.

Ahmet ÖZALP dedi ki...

Bu tür güzel bir örnekleme içim öncelikle tşk ederim.
fakat eclipce ile projeyi açamadım.
bir yol gösterir misiniz?
tşk ederim
saygılar
Ahmet ÖZALP

T. E. Kalaycı dedi ki...

Merhaba,

Kaynak kodu indirip, sıkıştırılmış dosyayı bir yere açtıktan sonra Eclipse menüsünden "File -> Import" seçip açılan pencerede "General -> Existing Projects into Workspace" seçeneğiyle proje olarak ekleyebilmeniz lazım. "root directory" olarak zipi açtığınız dizini seçerseniz "Import Projects" penceresinde ilgili proje "Projects" kısmında gözükecektir. Bir ihtimal proje eklendikten sonra "Project Properties" kısmında "Java Build Path -> Libraries" seçerek "JRE System Library" eklemek gerekebilir.