Arka fon
MENACE ( M achine e ducable N oughts bir nd Cı Rosses e ngine) 1960 İngiliz bilgisayar bilim adamı Donald Michie tarafından oluşturulan oyun Noughts ve çarpılar için bir temel sığ makine öğrenme algoritmasıdır. Başlangıçta, her biri bir tahta pozisyonu ile etiketlenmiş ve renkli boncuklar (olası hareketleri temsil eden dokuz renkten biriyle) içeren 304 kibrit kutusu ile uygulandı. Michie, bu 304 kibrit kutusunun tahtadaki her hareket kombinasyonu için yeterli olduğunu hesapladı.
Aranızda ne kadar matematiksel bir N&C tahtasında aslında 19.683 olası Noughts, Crosses ve Blanks kombinasyonu olduğunu fark edebilirsiniz; ancak, bu sayıyı azaltmanın yollarını hesapladı (algoritmayı hızlandırmak ve muhtemelen kibrit kutularını azaltmak için!). İlk olarak, mümkün olmayan tüm hareketleri kaldırdı, örneğin:
-------
|X|0|X|
| |0| |
|X|X| |
-------
(iki nought ve dört çarpı)
Sonra, rotasyonları telafi etti. Örneğin, kibrit kutusunda:
-------
| |0|0|
|X| |X|
| |0| |
-------
aynı kutuyu kullanabiliriz
-------
| |X| |
|0| |0|
| |X|0|
-------
Bu nedenle, yukarıda belirtilen renkli boncuklar mutlak olanları değil, göreceli konumları temsil eder. Örneğin, kırmızı bir boncukun sol üst demek olduğunu söyleseydik, kutunun üstündeki resme bakar ve şunu görürdük:
-------
| |0|0|
|X| |X|
| |0| |
-------
bu yüzden bunun tahta olması durumunda kırmızı boncukların şu anlama geleceğini biliyoruz:
-------
|R|0|0|
|X| |X|
| |0| |
-------
Ama bu yönetim kurulu ise:
-------
| |X| |
|0| |0|
| |X|0|
-------
kırmızı boncuk
-------
| |X|R|
|0| |0|
| |X|0|
-------
Bu dönüşümler rotasyon ve ters çevirme için uygulanmıştır (diyagonal dahil tüm yönlerde). Bir kez daha, her kibrit kutusunu bu şekilde yalnızca bir kez kaydetmeniz gerekir: her dönüşüm için ayrı sanal kutular yapmayın!
Michie'nin yaptığı bir başka sadeleştirme, bilgisayarın önce gittiğinden emin olmaktı. Bu şekilde, kalan tüm kutuların yaklaşık beşte birini kaldırarak tüm birinci seviye hareketleri kaldırabilirdi. Son olarak, tüm oyun sonu kutularını kaldırdı (bu adımlarda daha fazla 'içerik' veya hamle gerekmediği için).
Doğru, şimdi algoritmanın kendisine (çok basit):
- İlk olarak, boncukların renklerinin neyi temsil ettiğine karar verin. Tahtadaki boşlukların her birini temsil etmek için 9 renge ihtiyacınız olacak.
- Oyunun başlangıcında, 304 kibrit kutusunun her biri boncuklar içerir. Boncuklar rastgele renkteyken (kopyalar iyi), olası hareketler olmalıdır (eğer tahta durumu görüntüsü sağ ortada bir 'O' gösteriyorsa, ortası temsil eden boncuk kullanamazsınız. sağ).
- MENACE'in (X) dönüşü her defasında, geçerli tahta konumu (veya üzerinde bir miktar dönüşüm) basılı olan kibrit kutusunu bulun.
- Kibrit kutusunu açın ve oradaki herhangi bir boncuğu rastgele seçin.
- Kibrit kutusundaki görüntüye ulaşmak için kart durumunun nasıl dönüştürüldüğünü bulun (örneğin saat yönünün tersine 90 derece döndürülmüş). Ardından, bu dönüşümü boncuğa uygulayın (örn. Sol üst sol-sol olur).
- O kareye bir X yerleştirin. Seçilen boncuğu kibrit kutusundan çıkarın. Sonuç olarak kutu boş bırakılırsa, kutuya üç rastgele (olası) boncuk koyun ve hareket için birini seçin.
- Oyun bitene kadar 3-6 tekrarlayın.
- MENACE oyunu kazanırsa, MENACE'in aldığı her kibrit kutusunu gözden geçirin. Ardından, o harekette hangi renk boncuğunu kullandığını takip edin. Bu boncuk renginden ikisini kutuya koyun (böylece orijinal boncuk + bir tane daha olacak, böylece MENACE'nin bu konuma bir dahaki sefer ilerlemesini sağlama olasılığı artacak)
- MENACE oyunu kaybederse, hiçbir şey yapmayın ( çıkardığı boncukları değiştirmeyin).
- MENACE oyunu çizdiyse, her hareketinde kullandığı boncuğu değiştirin, ancak fazladan bir tane eklemeyin, böylece başladığınız şeyden ayrılırsınız.
Bu bize çok basit ama uygulanması zor bir algoritma bırakıyor. Bu, mücadelenizin temelini oluşturur.
Hala kafanız karıştıysa, bkz. Http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/ - bu algoritmayı ilk öğrendiğimde okudum
Meydan okuma
Bilgisayar ile Tic-Tac-Toe oyunu oyna. Her adımda, tüm kibrit kutularının içeriğini çıktılayın.
Girdiler
- Programın başında MENACE'ye karşı kaç oyun oynamak istediğinizi söyleyen bir sayı
- Ardından, MENACE'in ilk turundan sonra, hareketinizi iki karakterli bir dize olarak girersiniz, ilk harf Y eksenine karşılık gelen "L", "R" veya "M" (sol, sağ veya orta) olur. Sonra bu kez X eksenine atıfta bulunarak başka bir harf (tekrar, "L", "R" veya "M") girersiniz. Tüm hamleler ve oyunlar için tekrarlayın.
çıktılar
- Her yeni oyunun başında "yeni oyun" çıktı.
- Oyuncunun her hamlesinden sonra, kartı herhangi bir makul formatta çıkartın. Güzel görünmesi gerekmez (örneğin, tahtanın konumlarını temsil eden bir dizi dizi iyidir).
- Oyuncunun her hamlesinden sonra, MENACE bir hamle yapmalıdır. MENACE'in hareketinden sonra kartın çıktısını al
- Her oyundan sonra, tüm 304 kibrit kutusunun içeriğini çıkartın. Boncuklar bir harf, bir renk adı, karakter veya istediğiniz herhangi bir dize veya tamsayı ile gösterilebilir (işaretçi, anonim işlev vb. Yok).
kurallar
- Bu kod golf , bayt en kısa cevap kazanır.
- MENACE'nin yanıtını gördükten sonra hamle girebilmeliyim. Hayır 'tüm hamlelerini bu işleve geçir ve oyunun nasıl oynandığını izle'.
- Oyunlar arasında tahta temizlenmelidir.
- Kibrit gerekir değil (bu makine öğrenimini sıfırlamak olurdu) oyunlar arasında silinebilir
- 304 kibrit kutunuz olmalıdır. Herkes bu algoritmayı tüm 19.683 kibrit kutusuyla uygulayabilir, ancak öğrenme yavaştır (çünkü hepsini yararlı içeriklerle elde etmek için birçok oyun gerektirir ).
- Çıktı herhangi bir makul formatta olabilir ve girdi PPCG standartlarına göre alınabilir (kural 2'ye uygun olduğu sürece). Giriş biçimini ayarlamanız gerekirse (' Giriş ' bölümünde açıklandığı gibi), mantıklı olduğu sürece sorun olmaz.
- Oyun bir oyuncu kazandığında (çapraz, yatay veya dikey olarak üç sırada) veya beraberlik varsa (tahta dolu ve kazanan yok)
- MENACE'in olası hamleleri yapması (ve sadece her kibrit kutusunun içinde olası boncukların olması) gerekmesine rağmen, meydan okuma için kullanıcının girişini doğrulamanız gerekmez. Yanlış bir şey yazarlarsa, programınız her şeyi yapabilir (tamamen delir, hata atma vb.) - girişin doğru olduğunu varsayabilirsiniz.
[[0, 2, 6], [4, 8, 4, 3, 3], [7, 7, 7, 7, 7, 7, 7, 8], [1], ... [3, 3, 5, 4]]
.