Min: 0 Bits
Max: 1734 243 Bits (4,335 4.401 Bits / Platine abgeschrieben)
Erwartet: 351 177 Bits (4,376 4.430 Bits / Platine abgeschrieben)
Da ich die Eingabe und Ausgabe jedoch bestimmen kann, möchte ich, dass ich mich bis zu diesem Punkt für die Codierung der Spielhistorie entscheide. Ein Vorteil ist, dass die zusätzlichen Informationen darüber, wer an der Reihe ist, nicht weitergegeben werden und wer die Fähigkeit hat, sich zu verschließen, wo sie abgeleitet und nicht verschlüsselt werden können.
Versuch 1:
Naiv dachte ich, dass ich jeden Zug in 12 Bits, 4 Tripletts der Form (Start x, Start y, Ende x, Ende y), codieren kann, wobei jedes 3 Bits ist.
Wir würden die Ausgangsposition einnehmen und die Teile von dort wegbewegen, wobei Weiß zuerst geht. Die Tafel ist so angeordnet, dass (0, 0) die linke untere Ecke von Weiß ist.
Zum Beispiel das Spiel:
e4 e5
Nf3 f6
Nxe5 fxe5
... ...
Wäre codiert als:
100001 100010 100110 100100
110000 101010 101110 101101
101010 100100 101101 100100
...
Dies führt zu einer Codierung von 12 m Bits, wobei m die Anzahl der durchgeführten Bewegungen ist
Einerseits könnte dies sehr groß werden, andererseits kann man jeden Zug als eigenes Spiel betrachten, so dass jede Kodierung wirklich m "Schachbretter" kodiert . Wenn Sie dies amortisieren, erhalten Sie, dass jedes "Schachbrett" 12 Bits hat. Aber ich denke, das ist ein bisschen schummeln ...
Versuch 2:
Mir wurde klar, dass jeder Zug des vorherigen Versuchs viele illegale Züge enthält. Also habe ich mich entschieden, nur legale Züge zu kodieren. Wir zählen mögliche Züge wie folgt auf und nummerieren jedes Quadrat so, dass (0, 0) → 0, (1, 0) → 1, (x, y) → x + 8 y. Durchlaufen Sie die Kacheln und prüfen Sie, ob ein Teil vorhanden ist und sich bewegen kann. Wenn ja, fügen Sie die Positionen hinzu, die es zu einer Liste gehen kann. Wählen Sie den Listenindex aus, den Sie verschieben möchten. Addiere diese Zahl zur laufenden Summe der Züge, gewichtet mit 1 plus der Anzahl der möglichen Züge.
Beispiel wie oben: Ausgehend von der Startposition kann sich der Ritter auf Feld 1 als erstes auf Feld 16 oder 18 bewegen. Fügen Sie diese also der Liste hinzu [(1,16),(1,18)]
. Als nächstes kommt der Ritter auf Feld 6 und fügt seine Züge hinzu. Insgesamt bekommen wir:
[(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)]
Da wir den Zug (12, 28) wollen, codieren wir diesen als 13 in Basis 20, da es 20 mögliche Züge gibt.
So, jetzt bekommen wir die Spielnummer g 0
= 13
Als nächstes machen wir dasselbe für Schwarz, außer dass wir die Kacheln in umgekehrter Reihenfolge nummerieren (um es einfacher zu machen, nicht erforderlich), um die Liste der Züge zu erhalten:
[(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)]
Da wir den Zug (11, 27) wollen, codieren wir diesen als 11 in Basis 20, da es 20 mögliche Züge gibt.
Jetzt erhalten wir also die Spielnummer g 1
= (11 ⋅ 20) + 13 = 233
Als nächstes erhalten wir die folgende Liste von Zügen für Weiß:
[(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)]
Da wir den Zug (6, 21) wollen, codieren wir diesen als 13 in Basis 29, da 29 mögliche Züge vorhanden sind.
Jetzt erhalten wir also die Spielnummer g 2
= ((13 ⋅ 20) + 11) 20 + 13 = 5433
Als nächstes erhalten wir die folgende Liste von Zügen für Schwarz:
[(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)]
Da wollen wir den Zug $ (10, 18) $ (10, 18)
Jetzt erhalten wir also die
Spielnummer g 3 = (((19 ⋅ 29 + 13) 20) + 11) 20 + 13 = 225833
Und setzen Sie diesen Vorgang für alle verbleibenden Züge fort. Sie können sich g als die Funktion g (x, y, z) = x y + z vorstellen. Somit ist g 0
= g (1, 1, 13), g 1
= g (g (1, 1, 11), 20, 13), g 2
= g (g (g (1, 1, 13), 20). 11), 20, 13), g 3
= g (g (g (g (1, 1, 19), 29, 13), 20, 11), 20, 13)
Um eine Spielnummer g 0 zu dekodieren , beginnen wir an der Anfangsposition und zählen alle möglichen Züge auf. Dann berechnen wir g 1 = g 0 // l , m 0 = g 0 % l , wobei l die Anzahl der möglichen Bewegungen ist, '//' der Ganzzahlteilungsoperator ist und '%' der Moduloperator ist. Es sollte gelten, dass g 0 = g 1 + m 0 ist . Als nächstes machen wir den Zug m 0 und wiederholen.
Aus dem obigen Beispiel, wenn g 0 = 225833, dann ist g 1 = 225833 // 20 = 11291 und m 0 = 225833% 20 = 13. Als nächstes ist g 2 = 11291 // 20 = 564 und m 1 = 11291% 20 = 11. Dann g 3 = 11291 // 20 = 564 und m 2 = 11291% 20 = 11. Daher g 4 = 564 // 29 = 19 und m 3 = 564% 29 = 13. Schließlich g 5 = 19 // 29 = 0 und m 4 = 19% 29 = 19.
Wie viele Bits werden also verwendet, um ein Spiel auf diese Weise zu codieren?
Nehmen wir der Einfachheit halber an, es gibt immer 20 Züge pro Runde, und im schlimmsten Fall wählen wir immer den größten, 19. Die Zahl, die wir erhalten, ist 19 19 20 m
+ 19 ⋅ 20 m-1
+ 19 ⋅ 20 m-2
+ ⋯ + 19 ⋅ 20 + 19 = 20 m + 1
- 1 wobei _m die Anzahl der Züge ist. Um 20 m + 1
- 1 zu codieren, benötigen wir ungefähr log 2
(20 m + 1
) Bits, was ungefähr (m + 1) ∗ log 2
(20) = 4,3219 ∗ (m + 1) ist.
Im Durchschnitt ist m = 80 (40 Züge pro Spieler), so dass die Codierung 351 Bits benötigt. Wenn wir viele Spiele aufnehmen würden, bräuchten wir eine universelle Codierung, da wir nicht wissen, wie viele Bits jede Zahl benötigt
Im schlimmsten Fall, wenn m = 400 (200 Züge pro Spieler), würde dies 1734 Bits zum Codieren erfordern.
Beachten Sie, dass die Position, die wir codieren möchten, auf dem kürzesten Weg angegeben werden muss, um unter Einhaltung der Regeln dorthin zu gelangen. Zum Beispiel benötigt das hier theoretisierte Spiel nicht m = 11741, um die endgültige Position zu kodieren. Stattdessen führen wir eine Breitensuche durch, um den kürzesten Weg zu dieser Position zu finden, und codieren ihn stattdessen. Ich weiß nicht, wie tief wir gehen müssten, um alle Schachpositionen aufzuzählen, aber ich vermute, dass 400 eine Überschätzung ist.
Schnelle Berechnung:
Es gibt 12 Einzelstücke oder das Quadrat kann leer sein, um sie auf einem Schachbrett zu positionieren, ist 13 64 . Dies ist eine enorme Überschätzung, da es viele ungültige Positionen enthält. Wenn wir m bewegt sich in das Spiel haben wir etwa 20 erstellt m Positionen. Wir suchen also nach 20 m = 13 64 . Protokollieren Sie beide Seiten, um m = 64 * log 20 (13) = 54,797 zu erhalten. Dies zeigt, dass wir in 55 Zügen in der Lage sein sollten, jede Position zu erreichen.
Nun, da ich den schlimmsten Fall mit m = 55 und nicht mit m = 400 berechnet habe, werde ich meine Ergebnisse bearbeiten. Um eine Position zu codieren, an der m = 55 ist, werden 243 Bits benötigt. Ich werde auch sagen, dass der Durchschnittsfall bei m = 40 liegt, was 177 Bits zum Codieren erfordert.
Wenn wir das Amortisationsargument von früher verwenden, codieren wir 400 "Schachbretter" in 1734 Bits, so dass jedes "Schachbrett" im schlimmsten Fall 4,335 Bits belegt.
Beachten Sie, dass g = 0 ein gültiges Spiel bezeichnet, bei dem sich die Figur auf dem untersten Feld zum untersten Feld bewegt, das es kann.
Zusätzliche Bemerkungen:
Wenn Sie sich auf eine bestimmte Position im Spiel beziehen möchten, müssen Sie möglicherweise den Index codieren. Dies kann entweder manuell hinzugefügt werden, z. B. indem der Index dem Spiel zugeordnet wird, oder indem ein zusätzlicher "End" -Zug als letztmöglicher Zug in jeder Runde hinzugefügt wird. Dies kann nun die Gegentore der Spieler oder 2 in Folge zur Kennzeichnung der Spieler berücksichtigen, die einem Unentschieden zugestimmt haben. Dies ist nur erforderlich, wenn das Spiel nicht aufgrund der Position mit einem Schachmatt oder einer Pattsituation endete. In diesem Fall ist dies impliziert. In diesem Fall wird die Anzahl der durchschnittlich benötigten Bits auf 356 und im schlimmsten Fall auf 1762 erhöht.