dareda 牌谱全量分析
牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3,
四人东南战 K = 9 局。Hero = 座2 坏耶这把铁飞,终局 4300 点,
4 位。牌山约定 dead_wall_tail,配牌恒等 9/9 局通过
(牌谱内无杠,岭上牌未验证)。
确定性标签 —— A:mortal4-b40c192-t24011010|steps=150000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release;
B:mortal4-b40c192-t26031702|steps=298000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release。
两边同为 CPU 推理、关 AMP,seed = 0。
→ 好牌,打得一般,而且这把运气还背。
这是 diagnose 在两份权重下逐字相同的那句话
(也就是双击 run.sh 会直接给你的结论)。三项星级:
| 星级 | 判词 | A · 150k | B · 298k | |
|---|---|---|---|---|
| 牌 | ★★★★☆ | 好牌 | 均等水平下这个座位期望 2.17 位 | 均等水平下这个座位期望 2.10 位 |
| 打 | ★★☆☆☆ | 打得一般 | 你的打法把期望推到 2.30 位(−0.13)EV loss 0.320,四家第 2 低 | 你的打法把期望推到 2.13 位(−0.03)EV loss 0.224,四家最低 |
| 运 | ☆☆☆☆☆ | 运气背 | 你的同水平里,4 位或更差占 10% | 你的同水平里,4 位或更差占 10% |
以权重 A 为正文口径:牌不错(均等水平下这个座位期望 2.17 位),打法一般 (把期望推到 2.30 位),而运气是压倒性的那一块。名次分解为 牌与座次 +0.33 + 打法 −0.13 + 运气 −1.70 = −1.50, 也就是从中性的 2.5 位掉到实际的 4 位。三项里运气占了绝大部分。
self-luck 的判词是「偏背」:按 hero 自己的水平(标定温度 1.00,即与 Mortal 同档、 不额外加噪)把这副牌山重打 30 次,只有 10% 会打到 4 位 —— 同水平期望顺位 2.30,平均点数 26433, 而实际拿到的是最差的那一档。换句话说这把确实是被运气坑的: 同水平的自己有 90% 会打得比这更好。
两份权重在结论上完全一致,而且 B 比 A 更偏向「不怪你」。权重 B 把同样的 −1.50 拆成牌 +0.40 + 打法 −0.03 + 运气 −1.87,判词同样是「偏背」、4 位概率同样是 10%。 三项归因、判词、4 位概率两边同向且量级接近,这个结论是稳的。 另一条两份权重都成立的硬事实:hero 的 EV loss(A 0.320 / B 0.224)不是四家最差的 —— A 下是四家第 2 低,B 下直接是四家最低,一致率 72% / 74% 也是四家最高档。 这局打得最不干净的是座0 健麻a(EV loss 0.488 / 0.424),而他拿了 3 位。
self-luck
每家按自己被标定出的水平(温度越高越随机)重打这副牌山 30 次,看实际顺位落在自家分布的什么位置。
EV loss 是在人类原局上逐决策测的强度,数值越大离 Mortal 越远。下表为权重 A 口径,
标定温度 {0: 1.17, 1: 1.00, 2: 1.00, 3: 1.13}。
| 座 / 玩家 | 决策数 | 一致率 | EV loss | 实际 | 同水平期望 | 1位 | 2位 | 3位 | 4位 |
|---|---|---|---|---|---|---|---|---|---|
| 座0 健麻a | 93 | 53% | 0.488 | 3 位 | 3.33 | 3% | 13% | 30% | 53% |
| 座1 ただ風を待つ | 89 | 72% | 0.257 | 1 位 | 1.50 | 63% | 23% | 13% | 0% |
| 座2 坏耶这把铁飞(hero) | 74 | 72% | 0.320 | 4 位 | 2.30 | 20% | 40% | 30% | 10% |
| 座3 刘树德 | 93 | 62% | 0.369 | 2 位 | 2.87 | 13% | 23% | 27% | 37% |
值得单独指出:座0 和座3 是反过来的 —— 座0 同水平期望 3.33 位却拿了 3 位、 座3 期望 2.87 位却拿了 2 位,两家都打在自己分布的好的一侧。真正落在分布尾巴上的只有 hero: 期望 2.30 位、实际 4 位,而 4 位在他自己的分布里只占 10%。
权重 B 下同一张表的数字略有平移但排序不变:座0 EV loss 0.424(期望 3.43 位 / 实际 3 位)、
座1 0.229(1.87 / 1 位)、hero 0.224(2.13 / 4 位)、
座3 0.310(2.57 / 2 位),标定温度 {0: 1.11, 1: 1.00, 2: 1.00, 3: 1.02}。
hero 在 B 下的 EV loss 变成四家最低。
同水平自打分布
把 hero 换成「按标定温度采样的自己」,对手也各按自己的温度,在同一副牌山上重打 30 次的顺位分布。 两份权重都把实际拿到的 4 位放在最薄的那一档(各 10%), 而最厚的一档都在 1~2 位。虚线是等强情况下的 25%。
平均顺位:A 2.30(平均点数 26433) · B 2.13(平均点数 31680)。 实际 4 位 / 4300 点,两边的平均点数都比实际高出 2.2 万以上。
A vs B
A = mortal_150k.pth(项目默认),B = mortal_298k.pth。同一份牌谱、同一 seed = 0,
只换权重。下表逐项列出两边的结果,分歧的项目会明确标注「不稳」。
| 项目 | A · 150k | B · 298k | 是否一致 |
|---|---|---|---|
| replay — 四家全 Mortal hero 终局 |
1 位 / 47000 K′=4,东四击飞终局 |
2 位 / 35000 K′=9,走完全程 |
方向一致 都远好于实际的 4 位 / 4300;但名次与终止方式不同 —— 这项细节不稳 |
| counterfactual — 只 hero 换 Mortal 对手照人类原样打 |
4 位 / −16300 2 位/1 位/4 位/3 位 |
4 位 / 6800 3 位/2 位/4 位/1 位 |
一致(都是 4 位) 但保真度低,见下 |
| counterfactual 保真度 | 中位 51% 1/9 局全程一致 |
中位 51% 2/9 局全程一致 |
一致 两边中位数都只有 51% —— 这一项整体不该当真 |
| self-luck — 同水平平均顺位 | 2.30 位 | 2.13 位 | 一致 差 0.17 位,同向;B 更看好 hero |
| self-luck — 判词 | 偏背 P(4 位)=10% |
偏背 P(4 位)=10% |
完全一致 |
| diagnose — 牌与座次 | +0.33 均等水平期望 2.17 位 |
+0.40 均等水平期望 2.10 位 |
一致 都判「好牌」(★★★★☆) |
| diagnose — 打法 | −0.13 EV loss 0.320,四家第 2 低 |
−0.03 EV loss 0.224,四家最低 |
一致 都判「打得一般」(★★☆☆☆),都是小幅负贡献 |
| diagnose — 运气 | −1.70 | −1.87 | 一致 都判「运气背」(☆☆☆☆☆),都是三项里最大的一块 |
| diagnose — 合计 | −1.50 | −1.50 | 一致 合计恒等于「实际顺位 − 2.5」,不是独立证据 |
怎么读这张表:唯一实质分歧在 replay(全 Mortal 重打)——
A 下东四就把座3 打到 −1500 提前击飞、hero 收 47000 拿 1 位;B 下九局走完、hero 35000 拿 2 位。
这是「顶尖打法能把这副牌打成什么」的上限估计,两份权重给出不同的路径,具体点数不要当数值结论,
只当「远好于实际」的定性证据。其余各项 —— 归因三分解、判词、4 位概率、counterfactual 名次 —— 两边同向。
montecarlo
这一节问的是另一个问题,而且必须先说清它到底跑了什么,否则数字会被读反。
命令内部用的是 CounterfactualMonteCarlo —— 它是 counterfactual 的分布版,
不是 replay 的分布版:hero 换成 Mortal(全程 greedy),而三个对手仍然照人类原样出牌,
只有当某个对手脱轨(牌河已经和原局对不上、人类那步动作不再可用)之后,
才回落到 Mortal 接手。三档「强度」调的只是这个脱轨后 fallback 的温度,
温度越高越随机、越弱。
full-mortal 这个档名容易误读:它不等于「四家全 Mortal」。
它的含义是「对手脱轨后的 fallback 是满强度 greedy Mortal」,对手在脱轨之前依旧在复刻人类的实际出牌。
真正的「四家从第一张牌起全是 Mortal」是本报告的 replay 一节,那是另一套东西 ——
两者结果差得很远(A 下 hero 47000 / 1 位 vs −16300 / 4 位),原因就在这里:
replay 里对手不再打出人类那些牌,牌河从东一就整个变了;本节里 hero 面对的仍是
那个把他打崩的牌河。
同理,本节与 self-luck 也不是一回事:self-luck(SelfStrengthMonteCarlo)
是四家都按各自标定温度从头重打一局全新的牌,完全不跟随人类日志。
三者的区别一句话:replay = 四家全 Mortal 重开;self-luck = 四家按各自水平重开;
本节 = 钉在人类牌河上的反事实。
| 强度档 | 对手温度 | n | 平均顺位 | 平均点数 | 1位 | 2位 | 3位 | 4位 |
|---|---|---|---|---|---|---|---|---|
| full-mortal 对手脱轨后回落到 greedy Mortal | {0:1.00, 1:1.00, 3:1.00} | 1 | 4.00 | −16300 | 0% | 0% | 0% | 100% |
| calibrated fallback = 各自实测水平 | {0:1.17, 1:1.00, 3:1.13} | 20 | 3.10 | 16325 | 15% | 10% | 25% | 50% |
| weaker fallback 更弱(EV loss 翻倍) | {0:1.65, 1:1.29, 3:1.57} | 20 | 3.05 | 16120 | 5% | 25% | 30% | 40% |
| full-mortal | {0:1.00, 1:1.00, 3:1.00} | 1 | 4.00 | 6800 | 0% | 0% | 0% | 100% |
| calibrated | {0:1.11, 1:1.00, 3:1.02} | 20 | 3.60 | 6680 | 5% | 5% | 15% | 75% |
| weaker | {0:1.56, 1:1.21, 3:1.43} | 20 | 3.30 | 11980 | 10% | 15% | 10% | 65% |
full-mortal 那一档是确定性单次重放,不是 100% 的置信度。对手全 greedy 时整条轨迹完全确定,
工具只跑 1 条(跑 20 条是同一局算 20 遍),所以 n=1、分布显示 100% 4 位 ——
这句话的意思仅仅是「那唯一一条确定轨迹的结果是 4 位」。这一档的终局点数
(A −16300 / B 6800)与本报告 counterfactual 一节
逐字相同,而且是按构造必然相同 —— 两者用的是同一套引擎、同样 greedy 的脱轨 fallback,
epsilon = 0 时整条轨迹完全确定。换句话说 full-mortal 档没有提供 counterfactual 之外的新信息,
它的作用是给另外两档当参照系。
本节和 self-luck 的数字方向相反,原因是实验根本不同,不是矛盾。 self-luck 说 hero 同水平期望 2.30 位(A)/ 2.13 位(B);本节说 3.10 位(A)/ 3.60 位(B), 比中性的 2.5 位还差。差别在于:self-luck 让四家从头重打一局全新的牌, hero 有机会走上完全不同的路;本节把 hero 钉在人类那条已经崩掉的牌河上 ——对手前半局还在复刻真实出牌(保真度中位数仅 51%),hero 就算换成 Mortal 也是在接一个烂摊子。 再加上 hero 是确定性策略,20 条轨迹的全部方差只来自对手脱轨后的采样,样本又少。 「这把怪谁」的正文口径以 self-luck / diagnose 为准(那才是本工具为归因设计的实验), 本节只作为「对手强度变化时,那条既定牌河上的反事实有多敏感」的参考。
本节内部两份权重也不一致:A 下 calibrated → weaker 几乎没变化(3.10 → 3.05), B 下则明显改善(3.60 → 3.30)。方向上唯一共同点是「对手变弱 hero 不会更差」, 这几乎是同义反复。本节的具体数值不建议当结论用,n=20 的分布抖动足以解释这些差距。
资源账
每条命令都经 run_step.py 执行,用 os.wait4 逐进程采集 rusage
(不是 RUSAGE_CHILDREN 的累计值),所以下表的内存数字是各步骤自己的峰值,互不叠加。
各步骤串行执行,墙钟之间也不互相污染。
| 步骤 | 权重 | 墙钟 s | 用户态 s | 系统态 s | CPU% | 峰值 MB | 退出 |
|---|---|---|---|---|---|---|---|
| decode-capture | — | 0.18 | 0.12 | 0.03 | 80 | 29.5 | 0 |
| verify | — | 0.12 | 0.09 | 0.02 | 94 | 20.7 | 0 |
| inspect | — | 0.09 | 0.06 | 0.02 | 94 | 20.0 | 0 |
| replay | A · 150k | 3.44 | 2.89 | 0.50 | 99 | 430.6 | 0 |
| counterfactual | A · 150k | 11.38 | 10.77 | 1.51 | 108 | 434.7 | 0 |
| diagnose | A · 150k | 175.66 | 624.19 | 11.50 | 362 | 426.1 | 0 |
| replay | B · 298k | 8.42 | 7.48 | 1.30 | 104 | 436.6 | 0 |
| counterfactual | B · 298k | 6.12 | 5.51 | 0.96 | 106 | 436.7 | 0 |
| diagnose | B · 298k | 177.17 | 609.54 | 14.09 | 352 | 440.5 | 0 |
| montecarlo --sensitivity | A · 150k | 104.42 | 341.75 | 8.04 | 335 | 428.8 | 0 |
| montecarlo --sensitivity | B · 298k | 90.59 | 295.60 | 6.67 | 334 | 439.8 | 0 |
| 合计 | — | 577.6 | — | — | — | 440.5(峰值) | — |
全部步骤合计墙钟 577.6 s(9.6 分钟),单步峰值常驻内存 440 MB。各步骤串行执行,数字之间不互相污染。
读法:分钟级的只有 diagnose(两份权重各约 176 s)和 montecarlo
(104 s / 91 s),两者合计占总墙钟的 95%。它们的用户态 CPU 时间远大于墙钟
(diagnose 约 620 s vs 176 s)—— 这是内部多进程并行的结果,CPU% 在 334%~362%。
replay / counterfactual 是秒级单进程,解析三步(decode / verify / inspect)
合计不到 0.4 s。峰值常驻内存由 torch + 权重决定,凡是加载模型的步骤都在
430 MB 上下,和牌谱长度、trials 数基本无关;不加载模型的解析步骤只要 20~30 MB。
方法与局限
本报告的每一个数字都来自下列命令的日志输出,没有手工估算或跨步骤推算的成分。
dareda decode-capture --capture majsoul-ws-1786618863235.json --out record.json
dareda verify --record record.json
dareda inspect --record record.json
# 权重 A = models/mortal_150k.pth,权重 B = models/mortal_298k.pth,以下各跑一遍
dareda replay --record record.json --model <权重>
dareda counterfactual --record record.json --hero 2 --model <权重>
dareda diagnose --record record.json --hero 2 --trials 30 --with-selfluck --model <权重>
dareda montecarlo --record record.json --hero 2 --trials 20 --sensitivity --model <权重>
参数:--seed 0(默认值,两份权重保持一致才可比)、--trials 30(diagnose)、
--trials 20(montecarlo)。推理全程 CPU、关 AMP。
本报告里出现了三套结果各不相同的模拟,牌山是同一副,但「对手是谁」完全不同,
横向比较之前必须先看这张表(依据:src/dareda/montecarlo.py、
src/dareda/engine/logfollow.py)。
| 命令 | hero | 三个对手 | 内核 |
|---|---|---|---|
replay | Mortal(greedy) | 从第一张牌起也是 Mortal,完全不看人类日志 | run_replay + 四个 Mortal 引擎 |
counterfactualmontecarlo(三档全部) | Mortal(greedy) | 照人类原样出牌;某家脱轨后才回落到 Mortal,「强度档」调的只是这个 fallback 的温度 | CounterfactualMonteCarlo + LogFollowEngine |
self-luckdiagnose | 按自己标定温度的 Mortal | 各按自己标定温度的 Mortal,从头重打一局全新的牌,不看日志 | SelfStrengthMonteCarlo |
所以 replay 的 hero 47000 / 1 位(A)和 montecarlo full-mortal 的 −16300 / 4 位
不构成矛盾 —— 前者的对手不再打出人类那些牌,牌河从东一起就是另一局;
后者 hero 仍被钉在那条把他打崩的牌河上。同理,归因结论只该从第三行(self-luck / diagnose)读,
那是唯一一个为「这把怪谁」设计的实验。
附录
正文只取了各步骤的汇总数字。这一节把模拟过程本身摊开:逐局的点数轨迹、 counterfactual 的逐局保真度、以及每条命令的完整日志原文。 报告里的每一个数字都能在这里找到出处。
人类原局给的是各局开局时的点数(取自 inspect),
模拟给的是各局结束时的点数(取自 replay / counterfactual),
两者口径差一局,不要横向逐格对比;看的是走势和终点。粗体是 hero(座2)。
| 局 | 庄 | 本场 | 座0 | 座1 | 座2(hero) | 座3 |
|---|---|---|---|---|---|---|
| 东一 | 座0 | 0 | 25000 | 25000 | 25000 | 25000 |
| 东二 | 座1 | 0 | 23000 | 29000 | 23500 | 24500 |
| 东三 | 座2 | 1 | 23000 | 29000 | 23500 | 24500 |
| 东四 | 座3 | 0 | 21700 | 29000 | 23500 | 25800 |
| 南一 | 座0 | 0 | 21700 | 32900 | 23500 | 21900 |
| 南二 | 座1 | 0 | 21700 | 34900 | 21500 | 21900 |
| 南三 | 座2 | 0 | 20400 | 34900 | 21500 | 23200 |
| 南四 | 座3 | 0 | 26600 | 34900 | 15300 | 23200 |
| 南四 | 座3 | 1 | 26600 | 34900 | 6600 | 31900 |
注意表里是局始点数,所以 21500 那一行(南三局始)代表前六局打完的状态。 hero 前六局几乎没动(25000 → 21500,−3500),分数是在南三、南四、南四1本这最后三局 掉光的:21500 → 15300 → 6600 → 终局 4300,合计 −17200。这也是为什么归因几乎全落在运气项上 —— 崩盘集中在最后三局。
| 权重 | 局 | 座0 | 座1 | 座2(hero) | 座3 | 结果 |
|---|---|---|---|---|---|---|
| A · 150k | 东一 | 23700 | 24300 | 27700 | 24300 | tsumo |
| A · 150k | 东二 | 22200 | 23300 | 30700 | 23800 | tsumo |
| A · 150k | 东三1本 | 22200 | 23300 | 50000 | 4500 | ron |
| A · 150k | 东四 | 19200 | 35300 | 47000 | −1500 | tsumo · 击飞终局 |
| B · 298k | 东一 | 23700 | 24300 | 27700 | 24300 | tsumo |
| B · 298k | 东二 | 22700 | 31100 | 27700 | 18500 | ron |
| B · 298k | 东三1本 | 20600 | 29000 | 34000 | 16400 | tsumo |
| B · 298k | 东四 | 17600 | 41000 | 31000 | 10400 | tsumo |
| B · 298k | 南一 | 15600 | 45000 | 30000 | 9400 | tsumo |
| B · 298k | 南二 | 14100 | 43500 | 30500 | 9900 | ryuukyoku |
| B · 298k | 南三 | 13600 | 47500 | 29500 | 9400 | tsumo |
| B · 298k | 南四 | 12100 | 46000 | 31000 | 9900 | ryuukyoku |
| B · 298k | 南四1本 | 11300 | 45200 | 35000 | 8500 | tsumo |
两份权重的东一完全相同(23700/24300/27700/24300,hero 自摸)—— 同一副牌、同一 seed,
两个权重在第一局做出了一致的选择。分歧从东二开始:A 让 hero 在东三1本直接冲到 50000 并在东四击飞座3 提前终局;
B 走完九局、hero 稳在 3 万上下。这就是正文说 replay 这项「细节不稳」的依据。
| 权重 | 局 | 座0 | 座1 | 座2(hero) | 座3 | 结果 |
|---|---|---|---|---|---|---|
| A · 150k | 东一 | 37000 | 21000 | 21000 | 21000 | tsumo |
| A · 150k | 东二 | 37000 | 29700 | 21000 | 12300 | ron |
| A · 150k | 东三1本 | 35700 | 29700 | 21000 | 13600 | ron |
| A · 150k | 东四 | 35700 | 37700 | 21000 | 5600 | ron |
| A · 150k | 南一 | 48700 | 37700 | 9000 | 4600 | ron |
| A · 150k | 南二 | 50800 | 37200 | 8700 | 3300 | tsumo |
| A · 150k | 南三 | 48200 | 39800 | 8700 | 3300 | ron |
| A · 150k | 南四 | 48200 | 39800 | 0 | 12000 | ron |
| A · 150k | 南四1本 | 48200 | 56100 | −16300 | 12000 | ron |
| B · 298k | 东一 | 37000 | 21000 | 21000 | 21000 | tsumo |
| B · 298k | 东二 | 28000 | 21000 | 31000 | 20000 | ron |
| B · 298k | 东三1本 | 26700 | 21000 | 31000 | 21300 | ron |
| B · 298k | 东四 | 23700 | 33000 | 28000 | 15300 | tsumo |
| B · 298k | 南一 | 36700 | 33000 | 16000 | 14300 | ron |
| B · 298k | 南二 | 36200 | 34500 | 15500 | 13800 | tsumo |
| B · 298k | 南三 | 20200 | 34500 | 15500 | 29800 | ron |
| B · 298k | 南四 | 20200 | 34500 | 6800 | 38500 | ron |
| B · 298k | 南四1本 | 18400 | 34500 | 6800 | 40300 | ron |
再强调一次:这张表的保真度只有 51%(中位数),不是可信的数值预测。
它唯一能说明的是「就算把 hero 换成 Mortal、而对手仍按原样出牌,hero 照样是 4 位」——
两份权重在这一点上一致。注意 A 下 hero 终局 −16300、B 下 6800,
与 montecarlo 的 full-mortal 档按构造是同一次计算(同一套引擎、
同样 greedy 的脱轨 fallback、epsilon = 0 完全确定),所以点数逐字相同。
「脱轨@事件」= hero 第一次做出与人类不同的选择发生在该局第几个事件; 忠实比例 = 脱轨点之前的事件占该局全部事件的比例。比例越低,该局的模拟越不该当真。
| 局 | 该局事件数 | A 脱轨@ | A 忠实比例 | B 脱轨@ | B 忠实比例 |
|---|---|---|---|---|---|
| 东一 | 62 | 49 | 79% | 49 | 79% |
| 东二 | 145 | 28 | 19% | 28 | 19% |
| 东三1本 | 53 | 全程 | 100% | 全程 | 100% |
| 东四 | 45 | 23 | 51% | 8 | 18% |
| 南一 | 35 | 18 | 51% | 18 | 51% |
| 南二 | 39 | 20 | 51% | 20 | 51% |
| 南三 | 83 | 38 | 46% | 38 | 46% |
| 南四 | 95 | 40 | 42% | 全程 | 100% |
| 南四1本 | 75 | 16 | 21% | 16 | 21% |
| 汇总 | — | 1/9 局全程一致 · 中位数 51% | 2/9 局全程一致 · 中位数 51% | ||
东三1本(hero 自己的庄)两份权重都是全程一致 —— Mortal 在这一局的每一个选择都和 hero 相同, 这局 hero 打得无可挑剔。两份权重只在两局上分歧:东四(A 51% / B 18%)和南四(A 42% / B 全程一致)。 崩盘最狠的南四1本,两边都只忠实到 21% 就脱轨了,所以「换 Mortal 能不能守住这一局」这个问题, 本工具其实回答不了。
正文第 6 节的表已是完整分布(每档 1/2/3/4 位四个百分比 + 平均顺位 + 平均点数),此处不重复。
需要注意 n 列:full-mortal 档 n=1,另两档 n=20。
以下是 11 条命令的完整 stdout/stderr,由 run_step.py 逐条落盘,未经编辑。
点击标题展开。本报告正文的所有数字都可在这里逐字核对。
dareda decode-capture --capture ~/Downloads/majsoul-ws-1786618863235.json --out .dareda-runs/majsoul-ws-1786618863235/record.json
抓包帧数 : 77(尝试解析 77 帧)
牌谱所在帧 : 62
uuid : 260812-860b14a0-aa1c-414d-a468-81b51f2e32f3
动作流来源 : inline
动作条数 : 602
RecordNewRound: 9 个小局
已写出 .dareda-runs/majsoul-ws-1786618863235/record.json
下一步: dareda verify --record .dareda-runs/majsoul-ws-1786618863235/record.json
dareda verify --record .dareda-runs/majsoul-ws-1786618863235/record.json
牌谱: majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3 K = 9
牌山约定: dead_wall_tail
配牌恒等: 9/9 局通过
✓ 全部通过 —— 发牌顺序 / 赤宝编码 / 牌山定点均正确
王牌区布局:
宝牌指示牌: ✓ 9/9
里宝指示牌: ✓ 2/2
岭上牌: 无样本 —— 未验证(牌谱里没开杠)
dareda inspect --record .dareda-runs/majsoul-ws-1786618863235/record.json
牌谱: majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3
玩家: 座0 健麻a / 座1 ただ風を待つ / 座2 坏耶这把铁飞 / 座3 刘树德
终局: 26600(3位) / 37200(1位) / 4300(4位) / 31900(2位)
序列 (K=9): 东一 / 东二 / 东三1本 / 东四 / 南一 / 南二 / 南三 / 南四 / 南四1本
东一 庄=座0 本场=0 立直棒=0 点数=[25000, 25000, 25000, 25000]
东二 庄=座1 本场=0 立直棒=0 点数=[23000, 29000, 23500, 24500]
东三1本 庄=座2 本场=1 立直棒=0 点数=[23000, 29000, 23500, 24500]
东四 庄=座3 本场=0 立直棒=0 点数=[21700, 29000, 23500, 25800]
南一 庄=座0 本场=0 立直棒=0 点数=[21700, 32900, 23500, 21900]
南二 庄=座1 本场=0 立直棒=0 点数=[21700, 34900, 21500, 21900]
南三 庄=座2 本场=0 立直棒=0 点数=[20400, 34900, 21500, 23200]
南四 庄=座3 本场=0 立直棒=0 点数=[26600, 34900, 15300, 23200]
南四1本 庄=座3 本场=1 立直棒=0 点数=[26600, 34900, 6600, 31900]
dareda replay --record .dareda-runs/majsoul-ws-1786618863235/record.json --model models/mortal_150k.pth
牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3 K=9
引擎 mortal4-b40c192-t24011010|steps=150000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release
| 人类原局 | Mortal replay
---------+------------------------------+------------------------------
最终名次 | 3位 / 1位 / 4位 / 2位 | 3位 / 2位 / 1位 / 4位
最终点数 | 26600 / 37200 / 4300 / 31900 | 19200 / 35300 / 47000 / -1500
实际局数 | K = 9 | K' = 4
终止原因 | — | 击飞
确定性标签: mortal4-b40c192-t24011010|steps=150000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release
局 座0 座1 座2 座3 结果
东一 23700 24300 27700 24300 tsumo
东二 22200 23300 30700 23800 tsumo
东三1本 22200 23300 50000 4500 ron
东四 19200 35300 47000 -1500 tsumo
dareda counterfactual --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --model models/mortal_150k.pth
牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3 K=9
英雄座 2 = 坏耶这把铁飞
引擎 mortal4-b40c192-t24011010|steps=150000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release|hero=2
| 人类原局 | Mortal replay
---------+------------------------------+-------------------------------
最终名次 | 3位 / 1位 / 4位 / 2位 | 2位 / 1位 / 4位 / 3位
最终点数 | 26600 / 37200 / 4300 / 31900 | 48200 / 56100 / -16300 / 12000
实际局数 | K = 9 | K' = 9
终止原因 | — | 击飞
确定性标签: mortal4-b40c192-t24011010|steps=150000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release|hero=2
保真度(英雄=座2,对手照人类原样打):
局 脱轨@事件 该局事件 忠实比例
东一 49 62 79%
东二 28 145 19%
东三1本 全程 53 100%(全程一致)
东四 23 45 51%
南一 18 35 51%
南二 20 39 51%
南三 38 83 46%
南四 40 95 42%
南四1本 16 75 21%
—— 1/9 局全程一致;忠实比例中位数 51%
局 座0 座1 座2 座3 结果
东一 37000 21000 21000 21000 tsumo
东二 37000 29700 21000 12300 ron
东三1本 35700 29700 21000 13600 ron
东四 35700 37700 21000 5600 ron
南一 48700 37700 9000 4600 ron
南二 50800 37200 8700 3300 tsumo
南三 48200 39800 8700 3300 ron
南四 48200 39800 0 12000 ron
南四1本 48200 56100 -16300 12000 ron
dareda diagnose --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --trials 30 --with-selfluck --model models/mortal_150k.pth
牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3 hero=座2(坏耶这把铁飞) 并行 4 进程
[1/3] 测四家强度...
[2/3] 均等水平基线 —— 这副牌本身值几位
1/30
2/30
3/30
4/30
5/30
6/30
7/30
8/30
9/30
10/30
11/30
12/30
13/30
14/30
15/30
16/30
17/30
18/30
19/30
20/30
21/30
22/30
23/30
24/30
25/30
26/30
27/30
28/30
29/30
30/30
[3/3] 真实水平 —— 加上各家实际打法
1/30
2/30
3/30
4/30
5/30
6/30
7/30
8/30
9/30
10/30
11/30
12/30
13/30
14/30
15/30
16/30
17/30
18/30
19/30
20/30
21/30
22/30
23/30
24/30
25/30
26/30
27/30
28/30
29/30
30/30
对手强度(相对 Mortal,在人类原局上测):
座 玩家 决策 一致率 EV loss
0 健麻a 93 53% 0.488
1 ただ風を待つ 89 72% 0.257
2 坏耶这把铁飞 74 72% 0.320
3 刘树德 93 62% 0.369
=== 这把怪谁? 座2 坏耶这把铁飞 ===
牌 ★★★★☆ 好牌 均等水平下,这个座位期望 2.17 位
打 ★★☆☆☆ 打得一般 你的打法把期望推到 2.30 位(-0.13) ← EV loss 0.32(四家第 2 低)
运 ☆☆☆☆☆ 运气背 你的同水平里,4 位或更差占 10%
→ 好牌,打得一般,而且这把运气还背。
名次分解(以 2.5 位为中性起点,正数=对你有利):
牌与座次 +0.33 + 打法 -0.13 + 运气 -1.70 = -1.50
(每条基线 30 次蒙特卡洛)
这副牌上,你的名次概率(横条按 1/2/3/4 位切分,▲=实际):
你的真实水平 [①①①①①①①②②②②②②②②②②②②②②③③③③③③③③③③③④④④④] 20% 40% 30% 10% (实际 4 位)
1位 2位 3位 4位
============================================================
同水平自打(= self-luck,复用上面第 3 步的轨迹,没有额外开销)
标定温度: {0: 1.17, 1: 1.0, 2: 1.0, 3: 1.13}
座 玩家 EV loss 实际 同水平期望 1位 2位 3位 4位
0 健麻a 0.488 3位 3.33 3% 13% 30% 53%
1 ただ風を待つ 0.257 1位 1.50 63% 23% 13% 0%
2 坏耶这把铁飞 0.320 4位 2.30 20% 40% 30% 10% ←你
3 刘树德 0.369 2位 2.87 13% 23% 27% 37%
座2 同水平自打分布 n=30 平均顺位 2.30 平均点数 26433
1位 20.0% ███████
2位 40.0% █████████████
3位 30.0% ██████████
4位 10.0% ███
实际 4 位;同水平自打期望 2.30 位。
P(打到4位)=10% P(≤4位,即这么差或更差)=10% P(比4位更好)=90%
判断:偏背 —— 你的同水平只有 10% 会打到 4 位或更差
dareda replay --record .dareda-runs/majsoul-ws-1786618863235/record.json --model models/mortal_298k.pth
牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3 K=9
引擎 mortal4-b40c192-t26031702|steps=298000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release
| 人类原局 | Mortal replay
---------+------------------------------+-----------------------------
最终名次 | 3位 / 1位 / 4位 / 2位 | 3位 / 1位 / 2位 / 4位
最终点数 | 26600 / 37200 / 4300 / 31900 | 11300 / 45200 / 35000 / 8500
实际局数 | K = 9 | K' = 9
终止原因 | — | 走完
确定性标签: mortal4-b40c192-t26031702|steps=298000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release
局 座0 座1 座2 座3 结果
东一 23700 24300 27700 24300 tsumo
东二 22700 31100 27700 18500 ron
东三1本 20600 29000 34000 16400 tsumo
东四 17600 41000 31000 10400 tsumo
南一 15600 45000 30000 9400 tsumo
南二 14100 43500 30500 9900 ryuukyoku
南三 13600 47500 29500 9400 tsumo
南四 12100 46000 31000 9900 ryuukyoku
南四1本 11300 45200 35000 8500 tsumo
dareda counterfactual --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --model models/mortal_298k.pth
牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3 K=9
英雄座 2 = 坏耶这把铁飞
引擎 mortal4-b40c192-t26031702|steps=298000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release|hero=2
| 人类原局 | Mortal replay
---------+------------------------------+-----------------------------
最终名次 | 3位 / 1位 / 4位 / 2位 | 3位 / 2位 / 4位 / 1位
最终点数 | 26600 / 37200 / 4300 / 31900 | 18400 / 34500 / 6800 / 40300
实际局数 | K = 9 | K' = 9
终止原因 | — | 走完
确定性标签: mortal4-b40c192-t26031702|steps=298000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release|hero=2
保真度(英雄=座2,对手照人类原样打):
局 脱轨@事件 该局事件 忠实比例
东一 49 62 79%
东二 28 145 19%
东三1本 全程 53 100%(全程一致)
东四 8 45 18%
南一 18 35 51%
南二 20 39 51%
南三 38 83 46%
南四 全程 95 100%(全程一致)
南四1本 16 75 21%
—— 2/9 局全程一致;忠实比例中位数 51%
局 座0 座1 座2 座3 结果
东一 37000 21000 21000 21000 tsumo
东二 28000 21000 31000 20000 ron
东三1本 26700 21000 31000 21300 ron
东四 23700 33000 28000 15300 tsumo
南一 36700 33000 16000 14300 ron
南二 36200 34500 15500 13800 tsumo
南三 20200 34500 15500 29800 ron
南四 20200 34500 6800 38500 ron
南四1本 18400 34500 6800 40300 ron
dareda diagnose --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --trials 30 --with-selfluck --model models/mortal_298k.pth
牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3 hero=座2(坏耶这把铁飞) 并行 4 进程
[1/3] 测四家强度...
[2/3] 均等水平基线 —— 这副牌本身值几位
1/30
2/30
3/30
4/30
5/30
6/30
7/30
8/30
9/30
10/30
11/30
12/30
13/30
14/30
15/30
16/30
17/30
18/30
19/30
20/30
21/30
22/30
23/30
24/30
25/30
26/30
27/30
28/30
29/30
30/30
[3/3] 真实水平 —— 加上各家实际打法
1/30
2/30
3/30
4/30
5/30
6/30
7/30
8/30
9/30
10/30
11/30
12/30
13/30
14/30
15/30
16/30
17/30
18/30
19/30
20/30
21/30
22/30
23/30
24/30
25/30
26/30
27/30
28/30
29/30
30/30
对手强度(相对 Mortal,在人类原局上测):
座 玩家 决策 一致率 EV loss
0 健麻a 93 57% 0.424
1 ただ風を待つ 89 72% 0.229
2 坏耶这把铁飞 74 74% 0.224
3 刘树德 93 61% 0.310
=== 这把怪谁? 座2 坏耶这把铁飞 ===
牌 ★★★★☆ 好牌 均等水平下,这个座位期望 2.10 位
打 ★★☆☆☆ 打得一般 你的打法把期望推到 2.13 位(-0.03) ← EV loss 0.22(四家最低)
运 ☆☆☆☆☆ 运气背 你的同水平里,4 位或更差占 10%
→ 好牌,打得一般,而且这把运气还背。
名次分解(以 2.5 位为中性起点,正数=对你有利):
牌与座次 +0.40 + 打法 -0.03 + 运气 -1.87 = -1.50
(每条基线 30 次蒙特卡洛)
这副牌上,你的名次概率(横条按 1/2/3/4 位切分,▲=实际):
你的真实水平 [①①①①①①①①①①①②②②②②②②②②②②②②③③③③③③③③④④④④] 30% 37% 23% 10% (实际 4 位)
1位 2位 3位 4位
============================================================
同水平自打(= self-luck,复用上面第 3 步的轨迹,没有额外开销)
标定温度: {0: 1.11, 1: 1.0, 2: 1.0, 3: 1.02}
座 玩家 EV loss 实际 同水平期望 1位 2位 3位 4位
0 健麻a 0.424 3位 3.43 3% 13% 20% 63%
1 ただ風を待つ 0.229 1位 1.87 47% 33% 7% 13%
2 坏耶这把铁飞 0.224 4位 2.13 30% 37% 23% 10% ←你
3 刘树德 0.310 2位 2.57 20% 17% 50% 13%
座2 同水平自打分布 n=30 平均顺位 2.13 平均点数 31680
1位 30.0% ██████████
2位 36.7% ████████████
3位 23.3% ████████
4位 10.0% ███
实际 4 位;同水平自打期望 2.13 位。
P(打到4位)=10% P(≤4位,即这么差或更差)=10% P(比4位更好)=90%
判断:偏背 —— 你的同水平只有 10% 会打到 4 位或更差
dareda montecarlo --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --trials 20 --sensitivity --model models/mortal_150k.pth
牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3 hero=座2(坏耶这把铁飞)
测对手强度(在人类原局上)...
对手强度(相对 Mortal,在人类原局上测):
座 玩家 决策 一致率 EV loss
0 健麻a 93 53% 0.488
1 ただ風を待つ 89 72% 0.257
2 坏耶这把铁飞 74 72% 0.320
3 刘树德 93 62% 0.369
=== 强度档 [full-mortal] 对手温度 {0: 1.0, 1: 1.0, 3: 1.0} ===
四家全 greedy,轨迹完全确定 —— 只跑 1 条(跑 N 条是同一局算 N 遍)
轨迹 1/1
座2 @ full-mortal n=1 平均顺位 4.00 平均点数 -16300
1位 0.0%
2位 0.0%
3位 0.0%
4位 100.0% █████████████████████████████████
=== 强度档 [calibrated] 对手温度 {0: 1.17, 1: 1.0, 3: 1.13} ===
轨迹 1/20
轨迹 2/20
轨迹 3/20
轨迹 4/20
轨迹 5/20
轨迹 6/20
轨迹 7/20
轨迹 8/20
轨迹 9/20
轨迹 10/20
轨迹 11/20
轨迹 12/20
轨迹 13/20
轨迹 14/20
轨迹 15/20
轨迹 16/20
轨迹 17/20
轨迹 18/20
轨迹 19/20
轨迹 20/20
座2 @ calibrated n=20 平均顺位 3.10 平均点数 16325
1位 15.0% █████
2位 10.0% ███
3位 25.0% ████████
4位 50.0% █████████████████
=== 强度档 [weaker] 对手温度 {0: 1.65, 1: 1.29, 3: 1.57} ===
轨迹 1/20
轨迹 2/20
轨迹 3/20
轨迹 4/20
轨迹 5/20
轨迹 6/20
轨迹 7/20
轨迹 8/20
轨迹 9/20
轨迹 10/20
轨迹 11/20
轨迹 12/20
轨迹 13/20
轨迹 14/20
轨迹 15/20
轨迹 16/20
轨迹 17/20
轨迹 18/20
轨迹 19/20
轨迹 20/20
座2 @ weaker n=20 平均顺位 3.05 平均点数 16120
1位 5.0% ██
2位 25.0% ████████
3位 30.0% ██████████
4位 40.0% █████████████
dareda montecarlo --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --trials 20 --sensitivity --model models/mortal_298k.pth
牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3 hero=座2(坏耶这把铁飞)
测对手强度(在人类原局上)...
对手强度(相对 Mortal,在人类原局上测):
座 玩家 决策 一致率 EV loss
0 健麻a 93 57% 0.424
1 ただ風を待つ 89 72% 0.229
2 坏耶这把铁飞 74 74% 0.224
3 刘树德 93 61% 0.310
=== 强度档 [full-mortal] 对手温度 {0: 1.0, 1: 1.0, 3: 1.0} ===
四家全 greedy,轨迹完全确定 —— 只跑 1 条(跑 N 条是同一局算 N 遍)
轨迹 1/1
座2 @ full-mortal n=1 平均顺位 4.00 平均点数 6800
1位 0.0%
2位 0.0%
3位 0.0%
4位 100.0% █████████████████████████████████
=== 强度档 [calibrated] 对手温度 {0: 1.11, 1: 1.0, 3: 1.02} ===
轨迹 1/20
轨迹 2/20
轨迹 3/20
轨迹 4/20
轨迹 5/20
轨迹 6/20
轨迹 7/20
轨迹 8/20
轨迹 9/20
轨迹 10/20
轨迹 11/20
轨迹 12/20
轨迹 13/20
轨迹 14/20
轨迹 15/20
轨迹 16/20
轨迹 17/20
轨迹 18/20
轨迹 19/20
轨迹 20/20
座2 @ calibrated n=20 平均顺位 3.60 平均点数 6680
1位 5.0% ██
2位 5.0% ██
3位 15.0% █████
4位 75.0% █████████████████████████
=== 强度档 [weaker] 对手温度 {0: 1.56, 1: 1.21, 3: 1.43} ===
轨迹 1/20
轨迹 2/20
轨迹 3/20
轨迹 4/20
轨迹 5/20
轨迹 6/20
轨迹 7/20
轨迹 8/20
轨迹 9/20
轨迹 10/20
轨迹 11/20
轨迹 12/20
轨迹 13/20
轨迹 14/20
轨迹 15/20
轨迹 16/20
轨迹 17/20
轨迹 18/20
轨迹 19/20
轨迹 20/20
座2 @ weaker n=20 平均顺位 3.30 平均点数 11980
1位 10.0% ███
2位 15.0% █████
3位 10.0% ███
4位 65.0% ██████████████████████