8 Temmuz 2014 Salı

Akıl Oyunları #2 - Kuram Oluşturma


Hatırlatmakta fayda var; n*n'lik bir karede birbirinin ardışığı sayılar için horizontal veya vertikal olarak herhangi bir yöne 2 kare atlayarak, diyagonal herhangi bir yöne 1 birim atlayarak n^2 sayıyı tüm karelere yerleştirmek için uğraşıyoruz.

Üzerinde uğraştığım süre boyunca sadece 1 kez 6*6'lık karede başarılı oldum ve bir keresinde ise 8*8'lik karede başarılı olan bir arkadaşımın zaferine tanıklık ettim. Çoğu zaman 6*6'lık  karede 34'te kalmış, 8*8'likte ise en fazla 63'ü görebilmiş biri olarak bu can sıkıcı durumun hangi koşullar altında bozulduğunu merak eder oldum.

Açıkçası daha önce de bahsettiğim üzere bu oyunun her n*n'lik her karede işe yarayıp yaramadığı hakkında bir fikrim yok fakat 64 ve 36 sayının yerleştirilebildiğine bizzat tanık oldum. İlerleyen zamanlarda da tüm karelerde işe yarayıp yaramadığını anlamaya çalışacağız.

Önce sırasıyla konuyu kavramaya çalışalım, hileleri ya da çıkış kapısı var mıdır ve eğer varsa buraya en kısa sürede nasıl ulaşabiliriz bunları biraz da felsefi bir dille inceleyelim. Daha sonra anladığımız düzeni en genel haliyle istatistiksel ve matematiksel ifadelere dökelim. Bu matematiksel ifadeyi ve çözüm yolu olarak ortaya koyduğumuz algoritmayı böyle konular için en uygun programlama dili olduğunu düşündüğüm Python yardımıyla hayata geçirelim. Bırakalım artık onlar düşünsün. Eğer her şeyi yerli yerine oturtmayı başarabilirsek programı en genel haliyle n*n'lik her kare için çalışacak şekilde düzenleyelim ve bakalım her kare için bir çözüm yolu bulabiliyor muyuz?

Teori

Söz gelimi 6*6'lık bir kareyi ele alalım. Daha önce belirttiğim üzere fantezilere yer vermeden ilk sayımızı ilk boş kareye yazalım. Hatta hiç belirsizliğe mahal vermeye gerek yok, kareyi haritalaştırıp yolumuza öyle devam edelim. Karenin sol alt köşesindeki kareye (0,0) koordinatını vererek, klasik düzlemi esas alıp sola doğru '+x', yukarıya doğru '+y' yönü olarak belirledikten sonra tarif etme konusundaki olası zorlukları aşabiliriz.

İlk adımdaki 36 ihtimalden birini değerlendirip ilk sayımızı yani 1'i (5,0)'a yerleştirdik. Şimdi ikinci hamlemizi yapmak için üç ihtimalimiz var. (3,5) noktası, (2,3) ve (0,2) noktaları opsiyonlarımız. (3,5) noktasına atladığımızı düşünelim. Şimdi de önümüzdeki seçenekler: (5,3), (3,2), (1,3). Benzer şekilde (2,3) noktası için 5, (0,2) noktası için de 3 farklı yolumuz var. Şu an itibariyle en iyi ihtimalle 36*3*3 yani 324 olasılıktan birini gerçekleştirdik ki bu daha başlangıç. Bu işin üstesinden biz değil, bu işi seriye bağlayacak daha hızlı bir beyinin gelmesi gerekiyor. Küçük bir Python programı sayesinde bu olaya kısa sürede açıklık getirebiliriz.

Fark ettiyseniz her adımda yolumuz sürekli dallanıp budaklanıyor. Öyleyse biz bu kareye ağaç muamelesi yapıp olayı bambaşka bir pencereden seyredelim ve inceleyelim.

Gezi Parkı'nda bir ağacın gövdesinden yavaş yavaş yukarı doğru çıkan Z adında bir karınca, ağacın en uzun dalında yapışık olan bir küp şeker olduğunu görür ve oraya varmak ister. Keskin duyularından ve diğer tüm yeteneklerinden yoksun olan Z, oraya deneyerek gitmek zorundadır. Yukarıya çıkarken her seferinde bir ayrıma denk gelen karınca Z, duyu eksikliği nedeniyle sürekli rastgele olarak birini seçmekte ve bu yolun onu şekere götürmesini ummaktadır. Karınca Z'nin bahtsız olduğunu düşünelim; Yolu bulamadı ve aramaya devam etmesi gerekiyor. Z, bu seçimlerinin sonunda geldiği dalın ayrımına geri gidip denemediği diğer ayrımları denemesi lazım. Eğer o ayrımdan hayır gelmezse, bir önceki ayrıma gitmeli ve ayrımların şekere ulaştırıp ulaştırmadığını denemeli. Kısacası çok uzun sürse dahi her yola bakmalı.

Elimizde ne yazık ki bu sorunun çözümüne ulaştırabilecek daha kısa bir yöntem yok, bundan dolayı yapmamız gereken yegane şey, her bir ihtimali teker teker denemek ve şekere ulaşıp ulaşamadığımıza bakmak.

Tüm bu anlatılanları daha sade ve temiz bir şekilde anlatalım. Yapmamız gereken şey, Z'nin yaptığı gibi rastgele yolumuza devam edip sonuca varıp varamadığımızı kontrol etmek. Şekere varamamış isek, bir öncesi yol ayrımında karşımıza çıkan diğer yolları da takip etmemiz gerekiyor. Her başarısız olduğumuzda bunu bir döngü haline getirip sürekli tekrarlamak. İşte tam burada devreye Python girecek.

Fakat şimdi bunu bizim kadim dostumuz Python'a da anlatmalıyız.

Yazının devamını okuyun...

Hiç yorum yok:

Yorum Gönder