Temmuz 2009 | Sayı : 4
      Genetik Algoritmalar Temmuz 2009 | Sayı : 4

Geçen sayıda bilgisayarların (veya daha genel anlamda, makinelerin) zekamızı taklit ederek, bize benzemeye  çalışarak, birçok alanda bu zamana kadar sadece bizim yapabildiğimiz işleri, yerimize geçip bizden daha iyi ve daha hızlı şekilde yaparak ve bu şekilde hayatımızı etki altına alıp bizi dolaylı şekilde de olsa yöneterek, gelecekte dünyamızı nasıl ele geçirmeye çalıştıklarını tartışmıştık. Bizim de bu sürecin içinde bulunduğumuzu belirterek dikkatleri çekmiştik! Peki şimdi, ne olacak? Tabii ki amacım sizleri böyle gerçekdışı bir tehlikeye karşı uyarmak değildi. Yapay Zeka konusuna derslerde gördüğümüzden farklı bir giriş yaparak, kafamızda ilginç soru işaretleri oluşturmaya çalışmıştım sadece!

Her neyse, “Bir makinenin bize benzemesi, bir yapay zekaya sahip olması” demiştik, o halde bu makinenin öncelikle bulunduğu ortamı algılama, ortam ile iletişime geçme, hareket etme, ortamdan bilgi alma, bu bilgileri işleme, içlerinden arama ve çıkarım yaparak yeni bilgiler türetme, öğrenme, planlama, karar verme gibi bazı temel işleri yapmak için hazır olması gerekiyor! Bu işler bize kolay gelebilir ama bir makine için bunların herbiri çözülmesi gereken başlı başına bir problem. Bu tür problemlerin çözümü için yıllardır çeşitli yöntemler geliştirilmektedir (insanlar tarafından, tabii). Bu yöntemlerin bir kısmı teorik olarak doğadan esinlenerek geliştirilmiş ve bu şekilde çok başarılı sonuçlar elde edilmiştir.

Doğa esinli hesaplama adı verilen bu yöntemler kümesi; evrimsel hesaplama, sürü zekası (sosyal zeka), sinirsel (neural) hesaplama, vs. gibi alt gruplara ayrılmakta ve özellikle arama, iyileştirme, karar verme ve öğrenme gibi temel yapay zeka problemlerinin çözümünde sıkça kullanılmaktadır. Özellikle geniş çaplı çözüm uzayına sahip problemlerde, geleneksel arama tekniklerinin yetersiz kaldığı durumlarda, sezgisel arama teknikleri devreye girmektedir. Bu tekniklerin geleneksel tekniklere karşı olan üstünlüğü, arama sırasında seçim yaparak ve işe yaramayan çözümlerden sakınarak, elde edilen sonuçları her aşamada iyileştirerek, kötü sonuçlar bulunması durumunda da arama yönünü değiştirerek ilerliyor olmalarıdır.

Charles Darwin’in çok tartışmalı evrim teorisinden esinlenerek geliştirilen evrimsel programlama teknikleri,  biyoloji derslerinden aşina olduğumuz birçok terimi kullanmaktadır. Örneğin; arama sırasında çözüm adayı olarak kullanılan her değişken/veri yapısı bir birey (kromozom), bu bireylerin tümü nüfus (popülasyon), program döngüsünde her adımdaki nüfusa ait bireyler de bir nesil (jenerasyon) şeklinde nitelendirilmektedir. Bunların yanısıra, programın başında kromozom olarak kullanılmak üzere seçilen veri yapısına göre, her kromozom, bu veri yapısı eğer bir tamsayı ise tamsayının ikillerini (bitlerini), dizi ise dizinin elemanlarını temsil eden genlerden oluşmaktadır. Biyolojide de olduğu gibi, bir bireyin genleri alacakları değerler ile bireyin genotipini, bireyin kendisi de bir fenotip temsil etmektedir. Yine teoriye bağlı olarak, “Güçlü olan hayatta kalır” kuralına göre her birey için hesaplanan eğilim (fitnes) yani hayata devam edebilmesi için bireyin uygunluk derecesi değerlerine göre her adımda yapılan birey seçme, seçilen bireylerden yeni bireyler üretmek için kullanılan eşleştirme ve kesiştirme/çaprazlama (cross-over) ve bireylere uygulanacak mutasyon işlemleri evrimsel programlarda tanımlanıp parametrelerinin belirlenmesi gereken diğer işlemlerdir. Bir evrimsel programlama tekniği olan Genetik Algoritmalar da bu yapıdadır.

