6.3 相变扫描的实现
相变扫描的工程做法:先用粗扫定位跨越 500‰ 的相邻区间,再用二分把临界点钉到 ±1。本节比较扫描器与全网格的格数、run 数与临界点是否一致,算出扫描只花全网格 255‰ 的算力;B 层再扫六个候选步长,检验步长过细与过粗各自的代价与软告警阈值。
category
相变扫描的工程做法:先用粗扫定位跨越 500‰ 的相邻区间,再用二分把临界点钉到 ±1。本节比较扫描器与全网格的格数、run 数与临界点是否一致,算出扫描只花全网格 255‰ 的算力;B 层再扫六个候选步长,检验步长过细与过粗各自的代价与软告警阈值。
序参量是把两相区分开、且在一相里趋于零的宏观量。本节在 enemyHp=75 切片上细扫 enemyAttack,对胜率、残余兵力、未输出比例三个候选序参量各减胜相基线使其归零,再用整数二进对数斜率估出临界指数 beta;B 层换六个拟合窗口检验 beta 有多可信。
参数扫过某个值之后系统的宏观性质整体改变,这就是相变。本节用二维粗扫画出《灰烬牌库》的相图(enemyHp × enemyAttack,每格 32 个显式种子、胜率千分比),再用一维二分把临界点钉到 ±1;B 层换四组种子池检验临界点与曲线高度是否稳。
平衡与多样性常被当成一回事,其实是两条轴。本节扫一个旋钮——重击卡的伤害从 6 到 24——同时算平衡度(1000−带宽)与多样性(胜率熵)。结果是一条反例:重击伤害压到 6 时带宽掉到 0,看起来「最平衡」,但熵也掉到 0,六个打法一起赢不了,复合分反而是九行里最低的 500‰。
四层结论互相打架时,得把平衡压成一组可比的整数。本节给五个分量——胜率带宽、策略胜率熵、支配缺失度、可用策略数、互有胜负对数——再合成一个复合平衡分,全部是千分比整数。实跑《灰烬牌库》得到 band=703‰、熵=914‰、domFree=166‰、可用 2/6、复合分 605‰,并验证复合分对采样规模不敏感、但分量对容差敏感。
平衡不是一个数,是四个层次:卡层看有没有被支配的卡,策略层看胜率带宽,反制层看有没有互相克制,参数层看判定会不会随采样翻转。本节把四层各写成一个可算的整数,用《灰烬牌库》六条打法乘八组遭遇跑出胜率矩阵,结果卡层说平衡、策略层说不平衡、反制层说无反制——同一个机制,四层各说各话。
退化 = 可达模式数不少、但实际打法全挤在一条主模式上。退化指数 = 1000 × 主模式出现次数 // 非空回合程序总数。本节对 64 个优先序策略算胜率与退化指数,按胜线/退化线分成退化解、健康解、退化模式、弱解四象限:退化解 22 个,最退化的 heavy>strike>guard 胜率 1000‰、退化 631‰;B 层证明退化线一动名单就变。
涌现度 = 1000 × 可达模式数 // 分母。它同时依赖粒度(卡牌多重集 / 费用多重集 / 张数)、分母(13 条规则 / 6 个动作符号)与种子集三个声明。本节对 3 粒度 × 2 分母各算一遍:fine 2692‰、cost 1307‰、size 384‰,说明绝对数不可比,但换粒度后 9 个变体的排序不变。
规则是局部的,模式是全局的。本节把《灰烬牌库》一回合内合法打出的卡牌多重集定义成「回合程序」,解析枚举出合法闭包 35 个,再用状态去重 BFS 算出默认种子可达 34 个、8 种子并集 35 个,得出涌现度 2692‰,并声明它是只做相对比较的代理指标。
最优解有两笔代价。算它:minimax 搜索树有 b^d 个叶,b=6、d=20 时是 3.6×10^15,预算 10^7 下穷举只够到深度 8,alpha-beta 最好情况也只到 16——再深必须改用采样。用它:均衡把概率压在 2/4 的支撑上,熵 919 只有均匀 2000 的 459‰,最优一旦落地就压窄了可玩空间。
纯策略没有鞍点时,双方按概率混着出招——混合策略把 maximin 与 minimax 之间的间隙补上。本节用整数行列式精确解出 2×2 子博弈,再在完整 4×5 矩阵上验证:重击/格挡按 1/3 与 2/3 混、强攻/反击按 1/4 与 3/4 混,博弈值恰为 −4,且任一纯策略单方面偏离都不会更好。
零和博弈里玩家想最大化最坏结果(maximin),对手想最小化最好结果(minimax);两者相等时存在纯策略鞍点,即纯策略纳什均衡。本节把《灰烬牌库》的 4 张牌 × 5 种敌人架势写成整数收益矩阵,实跑得到 maximin=−6、minimax=−3、间隙 3、鞍点 0 个——这张矩阵没有纯策略均衡。
找到支配对只是诊断,修复才是设计动作。本节把「消除全部严格支配对」写成带约束的搜索目标——strictPairs==0 且最优策略仍能赢够局数,再扫 7 个候选旋钮:enemyHp 拉到 79 确实消掉支配,但全员必败(治死);最小可行修复是 energyMax 3→2,代价 1 步、最优胜局仍 15。
支配检测问的是:一张 |S|×|Ω| 的得分矩阵里,哪些策略被别的策略处处压住。本节给三种等价实现——全对枚举、按行和剪枝、迭代删除(IESDS),复杂度上界是 |S|·(|S|−1)·|Ω| 次元素比较;在 5×16 实例上朴素法用掉上界的 346‰、剪枝法 309‰,三者结论逐字一致。
支配策略是玩家迟早会发现、然后只用它的那条路——其余策略沦为摆设。本节给严格支配与弱支配的可判定定义,用《灰烬牌库》的固定下标策略族乘 16 个种子,算出 5 条严格支配对、7 条弱支配对、0 条支配策略,并验证严格支配对随种子集合单调增。
卷二的交付物不是一份报告,而是一组冻结的动态接口:规格版本、digest 键清单、PRNG 常数、params 键、基线 digest、代理指标口径(含容差)与采样协议。用一个脚本逐条核对它们是否被冻住,并说明卷三《原型、可玩性与品类》接住什么。
把 S / P / W 三处真的跑一遍:Python 仿真、TS 内核 node --test、浏览器 Playwright 真玩,三处产出同一条 172 字符 digest,并把同一个体验代理指标(血量余裕度)算成同样的整数。这是「规格跑起来」主张的可验证形态,代理指标只做相对比较,禁绝对化。
把本卷前 15 章的动态与体验度量装配成一条可核对的链:19 个 stage 各自声明所属章节、档位、指标名、单位、代理标记与证据文件。S 层核对契约自洽与规格对齐,B 层用 leave-one-out 找出结构承重件。全部体验指标都是代理指标,只做相对比较,禁绝对化。
反推不是免费的:代价 = 正推次数 × 每次正推的成本。本节实测一维二分在 5 个精度上的真实正推次数与耗时,据此标定代价模型,再算出二维全网格在同样精度下要贵一个 R/ε 的因子;最后给预算判据——同样 20 万 runs,一维能钉到 ε=1,二维只能到 ε=2。
一个指标带反推出的不是一个点,而是二维参数平面上的一条带。本节在 enemyHp×enemyAttack 网格上用「胜率带 + 子池稳定性」两条约束圈出可行域,粗扫后逐行二分把边界钉到步长 1,实测域含 9 行、面积 54;B 层再扫带宽与种子数,看域怎么伸缩。