Skip to content

v3.1.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 12:40
1a16eef

3.1.0 — 想得快

照 docs/REVIEW-v3.0.md 做,只动对弈本身。

你的三个决定:

  • 每一档都要更强,不降低任何一档的难度:引擎快出来的时间不还给等待,而是留在原来的时间里多算;
  • 引擎懂禁手放进这一版;
  • 版本号 3.1.0。

不动的:界面、规则、存储格式、复盘与练习;入门 / 困难 / 极限每手的时间(0.24 / 至多 2 / 5 秒)。

一句话:同样的时间,算得更多;禁手规则下,电脑不再算黑棋走不了的棋。 普通、困难更强;禁手规则下普通、困难、极限都明显更强;自由规则下的入门与极限持平。


引擎快了一倍

CPU 剖析显示,时间主要花在两处,这一版都改了:

地方 此前 现在
生成候选手 每个节点把全部候选(常有 60 个以上)排好序,再只留前 8–14 个 只挑出要用的前几个,同分时先后顺序与原来一致
提子 把周围 32 个点的棋型重新算一遍 落子时把改动前的值存下,提子时原样还原

核对与实测(同一台机器、同一组局面):

v3.0 v3.1
同样的节点数下,每一手是否相同 218 / 218 完全相同
同样的节点数下,用时 38.6 秒 18.1 秒(快 2.14 倍)
自由规则,每秒节点 128k 238k

每一手完全相同,说明只是算得快了,判断没有变。快出来的时间全部用来多算。

禁手规则下,搜索懂禁手

  • 此前:禁手只在两处查——最后落子之前,和连续冲四的第一手。搜索里其余的每一手黑棋,都按自由规则算:
    • 长连被当成「成五」;
    • 黑棋会「挡」在自己的禁手点上;
    • 白棋看不出「黑只能挡在禁手点上,等于挡不了」。
  • 现在:搜索里的每一个点都标着黑棋能不能下。
    • 黑的禁手点不再作为候选;
    • 长连不算五;
    • 白冲四时,若唯一的挡点是黑的禁手点,白知道这已经是杀。
  • 判定与裁判用的是同一套规则(renjuForbidden)。只有一个点可能构成双四、双三或长连时才做完整判定,其余点只看棋型,所以几乎不变慢:每秒节点 125k → 131k,而且现在算的都是黑棋真走得了的棋。

每一档:没有一档变弱,四处明显更强

档的时间:

  • 入门、困难、极限不变;
  • 普通 0.4 → 0.55 秒:电脑本来就至少等 0.6 秒才落子(v3.0),多想的这 0.15 秒你等不到,实测普通每手最长 0.555 秒。

每一档与 v3.0 的同一档对下:

档 自由规则 禁手规则
入门 28 : 20(p = 0.31,不更弱) —
普通 67 : 27(p < 0.001) 32 : 16(p = 0.03;按 0.4 秒量的)
困难 43 : 27(和 2;p = 0.07) 21 : 3(p < 0.001)
极限 23 : 19(和 6;p = 0.64) 39 : 8(和 1;p < 0.001)
  • 入门:不更弱。它的强弱由「漏挡活三」这个概率决定,不由算力决定。只会挡冲四的新手对它仍是五五开(54 / 100),「常常漏掉活三」照旧成立。
  • 困难(自由规则):强了,但不如其他档明显。困难「最佳手连续几层不变就落子」(v1.68),引擎快了以后,一部分快出来的时间变成了更快落子:平均每手 0.70 → 0.44 秒,九成的手 1.93 → 1.21 秒以内。
  • 极限(自由规则):没有量出变化,也没有变弱。5 秒里 v3.0 与 v3.1 都搜到第 10 层,快一倍不够多搜一层(每多一层要花前面所有层之和的 2–3 倍)。试了两种用法都没有效果(见「看了、没做的」)。极限对困难仍然明显更强(44 : 26,见下)。
  • 禁手规则下变化最大:v3.0 的引擎在禁手规则下会算错,v3.1 算对了。

档与档:阶梯照旧站得住

p 值均为双侧。「极限对困难」与禁手规则下的「困难对普通」用随机 4 子开局,每个开局两边各执一次黑;其余从空盘开始:

自由规则 禁手规则
普通 对 入门 45 : 3 —
困难 对 普通 33 : 15(p = 0.01) 35 : 12(和 1;p < 0.001)
极限 对 困难 44 : 26(和 2;p = 0.04) 44 : 27(和 1;p = 0.06)

v3.0 在禁手规则下,极限对困难是 12 : 12:多给的时间花在了黑棋其实走不了的变化上。现在两种规则下极限都强于困难,说明里的「实测明显强于困难」两种规则下都成立,不用改。

闸门

test-game 新增四条,前三条在 v3.0 上失败:

闸门 v3.0 v3.1
黑 X X X _ X X 补中间是长连 当成「成五」去走,被出口换成一手随机的合法点 不算五
白冲四,唯一的挡点是黑的长连点 白去「挡」黑的长连点 白冲四取胜(vcf)
普通的时间 400ms 550ms,仍在 600ms 落子节奏以内
随机落子 / 提子 300 次后,棋型状态与从头重建完全相同(自由、禁手各一遍) — 通过(还原式提子的正确性)

其余闸门照旧全部通过:test-game / test-surface S1–S20 / test-cross / test-loop / test-daily / test-strength。

看了、没做的

  • 让极限搜得更宽:根宽 26 → 32、内层 14 / 10 / 8 → 18 / 13 / 10。对 v3.0 的极限 39 : 32,与不改差不多,不采用。
  • 让极限搜得更窄、更深:对现在的极限 10 : 12,不采用。

底层依赖

@native-sdk/core / @native-sdk/cli 最新仍是 0.11.0,与 v3.0 相同,这一版无需升级。