光是红方的第一个回合,就有 2,554 个局面
两种棋里,红方在初始局面都有 44 种走法。在象棋里,黑方对这些走法的应着共构成 1,920 个局面。在鸭子象棋里,要等鸭子落到某个空点上(空点大约有 58 个),红方的回合才算走完,所以光是红方的第一个回合就有 2,554 个局面。
这个差距每走一个回合都会成倍放大。双方各走一个回合之后,鸭子象棋的局面数就已经超过象棋双方各走两个回合之后的局面数。
| 走完以下回合后的局面数 | 象棋 | 鸭子象棋 |
|---|---|---|
| 红方第一个回合 | 44 | 2,554 |
| 双方各一个回合 | 1,920 | 6,166,242 |
| 双方各两个回合 | 3,290,240 | 未统计 |
这些局面里,有一半其实是同一个局面
鸭子只有落在黑方下一步要经过的地方才有作用:黑方棋子要走到的点、要滑过的点,或者要跳过的点。落在别处,黑方的应着和盘上没有鸭子时完全一样。
最要紧的点是黑方九宫前沿的 e8:无论红方第一步走什么,鸭子落在那里都会让黑方少掉 8 种应着。那 28 个灰点什么也不改变。把鸭子放在其中任何一点上,黑方面对的选择都一样,然后再把鸭子挪到新的地方,所以接下来的对局还是同一盘棋。只有两处小差别:黑方不能把鸭子留在原地,而判定重复局面时要算上鸭子所在的点。
所以搜索只需看其中一个,其余的都可以跳过。凡是给黑方留下相同应着的落点都只算一次,第一步时红方的 2,554 种回合就降到 1,310 种。
鸭子离对手的棋子太远,等于浪费半个回合
同一张棋盘对棋手来说也是一条经验法则。把鸭子放在灰点上,对手的选择和没有鸭子时完全一样,等于你只走了一步象棋,回合的另一半白白放弃了。鸭子要放在对手棋子的路线上才有价值:放在对方车和炮所走的路上,或者挡在对方的马和象前面。开局时,作用最大的点在对手炮所在的那一行,一只鸭子能同时截断两门炮。
子力越少,鸭子在博弈树里的分量越大
为了看到开局以后的情况,我们让 Fairy-Stockfish 在两种棋里各自战 64 局,并统计每一步的选择数。象棋的选择随着棋子离盘而减少。在鸭子象棋里,每吃掉一个子也会给鸭子空出一个点,所以一个回合几乎和开局时一样宽;走到第 200 个半回合时,它的选择数约是象棋一步的 100 倍。
同样的搜索,在象棋里能向前看 25 个回合,在鸭子象棋里只有 14 个
这种宽度要拿搜索深度来换。搜索同样数量的局面,Fairy-Stockfish 在鸭子象棋里看到的深度只比象棋的一半多一点。两种棋的深度我们都按回合计算,鸭子象棋的一个回合包括放鸭子。如果搜索把每组等价的鸭子落点只算一次,就能赢回一部分深度。能赢回多少,我们还没有测过。
| 搜索局面数 | 象棋深度 | 鸭子象棋深度 |
|---|---|---|
| 100,000 | 12 | 8 |
| 1,000,000 | 16 | 10 |
| 10,000,000 | 25 | 14 |
一条小规则,让象棋变成一种新棋
棋盘、棋子和走法全都是象棋的,所以象棋棋手坐下来就能下鸭子象棋。但鸭子几乎改变了棋子背后的一切。开局理论在第一步之后就失效了,因为其中每一路变化都假定棋盘上没有鸭子。对目前下这种棋的引擎来说,它也更难。传统搜索,也就是 Fairy-Stockfish 所用的 alpha-beta 搜索,每向前多看一个回合,都要为每一个多出来的选择付出代价,这就是为什么搜索预算越大,深度差距越大。
我们还不知道高水平的鸭子象棋是什么样子。有些落点纯粹是技术,比如放在 e8 的鸭子,一下拿走八个应着。另一些落点针对的可能是对手这个人,而不是局面:把鸭子放在一个安静的点上,引诱对方走某一步;或者用鸭子挡住对手正盯着的那条线,而真正的威胁在别处。一个能向前看 14 个回合的引擎找得到第一种。第二种,只有在高手之间的对局里才会出现。
我们是怎么统计的
第一步的局面由本站自己的规则引擎统计,也就是检查这里每一步棋的那段代码;更深的局面由 Fairy-Stockfish 统计。每种棋的 64 局也是 Fairy-Stockfish 下的,每步搜索 100,000 个局面,并关闭了神经网络。象棋的计数严格按合法着法,所以让自己的将帅可被吃掉的着法不算。鸭子象棋没有将军规则(吃掉将帅即获胜),所以每一步走子都算。