Yukarıda bahsedilen fonksiyonların tanımlarına göre genetik algoritmaların değişik versiyonları bulunmakta ve üzerlerinde çalışılıp belirli problemlerin çözümünde daha iyi sonuçlar veren yeni versiyonlar türetilmektedir. Bu yüzden asıl önemli olan, bu fonksiyonların bir şekilde veya bir diğerinde tanımlanmış olması değil, çözülmesi gereken problemin algoritmaya aktarılma şeklidir. Bununla birlikte, çözmek istediğimiz problemin genetik algoritma kullanılarak çözülmesinin uygun olup olmadığı veya ne kadar uygun olduğu önceden tespit edilmesi gereken bir husustur. Örneğin; bir diziyi sıralamak için geleneksel dizi sıralama yöntemleri dururken genetik algoritma kullanmamız anlamsızdır! Yapacağımız bu tür bir seçim, zaman kaybının yanı sıra belirlediğimiz nesil sayısında istediğimiz sonucu bulamamamıza da yol açabilir. Bu yüzden, kullanmadan önce genetik algoritmaların nasıl çalıştığını bilmemiz şart.

Gerekli veri yapıları oluşturulduktan sonra ve ilgili parametreler belirlendikten sonra, basit bir genetik algoritma şöyle çalışır:

  1. Birinci nesilde yer alacak bireylere başlangıç değerleri atanır (atama işlemi değerler rastgele seçilerek veya parametrik şekilde yani bir yerden alınarak yapılır),
  2. Döngü kısmı: Belirlenen nesil sayısı tamamlanıncaya kadar ya da istenilen sonuç (belirlenen eğilim değerine sahip birey) elde edilinceye kadar:

- Nesildeki her bireyin eğilim derecesi hesaplanarak bireyler bu değere göre sıralanır,

- Birey seçme kuralına göre eşleştirme işlemine girecek ve öldürülecek bireyler tespit edilir,

- Eşleştirme kuralına göre seçilen eş bireyler (ebeveynler) kesiştirilerek yeni bireyler (çocuklar) oluşturulur,

- Oluşturulan bireylere mutasyon katsayısına göre mutasyon işlemi uygulanır (burada gen değerleri ile oynanır, kromozom bir sayı ise bit değişikliği, bir dizi ise kurallar çiğnenmeyecek şekilde eleman değeri değişikliği yapılır),

- Çocuk bireyler öldürülen bireylerin yerini alacak şekilde yeni nesil oluşturulur.

 

Basit bir örnek konunun daha iyi anlaşılmasını sağlar, bu yüzden temel aritmetik işlemlerini içeren bir problemi ele alıp genetik algoritmayla nasıl çözülebileceğine bakalım.

Problem: Sonucu dışarıdan verilen bir değere eşit olacak [rakam],[işlem],[rakam],... şeklindeki ifadeyi, 0’dan 9’a kadar rakamları ve dört aritmetik işlemi kullanarak oluşturunuz.

Not: Sonuç, ifadedeki işlemler soldan sağa yapılarak hesaplanacaktır, örneğin 23 değeri için ifade 6+5*4/2+1 şeklinde olabilir (6+5=11, 11*4=44, 44/2=22, 22+1=23).

Veri yapılarını oluştururken alacağımız kararlar çok önemli olup yapacağımız işi baştan sona etkileyecektir, bu yüzden önce problemin doğasını iyice kavramamız gerekiyor. Bizden istenilen çözüm, girilen sonucu veren ifadeyi bulmamız, yani bir arama yapmamız gerekecek. Bu arama sırasında bulacağımız her ifade bizim için bir çözüm adayı, yani genetik algoritmada bir birey/kromozom olacaktır. Her ifade de rakamlardan ve işlemlerden oluştuğu için rakamlar ve ifadeler bizim için gen değerleri olacaktır. Toplam 10 rakam ve 4 ifade bulunduğuna göre ve bir genin alacağı değerlerin sayısı 14 olduğuna göre, her geni 4 bitle ifade edebiliriz:

 

                         

Geriye kalan 1110 ve 1111 değerleri kullanılmayacaktır, program boyunca hiçbir anlam ifade etmedikleri için de atlanacaktır. Bu şekilde bir kromozom aşağıdaki gibidir: 

 

Programın çalışma sırasında rakam olan yerlere işlem, işlem olan yerlere de rakam veya kullanılmayan değerlerden biri gelebilir, bu yüzden kromozom okunurken, soldan sağa, bir rakam okunacak, ardından sıradaki ilk işlem eğer kalan bölümde yine bir rakam varsa okunacak, işlemden sonra mutlaka yine bir rakam okunacak şekilde ayar yapılmalıdır. Bu gibi bazı problemler için ekstradan kod yazılması gerekmektedir. Örneğin aşağıdaki kromozom 2+7-1 şeklinde okunacaktır: 

 

