wc-fitness-eval 是一个面向 FIFA 世界杯梦幻足球(Fantasy)的技能,用于对候选阵容或方案进行风险调整后、相对排名的适应度评分。它实现了 footballfantasy/context/frameworks/fitness-function.md 中定义的适应度函数。整个进化引擎都基于这个数值进行选择,因此它必须编码梦幻足球适应度区别于原始得分的两个关键点:排名是相对的(持有率很重要),以及排名目标决定了方差目标(即选择压力旋钮)。
适应度公式
fitness(c | θ) = raw_xEV(c) + cs_corr_bonus(c) + progression_carry(c, horizon) + ownership_leverage(c | θ) − variance_term(c | θ) − feasibility_penalty(c)
各项含义:
- raw_xEV(c):Σ 球员 xEV(按赛程缩放)+ 队长加成
- cs_corr_bonus(c):同队零封相关性(BB2 堆叠)
- progression_carry(c, horizon):深度球队球员未来轮次的折现价值
- ownership_leverage(c | θ):排名项,符号/形状由 θ 决定
- variance_term(c | θ):选择压力,符号随 θ 翻转
- feasibility_penalty(c):修复干净后为 0;不可行则为取消资格级惩罚
工作流程
- 读取输入:候选方案(含 block 标签)、轮次信号(player-ev、clean-sheet、fixture、ownership)、θ 和 k
- raw_xEV:对每位球员的 xEV 求和(来自 wc-player-ev 信号);加上队长加成(来自 wc-captain-ladder)
- cs_corr_bonus:对每个防守堆叠,从 wc-clean-sheet-model 获取
- progression_carry:Σ player_xEV_future × P(球队晋级)^轮次,折现;在淘汰赛阶段权重提高
- ownership_leverage:应用 θ(protect 时覆盖高 EO;gain 时超配低 EO 高上限球员)
- variance_term:估计候选方案方差;按 θ 乘以 ±k
- feasibility_penalty:若修复干净则为 0;否则很大
- 求和 → 适应度;输出适应度 + 完整分解
各步骤细节
raw_xEV — 对每位球员 player-ev 信号中的 xEV 字段求和(已按赛程缩放、按分钟加权,含 60 分钟档位以及红黄牌/失球下行)。队长加成 = 队长阶梯带来的预期额外收益(来自 wc-captain-ladder),即 E[阶梯可达的最佳队长结果],而非简单地对最佳球员乘以 2。对于阵容构建(尚无固定比赛日),使用第 1 轮的队长估计。
cs_corr_bonus — 对每个 Clean-Sheet Spine 堆叠(BB2),wc-clean-sheet-model 返回联合分布加成,捕捉 3 后卫 + 门将堆叠一起爆发的情况。符号由 θ 决定:gain 时放大相关爆发上行;protect 时轻微折价(它们也会一起挂零)。
progression_carry — Σ_player xEV_typical(player) × Σ_{r=next..horizon} P(球队在 r 轮存活) × discount^r。稳定球员若在可能进半决赛的球队,会累积多个未来轮次;而胜负难料的国家的球员则累积很少。决赛中权重约等于 0,早期淘汰赛很高(这正是让 A3 Progression Theorist 在适应度上具有竞争力的原因)。晋级概率来自 wc-fixture-progression。
ownership_leverage(c | θ) — 使用来自 wc-ownership-meta 的有效持有率 EO:
- θ=protect:− w · Σ_{高 EO 但未持有的球员} EO_haul_risk → 奖励覆盖大众选择(惩罚与模板的差距)。
- θ=gain:+ w · Σ_{已持有、低 EO、有活跃上限} (ceiling × (1−EO)) → 奖励差异化。
- θ=neutral:小的对称项;主要让位于 raw_xEV。
variance_term(c | θ) — 候选方案方差来自其球员得分分布的离散度 + 队长方差 + 堆叠相关性:
- protect:+ k · variance(惩罚)— 抑制波动,保住领先
- gain:− k · variance 写作奖励(减去负数)— 你需要波动
- neutral:小惩罚
k 随排名极端程度缩放(大幅领先 + 轮次少 → 高 k_protect;大幅落后 + 轮次少 → 高 k_gain)。
feasibility_penalty — 若候选方案通过修复(预算、国家上限、阵型、15 人结构)则为 0;否则很大/取消资格(将不可行候选排除在精英集之外;其 block 仍可在交叉前被采集)。
揭示偏好软项 — 加上 manager-profile.md 中累积的小额奖励/惩罚(例如“+ 分钟有保障的中场”“− 让最爱的国家队坐板凳”)。软性:它们只倾斜,从不主导。
输出(分解 — 始终返回)
fitness: <数字> decomposition: raw_xEV: <n> captaincy_uplift: <n> cs_corr_bonus: <n> progression_carry: <n> ownership_leverage: <+/- n> # 在 θ 下 variance: <n> variance_term: <+/- n> # 在 θ 下,含 k feasibility_penalty: <n> objective: { theta: protect|gain|neutral, k: <n> } variance_band: low|medium|high
分解是强制性的 — 看板通过它解释选项,引擎需要 variance_band 来在选择中强制覆盖频谱。
Goodhart / 替代效应防护
适应度按设计就是多项目的,这一点不可协商。系统思维摘要中的警示故事(在编写任何智能体适应度指标之前“牢记在心”):每条“最大化 X”规则都会在规则未命名的节点产生替代效应。禁止将适应度坍缩为单一主导项;如果发现某一项压倒了其余项(某个权重设得太高,其他项都成了噪声),那就是 Goodhart 失效正在发生 — 重新平衡。
在输出分解的同时,当某一项承担了大部分工作时,为每个候选方案输出一行替代效应观察:指出候选方案为了在该项得分而放弃了什么。示例:
- captaincy_uplift 主导 → “上限导向;检查它牺牲的替补/分钟下限。”
- ownership_leverage 主导 → “差异化导向;检查它牺牲了多少稳定首发。”
- raw_xEV(本轮)主导 → “本轮导向;检查它忽略的 progression_carry。”
悄悄退化的通常就是目标未命名的节点。在产物上呈现它,让轮次复盘在复利累积之前跨轮次运行替代效应观察。
护栏
- 永远不要将原始得分作为适应度返回。如果未提供 θ,请询问;不要在高风险轮次默默默认为 neutral。
- 永远不要坍缩为单一指标。始终多项目(Goodhart)。每次都要输出分解。
- 同一候选方案在 protect 与 gain 下必须得分不同 — 如果相同,说明方差项接线错误。
- 在信任绝对量级之前,确认 scoring-rules.md 中的分值已确认:true;否则将每个适应度标记为暂定。