Sayfalar

Perşembe, Aralık 07, 2006

Genetik Programlamayla Bir işlem



Yine bir yapay zeka projesiyle karşınızadayız !

Bu sefer YSA değil genetik programlama metoduyla birşeyler yapya çalışacağız.

Ya bu genetik Programlamada nedir yahu ? diyenleriniz için linke müracat ediniz.
Link!

Daha yokmu diyen için google emrinize amade sizi bekliyor
Her neyse Biz uygulamamıza dönelim

Bir Kelime Bir İşlem yarışmasını bilmeyeniniz yoktur herhalde Biz Bir işlem kısmını yapmaya çalışacağız - Bir Kelime kısmınıda siz yaparsınız artık :) -

Problemi analiz edersek :
3 Basamaklı bir sayıya 6 adet sayı ile ulaşmaya çalışılır

Elimizde 6 adet sayı var ve sadece bir kere kullanabiliyoruz.
işlem 4 işlem yapılabiliyor fakat her sayıyı kullanmak zorunda da değiliz
Problemin bütün çözümleri için
sayı Num
işlem Op

Num1 Op1 Num2 Op2 Num3 Op3 Num4 Op4 Num5 Op5 Num6

sayıların kullanılacağı sıralama = 6 * 5 * 4 * 3 * 2 * 1 =6! = 720 ihtimal
her iki sayı arasında 4 işlem yada kullanılmama olmak üzere 5 ihtimal 6 sayı için 5 kere
5*5*5*5*5=5^5= 3125 ihtimal

Toplam = 720 *3125 = 62500 değişik sıralama oluyor.
Pek tabi Problemin pek çok çözümüde olabilir. Tam Çözümü olmayada bilir

Gelelim çözüme öncelikle bize bir Genetik Programlama kütüphanesi lazım
-tabii tekerleği yeniden icad edip debelenip durmak ta bir tercih olabilir biz kolay yoldan gidiyoruz -
İhtiyacınıza göre kütüphane bulmak için size freshmeat'i önerebilirim

Efendim biz bukonuda FGA -Fast Genetic Algorithm - kullanacğız
FGA sadece tek bir başlık dosyasından -fga.h- oluşan kullanımı kolay template library.
Paralel çalışa bilmek için POSIX thread kullanılmış yani windows altında bizim pthreads-win32 indirip kurmamız lazım zahmet edip aramayın indirin pthreads-win32 açın ve derleyiciniz için uygun olan library ve dll dosyalarını gereken kısımlara ekleyin

FGA ve pthreads-win32 indirip kurduktan sonra Kodumuzu yazmaya başlaya biliriz

Problemin kodlanması için veri yapımızı oluşturuyoruz

typedef struct {
int Num[6]; // sayılar
int Op[5]; // işlemler
}PData ;


sonra bu veri yapısıyla işlem yapacak GP için gereken fonksiyonlarımızı yazıyoruz

my_fitness // uygunluk yada sağlık değeri
my_random_chromosome // rasgele varyasyon üret
my_mutate_chromosome // değişme uğrat
my_crossover // Çaprazlama yap

Ooo yazı epey uzamış. kim okur bukadar yazıyı ? Daha fazla uzatmayayım en iyisi inirip inceleyin. Soracağınız bir şey olursa biz de bilebilirsek eğer cevaplamaya gayret ederiz

Download : GHedef yada daha kolay GHedef

* Kullanıcı Ara birimi pek tabii ki FLUID ile FLTK kullanılarak yazıldı. IDE olarak CodeBlock kullanıldı
** www.biliyormusun.net de bugünkü (08/12/2006) Bir işlem kısmındaki günün sorusunun çözümü

9*75 = 675
675-7= 668
668-9=659
659+10=669

9 yorum:

Melih Birim dedi ki...

gerçekten güzel bir çalışm olmuş. Kaç senedir bilgisayarla uğraşıyorsunuz merak ettim. ilk yazılardan Fortran, Basic kokuyor buram buram...

birol kuyumcu dedi ki...

ihtiyarlık işte kaç sene geçti hatırlamıyorum ;)
Programlamaya Basicle başladım - GW daha sonra Quick - sonra Okul yüzünden mecburen Fortran 77
Fakat hiç birini uzun boylu kullanmadım C daha sonra C++ o koku anlattığım anılarımdandır

timucin dedi ki...

öncelikle tebrik ederim,ardından hayret ederim :).hakkaten çok şaşırdım .gerçekten çok hızlı çalışıyor.genetik programlama hakkkında bi bilgim yoktu verdiğin linkten öğrendiğim kadarıyla bile şaşkınlığım daha da arttı.Bu, bizim bu dönem c++ da proje ödevimiz ve biz klasik yöntemlerle yapmaya çalıştık recursive falan kullanarak ama bizimkiler çok yavaş hatta ölü döngüye bile giriyor.zamanın varsa ve zahmet olmazsa programı biraz daha açıklayabilirmisin yorum satırlarıyla.bir de eğer mümkünse sadece console application olarak çalışacak kodlar varmı elinde yada çıkrabilir misin şimdiden teşekkür ederim...

birol kuyumcu dedi ki...

yazıda yeterince açıklama var
cb_Solve fonksiyonu çözümün yapıldığı kısım bu ve yazıda da belirttiğim gibi my_fitness, my_random_chromosome,
my_mutate_chromosome,my_crossover
fonksiyonları probleme uygun şekilde
kromozomlarla işlem yapıyor
consol uygulaması haline kolayca çevrilebilir yani

kolay gelsin

Unknown dedi ki...

Merhaba,

Projenizi inceledik ve çok beğendik,sizi tebrik ederiz,yalnız bir sorumuz olacaktı.
Bu projeyi hangi programı kullanarak yazdınız,.net ortamında denedim ama projeyi acamadım sadece exe'sini görebildim.

Bu konuda bilgilendirirseniz sevinirim...

Saygılarımla...

Okan Akyüz dedi ki...

biraz değişiklik yaptım itoi benim linuxumde çalışmayan satırlar.. Ama kodu hala tam inceleyemedim.. Yarın işte inşallah..

birol kuyumcu dedi ki...

atoi
itoa
ikiside standart fonksiyon
problem çıkarmaz

Unknown dedi ki...

Linklerde sorun var. Rica etsem yeniler misiniz?

birol kuyumcu dedi ki...

blog un faq sayfasındaki 5. soru ve cevabı okuyunuz