Doğru denklemleri oyunu – 2

Bu oyunda da geçen oyunun tersi yapılıyor. Her soruda değişik renklerde dört doğru grafiği veriliyor ve altta verilen denklemin hangi grafiğe ait olduğu soruluyor.

Tablet ve cep telefonları için tuşları ve ekran büyüklüklerini bir aksilik çıkmazsa bu hafta iyileştirmeyi düşünüyorum.

Oyun

Bir doğru denklemi bulma oyunu

Geçen yıl bir veli toplantısında bir velinin sorduğu şu soru beni hayretlere düşürmüştü:

– Çocuklar matematik çalışmak için ders kitabından başka nereden soru bulabilir? Ders kitabında çok az soru var.

Ders kitabında çocuğun öğrenmesi beklenen her fikir ya da yöntem için normalde en fazla on tane soru oluyor. Bunların da çoğu derste yapılıyor ya da ev ödevi olarak veriliyor. Sınava hazırlanmak için kitaptaki soruları çöz deyince de çocuklar genelde biz onları zaten yaptık diyorlar. Anlaşılan bu veli de böyle bir cevap almıştı ve daha başka soru kaynağı arıyordu. Oysa sonsuz sayıda sayı olduğuna göre yeni soru üretmek çocuk oyuncağıdır. Kitaptaki örnek sorular alınır ve değişik sayılarla sonsuz adet soru yapılır. Tabii ebeveynler bu iş için zaman harcamak istemez. Ne de olsa sorunun kolay çözülebilmesi için sayıları doğru seçmek biraz enerji gerektiren bir işlemdir.

Geçenlerde çocuklar eve gelince bana bir android uygulaması gösterdi. Verilen bir tamkare sayının kare kökünü bulmaya dayanan bir oyun. Nedense çocuklar bunu sevmişti. Ben de matematik soru üretme işini böyle denemeye karar verdim. İlk programımda x-y koordinat sisteminde verilen bir doğru grafiğinin y = mx + n şeklindeki denklemini seçeneklerden bulma şeklinde bir test oyunu yaptım. Her doğru cevaba 100 puan veriliyor. Bakalım çocukların ilgisini hiç çekecek mi?

Oyun

Saraydan kız kaçırma (Çözüm)

Soru

Madem kralın verdiği cevapları bilmiyoruz, o zaman her ihtimali deneyelim. Yani verilebilecek her cevabın kralın doğrucu ya da yalancı olduğu durumlarda prens için yardımcı olup olmadığına bakacağız.

[table id=45 /]

Yukarıdaki tabloda turuncu satırlar prensin kesin bir sonuca ulaşamayacağı satırları gösteriyor. Kırmızı satırlar cevaplar bir çelişkiye yol açtığı için prensin hemen eleyebileceği durumlar. Kalan iki yeşil satırda prens belli bir sonuca varabiliyor. İki satırın da aynı sonuca varması sayesinde de problemi çözebiliyoruz. Kralın verdiği cevapları tam olarak bulamıyoruz ama prensesin adada olduğu sonucunu bulabiliriz. Prensle aramızda o kadar da fark olsun yani.

 

Evrim ve genetik algoritmalara küçük bir giriş

Richard Dawkins, Kör Saatçi adlı kitabında bir programdan bahseder. Bu program rastgele değişimler ve rastgele olmayan seçimler sayesinde nesiller boyu işleyen bir algoritmanın tamamen rastgele şekilde işleyen bir mekanizmadan çok daha çabuk hedefe ulaşacağını gösteren bir deneydir.

Bu deneyde Dawkins ‘METHINKS IT IS LIKE A WEASEL’ cümlesini kullanır. Eğer bir maymun rastgele İngilizce alfabedeki 26 harfi ve boşluk karakterlerini kullanarak bu cümleyi yazmaya çalışırsa çok çok uzun zaman bu işle meşgul olurdu.

