Min: 0 bit
Max: 1734 243 bit (4,335 4.401 bit / tahta itfa edildi
Beklenen: 351 177 bit (4,376 4.430 bit / tahta itfa edildi)
Girdi ve çıktıyı belirleyebildiğim için ancak istediğim kadarıyla oyunun tarihini kodlayana kadar devam etmeye karar verdim. Bir avantaj, sıranın kim olduğuna, pasaplayan ve kim türetilip kodlanamayacağına kale yapma kabiliyetine sahip olmasıdır.
Girişimi 1:
Naif bir şekilde her hareketi 12 bit, formun 4 üçlüsü (başlangıç x, başlangıç y, bitiş x, son y) olarak kodlayabileceğimi düşündüm, burada her biri 3 bit.
Başlama pozisyonunu alır ve parçaları önce beyaz olacak şekilde hareket ettirirdik. Tahta (0, 0) beyazın sol alt köşesinde olacak şekilde düzenlenmiştir.
Örneğin oyun:
e4 e5
Nf3 f6
Nxe5 fxe5
... ...
Olarak kodlanmış olur:
100001 100010 100110 100100
110000 101010 101110 101101
101010 100100 101101 100100
...
Bu, 12 m bitlik bir kodlamaya yol açar, burada m yapılan hareketlerin sayısıdır
Bir yandan bu diğer yandan her kodlama gerçekten kodlar yüzden kendi oyun olması her hamleyi düşünebiliriz, gerçekten büyük alabilir m "satranç tahtaları". Eğer bunu itfa etmişseniz, her "satranç tahtasının" 12 bit olduğunu görürsünüz. Ama bunun biraz aldatma olduğunu hissediyorum ...
2. girişimi:
Önceki denemedeki her hareketin birçok yasadışı hareketi kodladığını fark ettim. Bu yüzden sadece yasal hareketleri kodlamaya karar verdim. Olası hamleleri şu şekilde sıralarız; her kareyi (0, 0) → 0, (1, 0) → 1, (x, y) → x + 8 y olacak şekilde numaralandırın. Döşemeler arasında yineleyin ve bir parçanın olup olmadığını ve hareket edip etmediğini kontrol edin. Eğer öyleyse pozisyonları ekleyin bir listeye gidebilirsiniz. Yapmak istediğiniz hareketin liste dizinini seçin. Bu sayıyı, 1 artı ağırlıklı hareketlerin toplam hareketine ve olası hareketlerin sayısına ekleyin.
Yukarıdaki gibi örnek: Başlangıç konumundan hareket edebilen ilk parça, kare 1'deki şövalyedir, kare 16 veya 18'e gidebilir, bu yüzden bunları listeye ekleyin [(1,16),(1,18)]
. Sırada karede 6 olan şövalye, hareketlerini ekle. Genel olarak biz alırız:
[(1,16),(1,18),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(11,19),(11,27),(12,20),(12,28),(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]
Hareketi istediğimizden (12, 28), 20 olası hareket olduğundan, bunu üs 20'de 13 olarak kodladık.
Şimdi oyun numarasını g 0
= 13
alıyoruz
Daha sonra siyah için de aynısını yaparız, ancak hamlelerin listesini almak için karoları ters olarak numaralandırırız (kolaylaştırmak, gerekli değildir):
[(1,16),(1,18),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(11,19),(11,27),(12,20),(12,28),(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]
Hareketi istediğimizden (11, 27), 20 olası hareket olduğundan, bunu üs 20'de 11 olarak kodladık.
Şimdi oyun numarasını g 1
= (11 11 20) + 13 = 233 olarak
alıyoruz.
Sonra beyaz için aşağıdaki hamle listesini alırız:
[(1,16),(1,18),(3,12),(3,21),(3,30),(3,39),(4,12),(5,12),(5,19),(5,26),(5,33),(5,40),(6,12),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(11,19),(11,27)(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]
Hareketi istediğimizden (6, 21), 29 olası hamle olduğundan bunu taban 29'da 13 olarak kodladık.
Öyleyse şimdi g 2
= ((13 ⋅ 20) + 11) 20 + 13 = 5433
Sonra kara için aşağıdaki hamle listesini alırız:
[(1,11),(1,16),(1,18),(2,11),(2,20),(2,29),(2,38),(2,47),(3,11),(4,11),(4,18),(4,25),(4,32),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(12,20),(12,28),(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]
Harekete geçmek istediğimiz için $ (10, 18) $ (10, 18)
Öyleyse şimdi g 3
= (((19 ⋅ 29 + 13) 20) + 11) 20 + 13 = 225833
Ve kalan tüm hareketler için bu işleme devam edin. G işlevini g (x, y, z) = x y + z işlevi olarak düşünebilirsiniz . Böylece g 0
= gr (1, 1, 13), g 1
= gr (g (1, 1, 11), 20, 13), g 2
= gr (g (g (1, 1, 13), 20, 11), 20, 13), g 3
= gr (g (g (g (1, 1, 19), 29, 13), 20, 11), 20, 13)
Bir oyun numarasını g 0 kodunu çözmek için , başlangıç pozisyonundan başlıyoruz ve tüm olası hareketleri numaralandırıyoruz. Sonra hesaplarsak g 1 = g 0 // l , m 0 = g % 0 l , burada l olası hareketlerin sayısıdır, '//' tamsayı bölme işleci ve '%' modulus işlecidir. Şunu tutmalı ki g 0 = g 1 + m 0 olmalıdır . Sonra m 0 hamlesini yaparız ve tekrar ederiz .
Örneğin yukarıda eğer g 0 = 225.833 sonra gr 1 = 225.833 // 20 = 11291 ve m, 0 = 225.833% 20 = 13. Sonraki g 2 = 11291 // 20 = 564 ve m, 1 20 = 11. O = 11291% g 3 = 11291 // 20 = 564 ve m, 2 = 11291% 20 = 11. Bu nedenle g 4 = 564 // = 19 29 and_m_ 3 = 564% 29 = 13. Son olarak gr 5 = 19 // 29 = 0 ve m 4 =% 19 29 = 19.
Peki bu şekilde bir oyunu kodlamak için kaç bit kullanılır?
Sadelik için, her seferinde 20 hamle olduğunu ve en kötü senaryoda her zaman en büyük olanı seçtiğimizi varsayalım, 19 alacağımız sayı 19 ⋅ 20 m
+ 19 ⋅ 20 m-1
+ 19 ⋅ 20 m-2
+ ⋯ + 19 ⋅ 20 + 19 = 20 m + 1
- 1, burada _m, hareket sayısıdır. 20 m + 1
- 1 kodlamak için log 2'ye
(20 m + 1) ihtiyacımız var.
) bit (yaklaşık + m) olan ∗ log 2
(20) = 4.3219 ∗ (m + 1) değerine ihtiyacımız vardır.
Ortalamada m = 80 (oyuncu başına 40 hamle) bu yüzden kodlaması 351 bit alacaktı. Eğer birçok oyun kaydedersek, evrensel bir kodlamaya ihtiyacımız olurdu, çünkü her bir numaranın kaç bit'ine ihtiyacı olacağını bilmiyoruz.
En kötü durum ne zaman M = 400 (oyuncu başına 200 hamle) bu yüzden kodlamak için 1734 bit alacaktır.
Kodlamak istediğimiz konumun, kuralları izleyerek oraya ulaşmak için en kısa yoldan bize verilmesi gerektiğini unutmayın. Mesela oyun burada teorik son konumu kodlamak için m = 11741'e ihtiyacı yoktur . Bunun yerine, o konuma giden en kısa yolu bulmak ve bunun yerine onu kodlamak için bir Genişlik-Birinci araştırması yaparız. Tüm satranç pozisyonlarını sıralamak için ne kadar derine ihtiyacımız olacağını bilmiyorum, ama 400'ün fazla tahmin edildiğinden şüpheleniyorum.
Hızlı hesaplama:
12 benzersiz parça var ya da kare boş olabilir, böylece onları bir satranç tahtasında konumlandırmak için 13 64'tür . Bu, çok fazla geçersiz pozisyon içerdiğinden çok fazla abartılıyor. Biz ne zaman m oyuna hamle biz 20 hakkında oluşturduk m pozisyonları. Yani 20 m = 13 64 olanı arıyoruz . Her iki tarafa da giriş yaparak m = 64 * log 20 (13) = 54.797 kaydedin. Bu, 55 hamlede herhangi bir pozisyona geçmemiz gerektiğini gösteriyor.
Şimdi en kötü durumda hesapladım m = 55 değil m = 400 olarak sonuçlarımı düzenleyeceğim. M = 55'in 243 bit aldığı bir pozisyonu kodlamak için . Ayrıca ortalama bir durumun olduğunu söyleyebilirim. m = 40 bunun kodlanmasının 177 bit .
Eğer amortisman argümanını eskiden kullanırsak, 1734 bitte 400 "satranç tahtasını" kodluyoruz, böylece her "satranç tahtasının" en kötü durumda 4.335 bit aldığı anlaşılıyor.
Bunu not et gr = 0, geçerli bir oyun, tek göstermekte olup burada olabildiğince düşük kareye en düşük kare hamle üzerine parça.
Ek Notlar:
Oyunda belirli bir pozisyona atıf yapmak istiyorsanız endeksi kodlamanız gerekebilir. Bu, manuel olarak eklenebilir, örneğin, dizini oyuna birleştirmek veya her turda mümkün olan en son hamle olarak ek bir "son" hareketi eklemek olabilir. Bu şimdi oyuna katılan oyuncuları ya da berabere kabul edilen oyuncuları belirtmek için art arda 2 hesabı oluşturabilir. Bu, yalnızca oyun pozisyona göre bir çek arkadaşı veya çıkmazla bitmediyse gereklidir, bu durumda ima edilir. Bu durumda, ortalama olarak 356'ya ve en kötü durumda 1762'ye ihtiyaç duyulan bit sayısını getirir.