在早期的比赛中有多少种不同的方法可以成为对手?


15

我们都知道,最短的将死是4层:

  1. f3 e5

  2. g4 Qh5#

这不是唯一可能的移动顺序。实际上,有8个,具体取决于白色是先移动f还是g典当,他是否将f典当移动到f3或f4以及黑色是播放e6还是e5。当然,这仅占可能的4层动作顺序的一小部分,但这是唯一可以结束比赛的动作。

我要寻找的是,对于少量的层板,有多少移动序列以将死结束而不是将死结束。理想情况下,我想要的是类似以下内容的内容

  • 4层:X个非重合序列,8个4层重合
  • 5层:Y个非将对数序列,8个4层将对数,N个5层将对数
  • 6层:Z个非将对数序列,8个4层将对数,N个5层将对数,M 6层将对数

以此类推,以尽其所能。

这是受到Math.SE问题的启发,该问题涉及两名玩家进行同一棋类游戏的随机动作的概率。我怀疑短期比赛在该概率中占主导地位,这应该使该概率易于估算,但最好能使用实数。


1
您可能会感兴趣的相关(但不相同)问题:Chess.stackexchange.com/questions/24359/…–
itub

2
根据您所提出的问题,您可能还想知道,由于重复大约8层,游戏可以以平局告终。
DM

1
我认为您在此处要查询的数据不足以为Math.SE问题中的概率提供准确的界限。您需要有关游戏树结构的更多信息。(举一个说明性的反例,考虑一个游戏,第一步有两个可能的选择:A和B。如果第一步是A,则第二步有100万种不同的可能选择,而如果是B,则唯一可能的第二个动作是C。现在游戏有1,000,001个可能的两个动作序列,但是随机玩家结束玩序列B,C的概率是50%。)
Ilmari Karonen

@IlmariKaronen是的,自从我发布问题以来,我就想到了这一点。但是,我不认为游戏树的分支比例上的差异会迅速增加,除非包含支票的行。如果对概率的总贡献随层数迅速下降,则近似值应该仍然可以正常工作。
eyeballfrog

Answers:


26

没有0-3层的将死。

4 ply: 8 checkmates, 197,281 total nodes
5 ply: 347 checkmates, 4,865,609 total nodes
6 ply: 10,828 checkmates, 119,060,324 total nodes
7 ply: 435,767 checkmates, 3,195,901,860 total nodes
8 ply: 9,852,036 checkmates, 84,998,978,956 total nodes
9 ply: 400,191,963 checkmates, 2,439,530,234,167 total nodes

“将死”是在最后一层进行的将要死掉的次数。因此,对于5层而言,有347个长度为5的校验序列。

这些值来自:https : //www.chessprogramming.org/Perft_Results

当前,由于所需的计算资源,目前没有用于10层及以上的Checkmate数据。

为了获取更多特定数据(例如,行本身),您需要编写自己的perft程序,该程序将保存以checkmate结尾的行。


13

该整数序列在“整数序列在线百科全书”(OEIS)中被称为A079485,已知多达13层的数字,包括各种参考文献。


REFERENCES Homer Simpson, Chess Review, Jan-Feb 1982. 好吧,我做了一部分,但这很有趣……
Michael

OEIS确实拥有一切,不是吗?
eyeballfrog '19

8

这是一个简单的Python程序,可以回答问题,但是很慢,需要40分钟才能在笔记本电脑上运行5层(每增加一层至少增加30倍)。一件好事是,如果需要,它可以打印出游戏。我可以在这里发布输出,但是不想做一个347行的长答案... :-)

import chess
from chess import pgn

def dfs(board, depth):
    global n
    result = board.result(claim_draw=True)
    if result != '*':
        game = pgn.Game.from_board(board)
        print(game.mainline())
    elif depth > 0:
        moves = list(board.legal_moves)
        for move in moves:
            n += 1
            board.push(move)
            dfs(board, depth-1)
            board.pop()

n = 0
try:
    board = chess.Board()
    dfs(board, 4)
except KeyboardInterrupt:
    pass
print(n, 'positions checked')

为了将来的参考,您可以在pastebin.com上抛出类似输出的内容。选择永不过期。
詹森·C

上面的评论表明,进行此计算可能需要探索实际的游戏树,因此该程序可能会很有帮助。谢谢。
eyeballfrog '19

7

我最了解这种分析的人是弗朗索瓦·拉塞尔(FrançoisLabelle),他计算了许多与国际象棋有关的数字(包括对国际象棋游戏数量的最大增长率的估计值,作为层数的函数),尤其是计算了最多13层的将棋子的数量。有关最多12层的值,请参见http://wismuth.com/chess/chess.html中的图。

然后在http://wismuth.com/chess/statistics-games.html上,他给出了第13层的具体数字,该层显然有346,742,245,764,219个将死游戏。

对于比赛的总数,他引用了其他人的成绩,这些人的成绩上升到15(!),但我认为他们没有追踪同伴。

在5到13层时,每10,000个机会中有1个机会会带来交配。但是,与白色相比,与黑色的交配似乎要容易得多:

层与配偶机会的关系图

白棋和黑棋的游戏数量增长率也更高,但这仅约为1%,远低于此处确定的模式。

我喜欢国际象棋的随机游戏。如果有多个世界的假设成立,那么有时将其与在线量子随机数生成器链接在一起,拥有一个可以玩所有国际象棋的程序,将是很好的选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.