围棋吧 关注:349,589贴子:10,595,022
  • 16回复贴,共1

围棋的变化究竟有多少?

只看楼主收藏回复

本文作者“终军弱冠”,发布于知乎和奇略研究所公众号,已得授权。
俗话说“千古无同局”,说的是有史以来所有的围棋棋局没有两局是一模一样的。但是这个说法很难证实,因为并非所有的对局都被保存和记录了下来,而且由于计算机和网络的出现,使得围棋的对局数量(无论是人类对人类、AI 对 AI 还是人类对 AI)都在迅速增加,我们没法确认是不是真有两局棋下得一模一样。所以“千古无同局”实际上是在感叹围棋的变化之多。那么问题就来了,围棋的变化到底有多少呢?
在本篇中,我们将介绍一些对围棋棋局数量的估计结果。需要特别指出的是,这里我们考察的是围棋棋局的理论数量,那些在人类对局中不可能出现的对局(但是只要是符合规则的)都将被计算在内。另外,从理论上讲,围棋棋局的长度可以是天文数字,而不是人类对局时的几百手。因此,我们这里讨论的棋局数量要比现实中可能出现的棋局数量多得多。
★介绍★
在讨论之前,我们首先明确一下使用的规则。围棋的基本规则在世界各地都是差不多的,无非是就没气的棋子需要被提走。但是在遇到“劫争”时,类中国规则是比较完备的规则,其中的“禁止全局同形”这一条保证了棋局可以在有限的着数内终止。
“禁全同”其实有两种解释—— PSK(positional superko)和 SSK(situational superko)。PSK 指的是落子后不能使局面与这局棋曾经出现过的局面一样;SSK 指的是落子后不能使对手面临的局面与这局棋中曾经面临过的局面一样。本文中,我们使用的是 PSK 解释的“禁全同”规则。
“禁全同”避免了棋局在发生劫争(或者多劫循环、长生劫等)时陷入到无限循环中。另外,“禁全同”规则要求行棋后形成的局面是未曾出现过的,而围棋的合法局面数量显然是有限的,所以“禁全同”从理论上保证了棋局不会无限地进行下去。
接着,我们来看一下博弈游戏的复杂度的概念。游戏的复杂度可以从多个角度进行讨论,我们这里简单介绍几个指标:
状态空间复杂度(state-space complexity):这个比较好理解,就是指游戏的合法局面数量,有时候还要求局面是可达的(即可以从初始状态经过有限的着法到达)。2016年,Tromp 和 Farneback [1] 得到了 19 路标准围棋合法局面数量的精确值,并对合法局面数量的渐进作了猜测。本文中,我们用L(m,n)表示m×n路围棋的合法局面数量,另外我们定义 L(n)≡ L(m,n)。
博弈树的规模(game tree size):我们把每个棋局状态看作是节点,而节点的每个分枝都表示一种可能的着法。博弈树指的是就是由这些状态节点形成的树形结构,而其规模指的是树上叶子节点的数量,也即符合规则的棋局总量。本文中,我们用N(m,n)表示m×n路围棋的棋局数量,另外我们定义N(n)≡N(n,n) 。由于N(n)非常巨大,所以在计算时我们经常对其取两次对数。
计算复杂性(computational complexity):这个概念就比较抽象了,它指的是解决某个问题需要的计算资源(通常是时间和空间)的量。一般我们会用一些计算复杂性类来对问题进行分类。1980年,Lichtenstein 和 Sipser [3] 证明了“禁全同”规则下的围棋属于 PSPACE-hard 复杂性类。1983年,Robson [4] 证明了日本规则下的围棋属于 EXPTIME-complete 复杂性类。
本文我们主要讨论围棋的博弈树规模,我们介绍几个对围棋棋局总量的估计结果,这些估计的精度是逐步递进的。
第一节我们谈两个平凡的结论;第二节我们介绍 Tromp 和 Farneback 对棋局数量上下界的改进;第三节我们介绍 nested scheme 方法,以及应用该方法得到的结果;第四节我们简单总结一下。


