C# ile A* (Star) Algoritması kullanarak 8 Taş Bulmacasını çözmek
A star algoritması sezgisel bilgileri kullanarak bir durumdan bir amaca ulaşmaktır. Bu amaç duruma ulaşmak için minimum yolun bulunmasında daha az tarama yapmaya olanak tanımalıdır.
İyi seçilmiş bir sezgisel fonksiyon ile çok az dallanma yaparak hedefe yaklaşabiliriz.
Bu görselde yeşil kutudan kırmızı kutuya gitmeye çalışalım. Ancak kutuların ortasında bir duvar olsun.
Öncelikle yeşil kutudan başlayarak çevre alanları taramaya başlayacağız. Daha sonra taradığımız alanları açık bir listeye ekleyeceğiz.
Eğer karenin çevresinde duvar var ise bunu listeye eklemeyeceğiz.
Daha sonra ise başlangıç karesini kapalı bir listeye ekleyeceğiz.
Yukarıdaki görsel gibi çevresini tarayacağız.
Daha sonra açık listeye eklediğimiz kareleri her birisini F = G + H denklemi ile en küçük F değerini seçeceğiz.
G = Başlangıç noktasına göre yoldur.
H = Amacımıza ulaşmak için tahmini bir değerdir. (Heuristic) Tahmin
F değerinin en küçüğünü seçeceğiz çünkü o yol bizi kısadan amacımıza ulaştıracaktır.
Her kare hareketi için 10'ar puan diyelim. Köşegen üzerinde yapılan çaprak hareket 14 puandır (10*kök(2))
Yani ilk kutumuzu ele alırsak üstteki gibi bir sonuç çıkacaktır. Sol üst F değeri Sol alt G değeri sağ alt H değeridir.
Bu değerlere baktığımızda F değerinin en küçüğüne gideceği için kutumuz sağa gitmelidir.
Daha sonra aşağı aşağı gidecektir. Fakat bir kısa yolumuz daha vardır. Direk F 40 olan yere gitmek yerine çaprazdaki 54 değerine sahip olan kutuya gitmek bizi daha kısadan götürecektir.
Şu şekilde bir soru olabilir. Öncelikle F 54'e gidiyoruz daha sonra aşağı 74 gidiyoruz ama çapraz gitsek daha kısa olabilir denilebilir fakat duvar buna engel olacaktır. Kutu şeklinde hareket edeceği için önce aşağı sonra sağa gitmeliyiz.
Başlangıç karesini açık listeye ekle.
Çevresini dolaş en küçük F değerli kareyi bul. Seçilen kareyi kapalıya ekle.
Seçili kare için aynı şekilde yap. Duvar gibi engellere bakma.
Eğer amacımız gerçekleşirse yol bulunmuştur.
8 Taş bulmacasını da A* algoritması ile çözebiliriz.
Buradaki maliyetimiz her hareket için 1'dir.
Üstteki gibi bir başlangıcımız var ve bir amacımız var.
Boş olan kareyi hareket ettirmemiz gerekiyor.
Sadece yukarı, aşağı, sağa , sola hareket ettirebiliriz.
Üstteki fotoğraftaki gibi hareketler yaparak sonuca ulaşabiliriz.
C# ile yapmış olduğum programda başlangıç durumu ve amaç durumu 2 tane kullanıcının girmesi için beklenen yer vardır ve ',' ile ayrılmalıdır.
Çöz denildiğinde çözdükten sonra animasyonlu olarak '0' yer değiştirecektir. Yer değiştirmeler sağda gösterilir. Yaptığı işlemler en altta yazmaktadır.