Professional Documents
Culture Documents
ÖZET
Bu makalede, yapay zeka konusunun önemi anlatılmış ve zeki yazılımlar geliştirmenin yazılım mühendisliğindeki
yeri belirtilmiştir. Yeni yazılım geliştirme ortamlarından biri olan Java’nın avantajları üzerinde durulmuştur.
Java platformunun, yapay zeka içeren yazılımların geliştirilmesine etkileri incelenmiş ve örnek bir program
üzerinde değerlendirilerek sonuçlara ulaşılmıştır.
II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 1
SB-22
işletilebilmektedir. Bu, internet üzerinde
Yazılım geliştirme alanında, daha zeki yazılımlar işletilebilen program yazımını
geliştirmeye yönelik çalışmalar yapılmaktadır. Zeki kolaylaştırmakta ve kullanıcılarının sayısını
olmayan yazılımlar, kullanıcılarını gereksiz veya otomatik olarak artırıp ve tüm dünyaya
tekrarlı işleri yapmak durumunda bırakarak verim yaygınlaştırmaktadır.
kaybına yol açmaktadırlar. Sonuçta kalite düşmekte, • “Multithreaded” yani çok iş parçacıklı Java
zaman kaybı olmakta, kullanım zorlaşmakta yani programları, İnternet ve World Wide Web
etkinlik azalmaktadır. Kullanıcılar, aynı türde uygulamaları için aynı anda birden çok işlemin
yazılımların zeki olanlarını tercih etmektedirler. yapılmasını sağlayarak, belirli bir işin bitmesini
beklemekle sınırlı kalınmasını önlemektedir [5].
YAZILIM GELİŞTİRME ORTAMLARI ve
JAVA YAPAY ZEKA YAZILIMLARI GELİŞTİRME
Günümüzde yazılım geliştirme ortamları, Ağ, Web Yapay zeka dilleri olarak adlandırılan LISP, 1958
ve Grafik tabanlı, Mobil İletişim Cihazlarını yılında John McCarthy ve Prolog ise 1972 yılında
destekleyecek şekilde ilerlemeler göstermiştir. Web Philippe Roussel tarafından geliştirilmişlerdir.
ve mobil iletişimin yaygınlaşması ile kavramlarda Günümüze kadar güncel gelişmelere paralel
meydana gelen değişmeler sonucunda bu tür özellikleri destekleyebilecek şekilde sürümleri
işlemlere destek verecek şekilde Java ve .NET ortaya çıkmıştır. Veri tabanlarını desteklemekten,
platformları ortaya çıkmıştır. .NET dilleri ve Java, diğer dillerle entegrasyonuna, görselliğinden,
Pascal, C ve C++ gibi dillerin eksikliklerini de derleme hızının artırılmalarına kadar birçok
giderecek ve verimlerini artıracak şekilde çalışmalar yapılmıştır ve yapılmaya devam
tasarlanmışlardır. Bu çalışmada, 1995 yılında edilmektedir. Örnek olarak Prolog, Çıkarsama
geliştirilen Java programlama dilinin seçilmesindeki “reasoning” ve Geri İzleme “backtracking” gibi
en büyük neden platform bağımsızlığının daha ileri güçlü mekanizmaları doğrudan sunduğu için,
derecede olmasındandır. Aynı özellikler, C# (C karmaşık olmayan yapay zeka programları
Sharp) gibi daha yakın tarihte geliştirilen .NET yazılmasını, inanılmaz derecede kolaylaştırmaktadır.
üzerindeki diller için de geçerlidir. Bu mekanizmaları öğrenmek isteyen araştırmacılar
için de, çok uygun bir deneme ortamı sunmaktadır.
Java Programlama Dili ve Platformu, aşağıda
önemlileri sayılan özellikleri sayesinde yazılım Ancak buradaki problem, C, Java gibi popüler
geliştiricilere kolaylıklar sağlayıp avantajlar programlama dillerini öğrenmiş olan programcı ve
sunmaktadır : [1] yazılım geliştiricilerin, farklı yaklaşımlar ve
özellikler içeren dilleri öğrenme zorunluluğunda
• Nesneye yönelik bir dil olması nedeniyle, kalmasıdır. İleri özellikler içeren zeki yazılımların
gerçek dünyadaki nesneler, yazılım nesnelerine geliştirilmesinde, Prolog ve Lisp gibi dillerin
birebir eşlenebilmektedir. Yazılım tasarımını sınırlarının iyi öğrenilmesi gerekmektedir. Ancak
ve anlaşılırlığını kolaylaştırmaktadır. örnek olarak Java dilinde rahatlıkla Özyineleme
Değişiklikler yerel olarak yapılabildiğinden (recursion) mekanizmasını kurabilen bir kişi,
esnek programlar yazılabilmektedir. Prolog’da hazır kodları bile anlamakta
• 1995 gibi çok uzak olmayan bir tarihte zorlanabilmektedir.
geliştirildiği ve yeni sürümleri ile sürekli
güncellendiği için web ve grafik altyapısı ve ağ Java gibi dillerin avantajları burada ortaya
özellikleri güçlüdür. Bu nedenle, her tür çıkmaktadır. Java’yı öğrenmiş olan bir kişi, “Java
özelliği içeren yazılımlar geliştirilebilmektedir. Collections Framework” içindeki hazır veri
• Platform bağımsızlığı, dünyanın her yerindeki yapılarından yani sınıf, metot ve özelliklerden
değişik donanımlı bilgisayarlar ve değişik yararlanarak kolaylıkla verileri (yapay zekada
işletim sistemleri üzerinde kodların gerçekleri ve bilinenleri) temsil edebilmekte ve
çalıştırılabilmesini sağlamaktadır. Örnek olarak üzerlerinde çıkarsama gibi işlemler yapabilmektedir.
Windows işletim sistemi üzerinde yazılan bir Gerekiyorsa veritabanı bağlantıları da rahatlıkla
Java programı, Linux veya diğer işletim kurabilmektedir. Ayrıca dünyanın herhangi bir
sistemleri üzerinde işletilebilmektedir. Tüm yerinde hazırlanmış olan özelleşmiş ve hatalardan
bunlar, herhangi bir Java kodunun yeniden arındırılmış paketler kullanılarak daha ileri
kullanım özelliklerini artırmakta ve kodun her çalışmalar da gerçekleştirilebilmektedir.
platform için değiştirilme gereksinimini
ortadan kaldırmaktadır. ÇIKARSAMA İÇEREN BİR JAVA
• Yazılan java applet’leri yerel makinelere PROGRAMI GELİŞTİRME
yüklenerek, internet üzerinden
II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 2
SB-22
Yapay zeka programlarını normal programlardan Örneğimizde ileri besleme ve geri yayılım
ayıran özellikler; öğrenme, çıkarsama, karar verme “backpropagation” algoritması kullanarak
ve algılama gibi yeteneklere sahip olmalarıdır. Bu değerlendirme yapan 3 katmanlı bir ağ
yetenekleri programlara katabilmek için; geri izleme, bulunmaktadır (Şekil 2).
karar ağaçları, arama mekanizmaları gibi çeşitli Yapay Sinir Ağının gerçekleştiriminde Java’nın
teknikler kullanılmaktadır. nesne tabanlı bir dil olması, ortam nesnelerinin
program içinde birebir modellenebilmesini
Bu çalışmada, yapay zekanın başlangıç uygulaması sağlandığı için tasarımı ve programlamayı oldukça
denilebilecek XOR işlemi (Şekil 1), Java ile basitleştirmiş ve esnek hale getirmiştir. Model
gerçekleştirilmiştir. üzerinde görülen hücre, bağlantı, çekirdek, giriş ve
çıkış gibi yapıları kendimiz yeniden
gerçekleştirebileceğimiz gibi bu konuda uzun
X Y Z = X XOR Y
çalışmalar sonucunda oluşturulmuş ve denenmiş
0 0 0 hazır Sinir Ağı Kütüphanelerindeki mevcut sınıfları
kullanarak da yapay zeka uygulamamızı
0 1 1
geliştirebiliriz. Örneğimizde tümü java ile
1 0 1 gerçekleştirilmiş açık kaynak kodlu bir kütüphane ve
motoru olan JOONE (http://joone.sourceforge.net/)
1 1 0
[6] kullanılmıştır.
II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 3
SB-22
- org.joone.script : Script uygulamalarını output.addInputSynapse(synapse_HO);
sağlayan paket.
Sinir ağını yönetecek olan “monitor” sınıfının
XOR problemini çözümü için uygulanacak senaryo oluşturulması :
şu şekilde olacaktır.
1- Ağın konu üzerinde eğitilmesini Monitor monitor = new Monitor();
sağlayacak örnek verilerin ilgili monitor.setLearningRate(0.8);
kaynaktan okunması. monitor.setMomentum(0.3);
2- Ağa girilen veriler öğrenme
algoritmasından geçirilerek (training) “Monitör” ile katmanlar arasındaki ilişkinin
ağın problem deseni üzerinde, yeni kurulması :
veriler için çıkarsama yaparak karar
vermesinin sağlanması. input.setMonitor(monitor);
3- Eğitim verilerinden sonra test verileri hidden.setMonitor(monitor);
ile sinir ağı sisteminin çalışmasının test output.setMonitor(monitor);
edilmesi.
Uygulamanın, “monitor” nesnesinden gelen
1. adım için örnek XOR girdileri ve çıktılarını içeren mesajları yakalayabilmesi için “monitor” nesnesinin
“;” işareti ile ayrılmış şekilde bir girdi dosyası Listener’ının eklenmesi :
oluşturulmuştur. Örnek veriler ;
monitor.addNeuralNetListener(this);
• 0.0;0.0;0.0
• 0.0;1.0;1.0 Sinir ağının ana elemanlarının kodlamasının
• 1.0;0.0;1.0 gerçekleştiriminden sonra, girdi bilgilerinin
• 1.0;1.0;0.0 dosyadan okunması ve bunları girdi hücrelerine
bağlanmasını sağlayan bölüm :
“Joone” paketi içerisindeki sınıflar yardımıyla ağ
üzerindeki katmanların oluşturulması (Katmanlar FileInputSynapse inputStream = new
arasındaki iletişim “Sigmoid” aktarım yöntemi ile FileInputSynapse();
olacağından SigmoidLayer sınıfı kullanılmaktadır) : /* Örnek eğitim dosyamiz içerisindeki ilk iki
kolonda giriş bilgileri bulunuyor.*/
SigmoidLayer input = new SigmoidLayer(); // Giriş katmanı inputStream.setFirstCol(1);
SigmoidLayer hidden = new SigmoidLayer(); // Saklı katman inputStream.setLastCol(2);
SigmoidLayer output = new SygmoidLayer(); // Çıkış katmanı inputStream.setFileName("c:\\joone\\XOR.txt");
/* Dosya yerini ve ismini belirliyoruz.*/
Katmanlardaki sinir hücresi sayılarının belirlenmesi:
input.setRows(2); // XOR problemi için iki giriş verisi var
hidden.setRows(3); // saklı katmanda 3 adet sinir hucresi Oluşturulan “inputStream’in”, girdi hücrelerinin
oluşturuluyor bulunduğu katmana atanması :
output.setRows(1); // Çıkış değeri tek sayı olduğundan tek sinir
hücresi ekleniyor input.addInputSynapse(inputStream);
Katmanlar arası bağlantılar için, 3 katman arasına
tam bağlantı sağlayan 2 tane FullSynapse Girdi bilgilerinin alınmasından sonra, sinir ağında
kullanılmaktadır : öğrenme işleminin yapılması (Girdi bilgileri bir
eğitmen sınıftan geçirilerek, girdiler ve çıktılar
FullSynapse synapse_IH = new FullSynapse(); /* arasında beklenen çıktı ile karşılaştırılmaktadır) :
Input -> Hidden bağlantısı. */
FullSynapse synapse_HO = new FullSynapse(); /* TeachingSynapse trainer = new
Hidden -> Output bağlantısı*/ TeachingSynapse();
/* Örnek girdiler sonucu oluşması beklenen çıktı
Girdi ve saklı katman arası ilişkinin kurulması : bilgisini eğitmen sınıfa belirtiyoruz.*/
FileInputSynapse samples = new
input.addOutputSynapse(synapse_IH); FileInputSynapse();
hidden.addInputSynapse(synapse_IH); samples.setFileName("c:\\joone\\XOR.txt");
trainer.setDesired(samples);
Saklı katman ve çıktı katmanı arası ilişkinin /* Çıktı bilgisi örnekleri içeren dosyadaki 3.
kurulması : kolonda yeralmaktaydı.*/
samples.setFirstCol(3);
hidden.addOutputSynapse(synapse_HO); samples.setLastCol(3);
II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 4
SB-22
/* Eğitmen ve monitor objesi arasindaki ilişkiyi metodu” 1 dongu sayısı ile çağırılmaktadır ve bu
sağlıyoruz.*/ sefer sinir ağının örnek bir girdi deseni için ağ
trainer.setMonitor(monitor); üzerindeki öğrenilmiş bilgilere göre elde edilen bir
çıktı bilgisi çıktı dosyasına yazılmaktadır.
Çıktı katmanı ile eğitmenin ilişkisinin sağlanması:
output.addOutputSynapse(trainer); SONUÇLAR
Girdi, saklı, çıktı katmanlarının ve eğitmenin Bu çalışmada, java “Joone” paketi ile yapay sinir ağı
çalıştırılması : gerçekleştiriminde, temel elemanların nasıl
oluşturulduğu ve bunlar arasındaki ilişkilerin nasıl
input.start(); sağlandığı gösterilmektedir. Hazır “Joone” yapay
hidden.start(); sinir ağları kütüphanesi sayesinde, öğrenme,
output.start(); çıkarsama ve etkinlikte bulunma işlemlerinde
trainer.start(); kullanılması gereken geri besleme mekanizmaları,
karar ağaçları, arama algoritmaları gibi ayrıntılarla
Sinir ağının diğer parametrelerinin belirlenip ilgilenmeden yapay zeka uygulamaları
çalıştırılması : geliştirilebilmektedir. Açık kaynak kodlu
“org.joone.engine” paketi içerisindeki ilgili sınıfların
monitor.setPatterns(4); /* # girdi dosyasi deseni. incelenmesi ile temel yapay zeka mekanizmalarının
Kolon sayisi.*/ öğrenilmesi ve paketin geliştirilmesi de olasıdır.
monitor.setTotCicles(20000); /* Girdi Görüldüğü gibi, yapay zeka dillerini bilmeyen ve
dosyalarindaki bilgi ile Sinir ağının üzerinde zeki yazılımlar geliştirmek isteyen kişilerin, yapay
yapılacak eğitim sayısı.*/ zeka dillerini kullanmaları zorunlu değildir. Java
monitor.setLearning(true); /* Sinir ağının eğitim gibi programlama dilleri içerisinden de hazır
modunda olduğunun belirlenmesi.*/ paketler yardımıyla, hazır veri yapıları
monitor.Go(); /* Sinir ağının çalışmaya kullanılabilmekte, arama ve çıkarsama
başlaması.*/ yapılabilmektedir. Paketlerin kullanımının
öğrenilebilmesi için Java altyapısının iyi düzeyde
“Monitor” nesnesinin çalışarak sinir ağına girdi olması yeterlidir.
bilgileri girip “20000 döngü ile” eğitiminden sonra
örnek girdi deseni için alınabilecek örnek bir çıktı, Prolog ve LISP gibi yapay zeka dillerinin
şu şekilde olacaktır : öğrenilmesi de yapay zeka mekanizmalarının
anlaşılması bakımından oldukça önemlidir. Bu diller
0.02592995527027603 de, donanım ve yazılım dünyasındaki gelişmelere
0.9664584492704527 paralel olarak, yeni sürümleri ile
0.9648193164739925 güncellenmektedirler. Java gibi diller ile güçlü
0.03994103766843536 yapay zeka dillerinin karşılıklı olarak birbirine
benzer hale getirilmesi, zeki yazılımlar geliştirme
Sinir ağının, girdileri alacağı dosyayı ve sonuç yönündeki eksikliklerin kapanmasını sağlayacaktır.
bilgilerini yazacağı dosyayı belirtebileceğimiz, sinir Böylece zeki yazılımların kullanım oranı ve
ağını eğitip, çalıştırmayı sağlayabileceğimiz bir yazılımlardaki verim artacaktır.
arayüzün ekran görüntüsü Şekil 3’te verilmektedir.
LİTERATÜR LİSTESİ
II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 5
SB-22
[5] Tarau, P., 1999, Jinni: Intelligent Mobile
Agent Programming at the Intersection of
Java and Prolog. Proceedings of PAAM'99,
London.
[6] http://www.jooneworld.com
II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 6