优化的目标
每个推荐目标对应一个数值,搜索让这个数值尽可能大:撃奏ライブ和自由ライブ是所选歌曲、难度的期望分数;刷活动 PT 是每局的期望活动 PT;综合力最高是队伍综合力。
期望分数:每局开始时,5 名成员的技能发动顺序会被随机打乱。我们把 5 人的 120 种顺序视为等概率,每种顺序都完整模拟一整局(技能、Snap 效果,撃奏ライブ还包括激走区间与名次加分),再取平均。技能或任务带抽签时,按游戏中的概率对抽签结果求期望。
演奏条件:默认是理论最佳打法,全部 Perfect,撃奏ライブ中能判 Just 的音符全部 Just。在“演奏假设”里调整 Great 率或 Just 率后,按比例把 Great 和非 Just 的判定均匀分布到整张谱面上再计算。它描述的是一份声明的演奏,不是对你实际表现的预测。
一支队伍由队长、其余 4 名成员和每人搭配的 Snap 组成。4 名成员之间换站位不影响分数,所以结果里的站位只是展示。
候选范围
候选范围 D 是你卡池里所有合法的队伍:满足游戏的编成规则,以及你在“卡牌限制”里设置的必选和排除。不同的队长、成员组合和 Snap 搭配都是不同的候选。
计算使用你录入的卡牌养成(等级、特训、卡阶、技能等级)和玩家加成。卡池中缺少的数值会先列出来请你补齐;结果没有覆盖全部持有卡时,页面会注明。
“已证明最优”的定义
“已证明最优”表示:在完整的合法候选范围 D 中,列出的结果恰好是按“目标值降序 → 综合力降序 → 规范 ID 顺序”排列的前 min(K, |D|) 支队伍,K 是页面返回的数量(5)。队伍的选择、名次和同分时的先后都已确定。
证明不需要逐一计算每支队伍。每个候选要么和结果精确比较过,要么被可靠的上界排除:它能达到的最好值已经低于第 K 名的精确值。这不是抽样,也不是近似。
如果 D 为空,“已证明”表示在这些条件下没有可行的队伍。
这是相对于声明的计算模型的算法证明,依赖模型、上界和程序都正确。没有录入的卡、填错的养成、实际演奏中的失误都不在计算之内。
- 目标值
- 所选推荐目标的精确值,例如 120 种顺序的平均分。
- 上界
- 保证不低于真实值的估计。上界已经低于门槛的候选,真实值只会更低,可以直接排除。
- 规范 ID 顺序
- 目标值和综合力都相同时,按卡牌编号的固定顺序排列,同一输入总是得到同一结果。
“未证明”与当前最优
“未证明”表示精确搜索尚未完成最优性证明;已有结果可能最优,也可能不是。
到达你选的最长计算时间或手动停止时会出现这种情况。页面列出目前找到的最好队伍,它们的数值都经过精确计算;同时给出“当前最好”和“最优不超过”两个数。任何队伍都不会超过后者,所以真正的最优落在两者之间,差距越小,离最优越近。
想要证明,可以把最长计算时间调长或选“不限”,再算一次。
搜索策略
队伍数量随卡池增长得极快,逐一模拟不可行。搜索采用分支定界:把候选一步步展开(先定队长,再加成员和 Snap),给每个尚未完整的部分队伍估一个上界。只要上界已经低于当前第 K 名的精确值,这一整枝都不可能进入结果,直接剪掉。
上界分两层。部分队伍用预先算好的表估计,计算很快,并且只会高估;只有完整的 5 人队伍才做整局模拟。120 种顺序和抽签也先用区间夹住,只有区间分不出名次时才细化到精确值。
门槛越高,剪掉的越多。搜索会尽早找到强队并精确计算,作为门槛;之后每找到更好的队伍,门槛随之抬高。
候选按队长分成互不重叠的组分别搜索,最后合并。分组不改变结果:同样的输入总是得到同样的队伍和名次。
到达时间上限时,搜索停下并报告当前最好的队伍和剩余候选的上界,也就是“未证明”时看到的两个数。
怎么读结果
每个结果显示目标值、综合力、游戏原生样式的编成,以及每个位置的成员卡、养成和搭配的 Snap。
目标值有时显示为区间,表示精确值落在其中,例如带抽签的技能还没有细化时。
计算完成后,每支队伍还会列出 120 种顺序中分数最低、居中和最高的顺序,用来了解技能顺序带来的波动。
源码
计算模型(crates/ournotes-sim)与搜索算法(crates/ournotes-search)都在 GitHub 的 empty-sekai/ournotes-deck 仓库公开,组卡页顶部有直达链接。