Bunları hallettikten sonra bireyin eğilim değerinin nasıl hesaplanacağı kuralını da tanımlayarak işin en önemli kısmını tamamlamış olacağız. Bu değer, doğal olarak bireye ait ifadenin değerine ve programın başında girilen değere bağlı olacaktır, örneğin eğilim değeri aşağıdaki gibi basit bir işlemle hesaplanabilir:  

 

Bundan sonraki kısımda birey seçme kuralı tanımlanır. Her nesilde bireyler eğilim değerlerine göre sıralandıktan sonra, örneğin ikiye ayrılıp eğilim değeri düşük olan bireyler öldürülür, yüksek olanlar da hayatta kalıp eşleştirme işlemine tabi tutulur. Teoride birçok birey seçme kuralı bulunmaktadır, bunlardan en sık kullanılanlar rulet/çark ve turnuva yöntemleridir.

Eşleştirme için de değişik yöntemler denenebilir, ebeveyn olarak seçilen bireyler havuzundan sırayla veya rastgele bireyler seçilerek eşleştirilebilir. Örneğin; her seferinde en iyi bireylerin seçilip eşleştirilmesine elitist seçme denir.

Eş bireylerin kesiştirme işlemine tabi tutulması sonucunda çocuk bireyler elde edilir. Kesiştirme işleminde de kromozomların üzerinde seçilen kesiştirme noktalarına göre değişik kesiştirme yöntemi bulunmaktadır. Bazı kısıtlamalı problemlerde kesiştirme işlemi sonucunda elde edilen yeni bireyler kısıtlamalara aykırı şekilde çıkagelebilir ve geçerli çözüm adayı sayılmazlar, problem kısıtlamalarını yerine getirme amacıyla bu sorun, yazılacak ek program satırlarıyla, kesiştirme sırasında önlenebilir veya sonradan düzeltme yapılarak giderilir. Örneğin; gezgin satıcı probleminde bu tür bir kontrolün yapılması zorunludur.

Oluşturulan bireylere mutasyon işlemi uygulanırken de, kısıtlamalı problemlerde, gen değerleriyle oynanırken kısıtlamalar göz önünde bulundurulmalıdır. Örneğin; gezgin satıcı probleminde bir geni mutasyona uğratmak için doğrudan değerini değiştirmek değil de, diğer bir genin değeriyle değiştirmek mantıklıdır, bizim örneğimizde ise basitçe bir biti seçip değerini tersi ile değiştirebiliriz.

Bu fonksiyonların hepsi tanımlandıktan sonra program çalıştırılmak için hazır hale gelmiş olur. Programın sonlanma koşulunu oluşturan nesil sayısı ve bulunması istenen değer parametreleri verilerek program çalıştırılır.
Yazının başlarında da ifade edildiği gibi genetik algoritmalar, geleneksel arama tekniklerinin yetersiz kaldığı geniş çaplı çözüm uzaylarında arama yapmak için kullanılır. Genetik algoritmaların yapısında bulunan kesiştirme, mutasyon gibi işlemler arama sırasında farklı bölgelerin taranmasını sağlamakla birlikte bölgesel optimumlarda sıkışıp kalınmasını da engeller. Bu amaçla da algoritmalarda çeşitli şekillendirmeler yapılmış, değişik versiyonlar ortaya çıkmıştır. Bütün bunlara rağmen, genetik algoritmalar her zaman mutlak çözüm vaat etmeyip çoğu kez yaklaşık çözüm bulmaktadırlar.
      Ilir ÇOLLAKU
İTÜ Bilgisayar Mühendisliği Bölümü (Yüksek Lisans)
- Temmuz 2009 -
Editörden... | H. Can ÇOBANOĞLU Genetik Algoritmalar | Ilir ÇOLLAKU Yazılım Mühendisliğine Doğru | Mustafa Burak AMASYALI Real-Time İşletim Sistemlerine Genel Bakış | Halil DALMAZ Mobil Haberleşmede 3. Nesil | Feyzan SARUHAN Windows Server 2003 | Taylan SAYIN Enerjiyi Verimli Kullanmak | Sümeyra HAŞLAMAN Elektromanyetik Radyasyon | Ilgın UĞUR SQL Saldırıları ve Önlemler | Cemre Fatih KARAKULAK Arayüzler ve Hafıza Yapıları | Ömer GENÇAY Sims 3 Oyun İnceleme | Erman TEPE Nanoteknoloji | Muhammed CÜCE
« önceki sayfa - 1 - sonraki sayfa »

Ana Sayfa | Künye | Dergimiz | | İletişim
© 2009-2010 Bilisimdergi.Com Tasarım - Kodlama : İU BİLGİSAYAR

Creative Commons License
Bilişim Dergi içeriği  Creative Commons  lisansı ile korunmaktadır.
Kaynak göstermek ve link vermek şartıyla yazılarımızı kullanabilirsiniz.