Genetik Algoritma #3 (Golang)
Genetik Algoritmanın Golang’de kullanımını örnek kodlarla anlatmaya çalıştığım bu yazıda ki kavramları daha iyi anlayabilmek için lütfen daha önceden paylaştığım Genetik Algoritma #1 yazısını okuyunuz.
Amaç:
Verilecek olan X sayıdaki şehirler arasında en kısa yolu keşfetmek.
Başlangıç:
Gezinmek istediğimiz şehirler aşağıdaki gibi bir dizi halinde tanımladık.
Öncelikle genetik algoritmayı kullanabilmek için gerekli yapı parçalarını oluşturalım.
Genlerin Oluşturulması
X ve Y lokasyonunu belli ederken, Name o şehrin adını içermektedir.
Kromozom Yapısı
Kromozomlar Gen Dizileri barındırmaktadır, Score bu kromozomun başarısını tutmaktadır.
Popülasyon Yapısı
Popülasyon yapımızda Kaç adet kromozom tutulması lazım değeri olarak Capacity, şu anda kaç kromozom bulundurduğu Size değerleri ile tutulmaktadır. LastBest bu popülasyondaki en başarılı kromozomun başarı değerini gösterir, Bunun dışında ItarationLimit ve TiltCountLimit Bu Popülasyonun ne zaman biteceğini belirleyen değerlerdir.
Popülasyonun Başlatılması
Başlangıçta şehirlerimiz, toplam popülasyon büyüklüğü ve mutasyon oranını girdiğimiz fonksiyonum ile popülasyonu başlatırız.
Popülasyonun Yürütülmesi
Popülasyonumuzun yürütülme evresinde Çaprazlar ve Mutasyonlar gerçekleşmelidir. Bunun dışında her iterasyon bitişinde popülasyon kendini sıralamalı ve temizlemeli.
Her iterasyonda popülasyon içi değişken büyüme ve sabit büyüme bulunmaktadır. Sabit büyümede en başarılı 3 birey çaprazlamaya tutuşur ve en başarılı iki birey ile en kötü üç birey mutasyona uğratılarak popülasyona dahil edilir. değişken büyümede ise Popülasyon içerisinde rasgele bireyler çaprazlanır ve mutasyona uğrar
Çaprazlama ve Mutasyon
Çaprazlama
Çaprazlama için Popülasyona bir method olusturduk, Bu method İki kromozomdan çaprazlama gerçekleştirerek yeni iki birey oluşturur.
Kromozomun çaprazlama fonksiyonu şu şekildedir.
Mutasyon
Mutasyon için popülasyona bir fonksiyon oluşturduk ve aynı şekilde Kromozomdaki fonksiyonumuz ile bağladık
Kromozom içindeki Mutasyon Fonksiyonumuz
Başarı Hesaplanması (Fitness Function)
Uzaklık Hesaplama işlemini şehirler arasındaki uzaklığı kuş uçuşu mesafeye göre yapıyoruz.
Aklınıza “Ama yollar kuş uçuşu değil ki” gibi bir soru gelebilir. Burada yakınlığı çok kısa sürede, az hata payıyla bulmayı hedeflediğimiz için kuş uçuşu planladık, eğer gerçekten ulaşımın çok zor olduğu ve şehirlerin yakınlıklarına rağmen ulaşımın çok zor olduğu bir harita üzerinde işlem yapıyorsak o zaman yol mesafeleri ile daha detaylı bir işlem yapmamız gerekir.
Temizleme Fonksiyonumuz
Popülasyonda ki fazlaları silmek için öncelikle toplam skorlarımızın kümülatif toplamlarını bulur ve rasgele olarak buradan bir bireyi seçeriz, buradaki kümülatiften seçme işlemi kısa mesafeye sahip yolların popülasyondan silinmemesi için pozitif ayrıcalık oluşturmamızdır.
Çalıştırma
Popülasyonumuzu başlatır, tilt(kitlenme) ve iterasyon(tekrarlanma) sınırlarımızı oluşturup çalıştırırız.
Döngü bitişinde de en başarılı olan en üstteki sonucu ekrana yazdırıyoruz.
Herhangi bir sorunuz veya daha iyi bir yönteminiz olursa, yorumlarda üzerine konuşmak üzere…
Görselleştirilmiş çıktısı şu şekildedir
Github Repository:
https://github.com/alameddinc/genetic-go
Alameddin Çelik