最小:0位
最高: 1734 243位(4.335 4.401位/板摊销)
预期: 351 177位(4.376 4.430位/板摊销)
由于我可以确定输入和输出,因此我希望直到现在为止都对游戏的历史进行编码。优点之一是,可以得到哪些人转身,被转为谁以及谁有能力隐瞒位置的附加信息可以被导出而不进行编码。
尝试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为13,因为有20种可能的移动。
现在我们得到游戏号码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),因此我们将其编码为11以20为底数,因为有20种可能的移动。
所以现在我们得到游戏号码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中将此编码为13,因为有29种可能的移动。
所以现在我们得到游戏号码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进行编码,
我们需要大约log 2
(20 m + 1
)位,大约为(m + 1)* log 2
(20)= 4.3219 *(m + 1)
平均而言,m = 80(每位玩家40步),因此编码需要351位。如果我们要录制很多游戏,我们将需要通用编码,因为我们不知道每个数字需要多少位
最糟糕的情况是m = 400(每位玩家200步),因此这将需要1734位进行编码。
注意,要编码的位置必须通过最短的路径提供给我们,以便遵循规则。例如,此处理论化的游戏不需要m = 11741即可编码最终位置。相反,我们运行“广度优先”搜索以找到到该位置的最短路径并对其进行编码。我不知道我们需要去列举所有棋位置有多深,但是我怀疑400是高估了。
快速计算:
有12个独特的棋子,或者正方形可以是空的,因此将其放置在棋盘上的数字是13 64。这是一个极大的高估,因为它包含许多无效职位。当我们米运动进入游戏我们有大约20点创造米的位置。所以我们正在寻找20 m = 13 64的时间。记录双方,得到m = 64 * log 20(13)= 54.797。这表明我们应该能够在55个动作中到达任何位置。
现在,我计算出最坏的情况是m = 55而不是m = 400,我将编辑结果。要编码m = 55 的位置需要243位。我还要说的是,平均情况约为m = 40,需要177位编码。
如果我们使用较早的摊销参数,则将1734位编码为400个“棋盘”,因此在最坏的情况下,每个“棋盘”都占用了4.335位。
请注意,g = 0表示有效的游戏,在该游戏中,最低方格上的棋子会移动到最低方格。
补充笔记:
如果要引用游戏中的特定位置,则可能需要对索引进行编码。这可以手动添加,例如将索引连接到游戏,也可以添加额外的“结束”动作作为每回合的最后一次可能动作。现在可以考虑让步的球员,或者连续2表示同意平局的球员。仅在游戏没有基于位置结束或陷入僵局的情况下才有必要,在这种情况下,这是隐含的。在这种情况下,平均需要的位数为356,在最坏的情况下为1762。