IP属地:北京1楼2022-02-07 17:21回复
    不知道之前有没有类似文章,本文较长,预计需要缓慢更新几天,有人着急看全文可以在微信公众号【奇略研究所】内查看,就不放链接了


    IP属地:北京2楼2022-02-07 17:28
    回复
      2025-05-14 11:31:47
      广告
      1.平凡的上下界
      1.1 平凡的下界
      我们先来看棋局数量的一个平凡下界。需要指出的是,这里的平凡下界有时候会被错误地认为是棋局数量的“上界”。
      设所有的棋都由黑方下,白方全部 pass,那么黑棋可以下n²-1手,容易发现,这样的棋局数量为(n²)! 。不过这个表示形式比较别扭,我们用 Stirling's approximation 来重新表示一下:

      再取一次对数,得到:

      这就是lnlnN(n) 的一个平凡的下界。当 n=19 时,我们可以直接计算:

      这个值已经不小了,相当于 1 后面有几百个 0,但是比起后面的一些数值来就是小巫见大巫了。
      1.2 平凡的上界
      我们再来看平凡上界。由于我们考虑的是 PSK 规则下的棋局,所以一局棋的实着(有落子的着法,相对于虚着)数量不会超过围棋的合法局面数,而合法局面数量的一个平凡上界是 ,所以任何棋局的长度(手数)不会超过,另外每手棋最多有 n²+1种可能,所以棋局数量不会超过
      这个表达式看起来很不舒服,我们还是用取对数的方法

      这就是lnlnN(n)的一个平凡上界。当n=19时,我们可以直接计算


      IP属地:北京3楼2022-02-07 17:42
      回复
        今日暂停,复制文字处理数学公式太麻烦


        IP属地:北京4楼2022-02-07 17:45
        回复
          蹲个后续


          IP属地:上海5楼2022-02-07 17:59
          收起回复
            反正就是数字很大


            IP属地:陕西来自Android客户端6楼2022-02-07 18:38
            回复
              插眼


              IP属地:广东来自Android客户端7楼2022-02-08 05:04
              回复
                👀


                IP属地:江苏来自Android客户端8楼2022-02-08 09:45
                回复
                  2025-05-14 11:25:47
                  广告
                  目前图片上传不了了,等会看看


                  IP属地:北京9楼2022-02-08 15:16
                  回复
                    一组典型的格雷码的生成方法也很精巧。可以用这样的方法生成:将 Gn中的每个代码最后加一个“0”;加上 Gn的所有代码逆向排列,然后在每个代码后面加一个“1”。容易验证,这样生成出来的每个代码与前一个代码只差一个二进制位。
                    现在,我们来看一下如何用长度为 3 的格雷码生成 3 路棋盘上a的棋局,见下图

                    棋盘上方的三个交叉点只能落黑子,下方三个交叉点只能落白子,中间三个交叉点用于表示格雷码。
                    一开始,第一个雷码是“000”,所以上方三个交叉点都落黑子,白方则 pass;第二个格雷码是“100”,所以中间一行最左侧的点落黑子;第三个格雷码是“110”,所以棋盘最中间的点落黑子;第四个格雷码是“010”,这里出现了“翻转”,之前的每个格雷码都是在上一个码的某个二进制位上加 1 得到,但是第四个码是在第三个码的第一位上减 1 得到,因此进入了白棋的“轮次”,白方先在下方连续落三个白子,然后在中间一行最右侧的点落子,从而将黑棋全部提走;接下去的过程是类似的(注意,这张图片中的最右下一幅小图貌似有点错误)。
                    容易验证,在所生成的棋局中,没有局面重复,即满足“禁全同”规则,然后我们来考察所生成棋局的数量。由于每次连续在棋盘的上方(下方)落子都有 3! 种可能,而这样的连续落子在整个过程中有 4 次(1 次是初始时黑方落子,3 次是在“翻转”时)。所以生成的棋局数量为 6^4=1296。
                    一般地,如果棋盘上的所有点如果能被划分成 3 个部分, B ,W 和 E ,其中B 和 W 分别被用于放置黑棋和白棋, E用于表示格雷码。若 B 和 W 都是连通的, E 中的每个点与 B 和 W 都相邻,且 |B|=|W|=k ,|E|=l ,那么至少存在 局围棋。文献 [1] 中给出了当 n≡3 mod 4 时,构造 B ,W 和 E 的方法,如下图所示:

                    其中,k=n-1+(n-2)(n+1)/4, l=2+(n-2)(n-1)/2
                    所以棋局数量的下界可以被再次改进

                    再取一次对数,有

                    比起平凡下界,这个下界改进了很多,从 n 的对数阶改进到了 n 的平方阶,现在下界与上界只差一个系数了。当 n=19 时,我们可以直接计算得 k=103 ,l=155 ,所以


                    IP属地:北京11楼2022-02-08 16:23
                    收起回复
                      3.Nested scheme 方法
                      3.1 basic scheme
                      2017 年,Walraet 和 Tromp [2] 使用他们称为 nested scheme 的方法构造出了数量更加惊人的围棋棋局,本小节我们先介绍他们的 basic scheme。
                      basic scheme 的基本思路是这样的,将棋盘分为两半,上半棋盘被黑子包围,下半棋盘被白子包围,中间留三个交叉点作为“控制区域”。
                      一开始先清空下半棋盘的所有棋子,然后下半棋盘摆出一个合法局面,接着清空上半棋盘,再然后上半棋盘摆出一个合法局面,这样不断交替进行下去。清空半个棋盘是通过填子和棋盘中间的控制区域来实现的。我们还是用一个具体的例子来展示这个过程

                      我们考虑 5*5 的小棋盘,如上图所示,5 枚黑子将棋盘上方围住,5枚白子将下方围住,中间 3 个标为 c 的交叉点为控制区域

                      一开始黑方 1~9 手将上半棋盘围起来,然后上半棋盘摆出一个合法局面(白方的 4 和 8 手),接着黑方 11 手表示上半棋盘的局面已经摆完;接下来需要在下半棋盘也摆出一个合法局面,黑方 27 手表示下半的合法局面已经摆完;之后需要进行清空上半棋盘,这里白方连续落子使得上半棋盘的所有白棋都只剩 1 气;

                      然后黑方 33 手提走上方所有白子,接着继续不断填子,直到 43 手整个上方棋盘被黑子填满;白方 44 手提掉黑子,完成清空的操作;然后上方棋盘可以再次摆出另一个合法局面;而下方棋盘清空的方法是类似的。这个上下棋盘轮流摆合法局面的过程可以一直持续下去,直到所有可能的合法局面都被摆过为止。


                      IP属地:北京13楼2022-02-09 14:57
                      回复
                        围棋的变化其实并不多。所谓多是含海量的无效变化,以及海量的见合变化。


                        IP属地:黑龙江来自手机贴吧14楼2022-11-29 06:28
                        回复
                          你这个算法就算不出真正的围棋变化,围棋有规则是提子,而且根据围棋规则来看每一手都是变化,复盘的时候也有提子的,你这个算的只是在19路棋盘摆棋子,算的不是围棋


                          IP属地:广东来自Android客户端15楼2022-12-30 09:31
                          回复
                            以前啊,沈括曾经算过这个问题。


                            IP属地:上海16楼2022-12-30 10:03
                            回复