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.