Dawkins, bunun yerine maymunun çalışma prensibinde hafif bir değişiklik yapılırsa çok ilginç bir sonuç çıkacağını söyler kitabında. Diyelim ki maymun yine rastgele 28 harflik (cümle 28 harf uzunluğunda) bir şey yazsın. Daha sonra bu cümleyi kopyalamaya başlasın ama bir farkla. Kopyalarken arada rastgele hatalar yapsın, yani bazı harfler kopyalarda değişsin (mutasyon). Daha sonra maymun o yazdığı ve kopyaladığı cümleler grubunda hedef cümleye en yakın cümleyi seçsin ve o ana kadar yaptığı adımları tekrarlasın. Böylece nesiller sonra maymun hedef cümleyi bulacaktır ve bu iş için gereken nesil sayısı tamamen rastgele seçim olan algoritmadan çok daha az olacaktır.

Bunu denemek için bir javascript simulasyonu programladım. Her nesildeki birey sayısını ve mutasyon oranını girdikten sonra ya animasyonlu ya da animasyonsuz çalıştırılabilir. Öncelikle animasyonsuz çalıştırılmasını öneririm. Böylece daha hızlı çalışacaktır ve daha kısa sürede bütün işlemlerin yaklaşık kaç nesil süreceği görülebilir. Bu esnada yukarıda nesil numaraları ve o nesildeki hedefe en yakın cümleyi görebilirsiniz.

Eğer animasyonla çalıştırılırsa maymunun yaptığı işlemleri ‘ağır çekimde’ görülebilir. Cümlelerdeki mutasyonlar, yani hatalı kopyalanan harfler kırmızı gösteriliyor. Ardından maymunun seçimi yeşil arkaplan rengiyle gösteriliyor. Bundan sonra o nesil komple siliniyor ve yerine maymunun seçtiği cümlenin tam kopyaları koyuluyor. Animasyon bu adımların tekrarlanmalarıyla devam ediyor. Küçük bir uyarı yapayım, bu adımlar çok yavaş gösterildiğinden bütün simulasyonu seyretmek çok zaman alacaktır.

Hedefe çabucak ulaşmak için kalabalık popülasyonlar seçmek daha iyi olacaktır. Animasyon kullanılmayacaksa 100 iyi bir popülasyon büyüklüğüdür. Animasyon için ise ne kadar küçükse o kadar iyi ama bu durumda da bütün simulasyon çok uzun sürecektir. Mutasyon değerini küçük tutmak iyidir. Örneğin 0.05 (Her harf yüzde beş ihtimalle değişebilir) yeterli bir değer. Aşağıdaki linkten simulasyon sayfasına ulaşabilirsiniz.

Gelincik programı

Bana ne, kendimi başkasının yerine koymayacağım işte

Yıllar önce, Visual Basic program geliştirme ortamının yaygınlaşmak üzere olduğu bir dönemde ben de bu dili ve programı öğreneyim demiştim. Görsel kontrollerin desteğiyle uygulama yazmak çok daha kolay ve eğlenceli olacaktı. İşe başladıktan kısa bir süre sonra çok sinir bozucu bir olayla karşılaşmıştım. Bir satırdaki kodu bitirmeden başka bir satıra geçildiğinde ekranda birden bir hata mesajı beliriyordu. Program geliştirme ortamı tabii ki yarım kalmış satırı hemen yorumluyordu ve bu satır hatalıydı. Bu şekilde bakıldığında yerden göğe kadar haklıydı ama kullanıcıyı bu durumlarda bir hata mesajını okumak (tamam, hangimiz hata mesajlarını okuyor ki?) ve daha da önemlisi bu mesajı aktif bir şekilde kapatmak zorunda bırakarak kullanıcının dikkatini dağıtıyordu ve çalışma zevkini öldürüyordu. Günümüzde çok daha iyi geliştirme ortamları bu hataları daha az saldırgan yöntemlerle (Örneğin satırdaki hatalı yerin altını kırmızı çizerek) kullanıcıya iletip çalışma temposunu ve akıcılığı bozmamayı başarabiliyor. Artık eski günler bir daha geri gelmez diye düşünüyordum ki tabii ki yanıldığımı gördüm.

