Merhaba arkadaşlar, bu yazımda algoritma severlerin mutlaka bildiği 8 vezir probleminin genetik algoritma ile çözümünden bahsedeceğim.
Her ne kadar 8 vezir desek de asıl amacımız n adet vezirin nxn’lik satranç tahtasına uygun bir şekilde yerleştirilmesini sağlamaktır. Bu yüzden 8 vezir yerine, n vezir problemi demek daha doğru olacaktır.
n Vezir Problemi Amacı
Satranç oynayanlar bilir, bir vezir yatay, dikey ve çapraz hamleler yapabilir. Amacımız n adet veziri, nxn’lik bir satranç tahtasına birbirini kesmeyecek şekilde yerleştirmek.
n Vezir Probleminin Geçmişi
8 vezir problemi ilk olarak 1848 yılında satranç oyuncusu Max Bezzel tarafından ortaya atılmıştır. Gauss ve Georg Cantor gibi pek çok matematikçi tarafından incelenmiştir. İlk çözümü Franz Nauck 1850’de ortaya atmıştır, aynı zamanda n vezir problemi haline getirmiştir.
n Vezir Probleminin Genetik Algoritma ile Çözümü
Genetik algoritma ile ilgili daha önceden bir yazı yazmıştım. Temel seviyede bilgiyi şuradan edinebilirsiniz. Evrimsel Sürecin Simülasyonu – Genetik Algoritmalar – 1
Fitness Function
Bildiği üzere genetik algoritmada asıl işi yapan Fitness Function‘dır. İyi düşünülerek yazılmış bir fitness function sonuca ulaşmamızı büyük bir oranda etkiler. 8 vezir probleminde ise algoritmamız şu şekilde olacak:
- 8×8’lik satranç tahtasının ilk sütunundan başlayarak bir vezir seçilir
- Seçilen veziri, tahtanın sağında yer alan kesmeyen vezir sayısı bulunur
- Bu kontrol tüm sütunlar için uygulanır ve toplam kesmeyen vezir sayısı bulunur
Not: 8 vezirlik bir problemin en uygun fitness function sonucu 28 olarak hesaplanır.
Problem için hazırladığım fitness function
1 | public class MyProblemFitness : IFitnessFunction |
Kromozom Yapısı
Örnek kromozom: [ 5, 1, 3, 0, 2, 7, 6, 4 ]
Bu problem için permütasyon kodlamalı kromozom yapısı daha uygun olacaktır. Kromozomun birinci elamanı olan 5 değeri, vezirin sıfırıncı sütun ve beşinci satırda yer aldığını ifade etmektedir.
C# ile Çözümü
Problemin çözümde kütüphane kullanmak çözüm süresinin uzamasını ve aynı işlerin (crossover, mutation, selection…) tekrarını önlemek açısından önemli. Bu yüzden AForge.Net Genetic ve GeneticSharp kütüphanelerini kullandım. Problemi her iki kütüphane ile çözdüm. AForge.Net kütüphanesinin performası bu problem için daha uygun geldi bana. Tavsiyem AForge.Net Genetic.
Problemin çözümünü Github’ta paylaştım. İsterseniz inceleyebilirsiniz,
https://github.com/mehmetemineker/Genetic8QueensSolutionWithAForge – AForge.Net Genetic
https://github.com/mehmetemineker/Genetic8QueensSolutionWithGeneticSharp – GeneticSharp
Kaynak: https://tr.wikipedia.org/wiki/Sekiz_vezir_bulmacas%C4%B1