Genetik Algoritma #3 (Golang)

Alameddin Çelik
3 min readDec 26, 2020

--

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.

A ve B’nin Çaprazlaması için öncelikle A’nın yarısı ve B’nin diğer yarısı birleştirilir. Çıktı (A/2 + B/2 , B/2 + A/2)

Mutasyon

Mutasyon için popülasyona bir fonksiyon oluşturduk ve aynı şekilde Kromozomdaki fonksiyonumuz ile bağladık

Kromozom içindeki Mutasyon Fonksiyonumuz

Mutasyon içerisinde iki gen’in yerlerini değiştiriyoruz.

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

--

--

Alameddin Çelik
Alameddin Çelik

No responses yet