Üretim hattındaki paketlerin içinde yabancı maddelerin olup olmadığını kontrol eden makinelerimiz böyle hatalı bir ürün tespit edildiğinde bu paketi hemen üretim hattının dışına atıp, hatalı ürünü de ekranda gösteriyor. Daha doğrusu operatör doğru pencereyi açmışsa gösteriyor. Cin fikirli bir müşterimiz, böyle önemli bir olayın, yani hatalı bir paketin üretilmiş olmasının ne olursa olsun operatör tarafından görülmesinin gerektiğine inanarak yazılımda şöyle bir değişiklik yapmamızı istedi: Hatalı ürün hattan atılır atılmaz hangi pencere açık olursa olsun otomatik olarak hatalı ürünlerin gösterildiği pencere açılsın. Böylece operatör hemen bu durumdan haberdar olup duruma müdahale edebilecek ve üretimin kalitesi yükselecek.

Yazılımla her şeyin yapılabileceğine ve daha da önemlisi yapılan her şeyin satılabileceğine inanan satış elemanı hemen olur demiş ve bu istek bizim bölüme geldi. Tabii ki zamanında Visual Basic öğrenmeye başlayıp bunu yarıda bırakan nesle ait olan programcılar hemen bunun saçma olduğunu söylediler. “Operatör belki o anda makineyi ayarlamakla meşgul olacak ve otomatik olarak başka bir ekrana sıçramak ayarları bozmasa da operatörün asabını bozacaktır. Bu işlem üç beş kere tekrarlarsa da o operatör kesin ekranı bıçaklar” dendi. Proje yöneticisiyle konuşuldu ve ikna edildi ama müşteriyi ikna edemedik. Satış elemanı da “parayı veren düdüğü çalar” dedi ve biz de bunu programladık.

Birkaç hafta sonra servisten bir eleman bize geldi ve müşterinin yeni bir isteği olduğunu söyledi. Son yaptığımız özelliği kapatmamızı istiyormuş ve bunun için de ödeme yapacakmış. Müşteriyi kimin ikna ettiğini sorduk. Servis elemanının kendisi ikna etmiş ve çok kolay olmuş. Hayretler içinde kalmıştık. Bütün departmanın yapamadığını tek başına başarmıştı. Asıl ilginç olan ise satış elemanının olmaması gerken bir şeyden iki satış çıkarabilmesiydi. Umarım şirketteki herkes bu olaydan bir ders çıkarmıştır.

Kendini kullanıcının yerine koyabilmek

Kendini başkasının yerine koyabilmek genelde oyunlarda kullanılan bir yöntemdir. Rakibim bu durumda ne yapardı diye düşünerek iyi bir hamle ya da strateji bulmanın güzel yollarından biridir. Nedense yazılım projelerinde çok sık gözardı edilen bir yöntemdir ama. Yaptığımız programı ya da makineyi kendi klonlarımızın kullanacağını ya da bu sistemlerin bizim çalıştığımız ortamlarda kullanılacağını varsayıyoruz heralde.

İşe başladığım ilk günlerdi. Şirketin endüstriyel teraziler üretip sattığını biliyordum ama henüz hiçbir tanesini görmemiştim. Birgün hemen yanımızdaki elektronik tasarım bölümüne servisten bir dokunmatik ekran birimi geldi. Bu ekranı tasarlayan eleman elindeki şeye şaşkınlıkla bakıyordu. Servis elemanı bunun tamir edilip edilemeyeceğini sordu. Arkası paslanmaz çelikten yapılmış 20 inç büyüklüğündeki tamamen yamulmuş dokunmatik ekran tasarımcının vereceği cevabı bekliyordu. Geleceği bu cevaba bağlıydı. Sonunda herkesin bildiği cevap geldi. Yenisini gönderin!

Sonra öğrendik ki müşteri teraziye, düşük ağırlıkta bir ürün tartıldığında her yerden duyulabilen bir alarm sistemi eklenmesini istemiş. Aslında mantıklı bir istek. Bazı üretim bölümleri çok hareketli ve gürültülü olur ve buralarda görsel sinyaller her zaman fark edilmeyebilir. Bazen de operatör birden fazla makineyi kontrol ederken sistemde ortaya çıkan sorunları kaçırabilir. Dolayısıyla müşteri, operatör müdahale edene kadar bu alarmın çalması istenmiş ve biz de yapmışız. Hamur ürünleri üretilen bu fabrikada operatör alarmı susturmayı başaramayınca o an şans eseri elinde bulunan kilolarca ağırlıktakı hamur bloğunu ekrana fırlatmış. Alarmın sustuğunu hiç sanmıyorum ama eleman elinden geleni yapmış.

