最小:0ビット
最大: 1734 243ビット(4.335 4.401ビット/ボード償却)
期待される: 351 177ビット(4.376 4.430ビット/ボード償却)
ただし、入力と出力を決定できるので、この時点までゲームの履歴をエンコードすることにしました。利点の1つは、誰がターンをするかという追加情報が通行人であり、誰がエンコード可能でエンコードできない場所をキャッスルできるかということです。
試行1:
単純に、各動きを12ビット、4つのトリプレットの形式(開始x、開始y、終了x、終了y)でエンコードでき、それぞれが3ビットであると考えました。
開始位置を想定し、そこからピースを移動し、白が最初になります。ボードは(0、0)が白の左下隅になるように配置されます。
たとえば、ゲーム:
e4 e5
Nf3 f6
Nxe5 fxe5
... ...
次のようにエンコードされます。
100001 100010 100110 100100
110000 101010 101110 101101
101010 100100 101101 100100
...
これにより、12 mビットのエンコードが行われます。mは、行われた移動の数です。
一方で、これは非常に大きくなる可能性がありますが、他方では、各動きが独自のゲームであるとみなすことができるため、各エンコードは実際にm個の「チェスボード」をエンコードします。これを償却すると、各「チェスボード」が12ビットであることがわかります。しかし、私はこれが少し不正行為だと感じています...
試行2:
私は、以前の試みの各動きが多くの違法な動きをエンコードしていることに気付きました。そこで、合法的な動きのみをエンコードすることにしました。可能な動きを次のように列挙し、各正方形に(0、0)→0、(1、0)→1、(x、y)→x + 8 yのように番号を付けます。タイルを反復処理し、ピースがそこにあるかどうか、また動くことができるかどうかを確認します。その場合は、位置を追加してリストに移動できます。移動するリストインデックスを選択します。その数値を、1に可能な移動の数を加えた重みで表した移動の合計に加算します。
上記の例:開始位置から移動できる最初のピースは、正方形1の騎士であり、正方形16または18に移動できるため、それらをリストに追加します[(1,16),(1,18)]
。次は、スクエア6のナイトです。動きを追加します。全体的に得られるもの:
[(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)]
移動(12、28)が必要なので、20の可能な移動があるため、これを基数20で13としてエンコードします。
そこで、ゲーム番号g 0
= 13
を取得します
次に、移動のリストを取得するためにタイルを逆順に番号付けする(必要に応じて簡単にするため)以外は、黒についても同じことを行います。
[(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)]
移動(11、27)が必要なので、20の可能な移動があるため、これをベース20の11としてエンコードします。
そこで、ゲーム番号g 1
=(11⋅20)+ 13 = 233
を取得します
次に、次の白の動きのリストを取得します。
[(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)]
移動(6、21)が必要なので、29の可能な移動があるため、これをベース29で13としてエンコードします。
したがって、ゲーム番号g 2
=((13⋅20)+ 11)20 + 13 = 5433を取得します
次に、黒の次の動きのリストを取得します。
[(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)]
移動したいので$(10、18)$(10、18)
したがって、ゲーム数g 3
=(((19⋅29 + 13)20)+ 11)20 + 13 = 225833
そして、残りのすべての動きに対してこのプロセスを続けます。gは関数g(x、y、z)= x y + zとして考えることができます。したがって、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(g(1、1、19 )、29、13)、20、11)、20、13 )
ゲーム番号g 0をデコードするには、最初の位置から開始し、可能なすべての動きを列挙します。次に、g 1 = g 0 // l、m 0 = g 0%lを計算します。ここで、lは可能な移動の数、「//」は整数除算演算子、「%」はモジュラス演算子です。g 0 = g 1 + m 0を保持する必要があります。次に、m 0を移動して繰り返します。
上記の例から、g 0 = 225833の場合、g 1 = 225833 // 20 = 11291およびm 0 = 225833%20 =13。次に、g 2 = 11291 // 20 = 564およびm 1 = 11291%20 = 11。g 3 = 11291 // 20 = 564およびm 2 = 11291%20 =11。したがって、g 4 = 564 // 29 = 19 and_m_ 3 = 564%29 = 13.最後にg 5 = 19 // 29 = 0およびm 4 = 19%29 = 19。
このようにゲームをエンコードするために何ビットが使用されますか?
簡単にするために、各ターンに常に20の動きがあり、最悪のシナリオでは常に最大の19を選択するとします。得られる数は19⋅20 mです
+ 19⋅20 m-1
+ 19⋅20 m-2
+⋯+ 19⋅20 + 19 = 20 m + 1
− 1ここで、_mは動きの数です。20 m + 1
− 1 をエンコードするに
は、約(m + 1)∗ log 2
(20)= 4.3219 ∗(m + 1)で
ある約log 2
(20 m + 1)ビットが必要です
平均してm = 80(プレーヤーあたり40の動き)であるため、これにはエンコードに351ビットが必要です。多くのゲームを録画する場合、各数値に必要なビット数がわからないため、ユニバーサルエンコーディングが必要になります。
m = 400(プレーヤーごとに200の移動)の場合の最悪のケースであるため、エンコードには1734ビットが必要です。
エンコードする位置は、ルールに従うことでそこに到達するための最短パスを介して与えられなければならないことに注意してください。たとえば、ここで理論化されたゲームは、最終位置をエンコードするためにm = 11741を必要としません。代わりに、幅優先検索を実行して、その位置への最短パスを見つけ、代わりにエンコードします。すべてのチェスのポジションを列挙するためにどれだけ深くする必要があるかはわかりませんが、400は過大評価であると思われます。
迅速な計算:
12個のユニークなピースがあるか、正方形が空になっている可能性があるため、チェスボードに配置するには13 64です。多くの無効なポジションが含まれているため、これは非常に過大評価です。私たちがしている場合は、m個のゲームに移動し、私たちは約20作成したm個の位置を。したがって、20 m = 13 64の場合を探しています。両側を記録して、m = 64 * log 20(13)= 54.797を取得します。これは、55の動きで任意の位置に到達できることを示しています。
今、私がする最悪の場合を計算していることメートル 55ではない= メートル、私は私の結果を= 400を編集します。m = 55の位置をエンコードするには243ビットかかります。また、平均的なケースはm = 40程度であり、エンコードに177ビットかかると言います。
以前の償却引数を使用すると、1734ビットで400個の「チェスボード」をエンコードするため、最悪の場合、各「チェスボード」は4.335ビットを占有します。
g = 0は有効なゲームを意味することに注意してください。これは、最も低い正方形のピースが可能な限り最も低い正方形に移動するゲームです。
その他の注意事項:
ゲーム内の特定の位置を参照する場合は、インデックスをエンコードする必要があります。これは手動で追加することができます。たとえば、インデックスをゲームに連結するか、各ターンで可能な最後の動きとして「エンド」ムーブを追加します。これは、負けたプレーヤー、または引き分けに同意したプレーヤーを示すために2つ続けてプレーヤーを説明できます。これは、ゲームが位置に基づいてチェックメイトまたはステイルメイトで終了しなかった場合にのみ必要です。この場合、それは暗黙的です。この場合、必要なビット数は平均で356、最悪の場合は1762になります。