第一条代码线索位于 `finishHand`:筹码变化除以20,再截断到-1至+1。

finishHand中的终局奖励路径
finishHand中的终局奖励路径
src/model.cppcpp · 5 行
const float reward = std::clamp(
    static_cast<float>(chipDelta) / 20.f,
    -1.f,
    1.f
);

因此,盈利+20得到+1,盈利+299也同样得到+1;低于-20的损失也被压平。适度胜利与巨大胜利之间的顺序信息消失,学习器更容易优化“尽快抵达正终点”,而不是有效率地增长筹码。

不同筹码盈利被截成同一奖励
不同筹码盈利被截成同一奖励

第二条线索是信用分配:同一个终局值被赋给该回合记录的每个动作。

src/model.cppcpp · 9 行
constexpr float kRate = 0.05f;
for (const Step& step : episode_) {
  for (int i = 0; i < kFeatures; ++i) {
    float& weight = weights_[static_cast<size_t>(step.action * kFeatures + i)];
    weight = std::clamp(weight + kRate * reward * step.features[i], -2.f, 2.f);
  }
}
episode_.clear();
save();

它不区分弃牌、过牌、跟注或加注各自对结果的贡献。全押令牌局快速结束时,轨迹很短,同一个+1可能反复强化少数决策。这不能单独证明原因,却确实让易重复的短路径获得结构性优势。

模型快照与此一致。cheolsu 的全押总值为+0.818,过牌为-1.854,跟注为-5.013,全押的筹码特征为+0.226。younghee 的全押接近零,但过牌和跟注约为-3.657、-3.722,因此全押仍相对有吸引力。minsu 则更偏向 `bbing`,而非全押。

不同模型坍缩到不同的少数动作集合
不同模型坍缩到不同的少数动作集合

所以,把三者称作“相同的全押 AI”并不准确。共同问题是向少数动作发生 policy collapse,但具体动作和权重轮廓并不相同。单个系数也不是完整策略;状态特征、动作 logit 与探索方式共同决定选择。

这项诊断刻意保持有限结论。奖励截断、统一终局信用和短轨迹构成一个与权重相符的合理机制。要确认因果,仍须在控制实验中分别改变截断与信用分配,再比较动作分布和长期收益。