Birkaç gün sonra bir başka müşteriden başka bir ekran geldi. Bu yamulmamıştı ama bizim de sorunlardan düşündüğümüz kadar uzakta olmadığımız hissini veren bir durumdaydı. Ekran boydan boya yarılmıştı.

Bu ekran da yine operatörün uzun süre doğru menüyü bulamaması nedeniyle bıçaklanarak (evet demek ki bazı operatörler üretimde bıçak kullanıyor) yırtılmıştı.

Bu örneklerde ne müşteri ne de bizim ekip kendini kullanıcı operatörlerin yerine koyabildi. Sonuçta belki o operatörler ceza aldılar ama müşteriler de bir bir süre üretim yapamayıp kayıplar yaşamış oldu. Bu derece olmasa da bu işin buralara varacağını kimse göremedi mi acaba? Tabii ki görenler olmuştur, hatta söylemişlerdir de ama bazen müşteriyi, bazen de satış departmanını ikna etmek kolay olmuyor. Herkes kendini başkasının yerine koyabilseydi çok farklı bir dünyada başka başka programlar yazıyor olurduk heralde.

Saraydan kız kaçırma

Prensle prenses tam evlenme hazırlığındayken prens acı haberi alır. Prenses kaçırılmıştır. Söylentiye göre de mantık adasına kaçırılmış. Mantık adasında iki kabile yaşamaktadır. Bir kabile sadece doğruyu söyleyenlerden oluşmaktadır, diğeri de sadece yalan söyleyenlerden. Adanın kralı da bu kabilelerden birinden ama hangisinden olduğu bilinmiyor. Kral hakkında bilinen tek şey o adada o an olan ve daha önce olmuş olan her şeyi biliyor olması.

Prens bir koşu adaya gidiyor ve kralla görüşüyor. Ona şu soruları soruyor:

Prenses mantık adasında mı?

Prensesi gördünüz mü?

Kralın bu sorulara verdiği cevapları (cevapların evet ya da hayır olduğu kesin ama) bilmiyoruz ama prensin bu cevaplarla prensesin mantık adasında olup olmadığını bulduğunu biliyoruz.

Prenses mantık adasında mı?

Çözüm

Kilitler ve anahtarlar (Çözüm)

Soru

Herhangi üç korsanın bu sandığı açamaması için olası her üç korsanlık grup için bir farklı kilit kullanılması lazım. Bu kilidin anahtarlarını da bu üç kişi dışındaki herkese vermek lazım. Bu şekilde iki şeyi garantilemiş oluruz. Herhangi üç kişinin açamayacağı bir kilit bulunduğundan dörtten az kimse bu sandığı açamaz ve herhangi dört kişi de bu sandığı açabilir, çünkü bu dört kişi içinde bir üçlü grup bir kilit hariç diğer hepsini açabilir ve kalan dördüncü kişi de bu son kilidi açabilir.

O zaman toplam kaç kilit gerektiğini hesaplayalım. Soruda 7 korsan olduğuna göre bu yedi korsanın üçlü kombinasyonları kadar kilit gerekecektir.

\({7\choose3}=\frac{7\cdot{6\cdot{5}}}{3\cdot{2\cdot{1}}}=35 \)

Demek ki toplam 35 kilit ile bu sorun çözülebilir.

Peki korsanlar kaçar anahtar almalı? Her üçlü korsan grubu için bir kilit taktık ve bu kilidin anahtarlarını diğer dört korsana verdik. Yani toplamda \(35\cdot{4}=140 \) adet anahtar dağıttık. Dolayısıyla kişi başına da \(140 : 7 = 20 \) anahtar düşer.

Kilitler ve anahtarlar

7 korsan bir hazine buluyor ve bütün paraları büyükçe bir sandığa koyuyor. Bu sandığı kilitlemek istiyorlar ama bunu öyle yapmak istiyorlar ki sandığı ancak en az 4 korsan beraber açabilsin. Herhangi 3 korsan açamayacak ama herhangi 4, 5, 6 korsan ya da hepsi birden açabilecek. Her kilidin birden fazla anahtarı olabilir ama bir anahtar sadece bir kilidi açabilir. Bu durumda sandığı kilitlemek için en az kaç kilit gerekir? Korsanlar kaç anahtar almalı?