中国象棋估值策略
23 2025-10-02 09:33
估算体系(Evaluation Systems)并不是单一的,而是多层、多阶段、多用途的。它们各司其职,不直接累加,而是通过逻辑顺序、条件判断、选择性启用的方式协同工作。
✅ 一、估算体系总览
表格
复制
估算体系名称 | 所在文件 | 作用阶段 | 主要用途 | 是否参与最终评估 |
---|---|---|---|---|
PreEval 静态预评估 | preeval.cpp |
搜索前 | 初始化棋子位置价值 | ✅ 是,基础输入 |
Material 子力价值 | position.cpp |
搜索中 | 快速子力对比 | ✅ 是,评估起点 |
AdvisorShape 士象形状评估 | evaluate.cpp |
搜索中 | 士象布局合理性 | ✅ 是,逐步加分 |
StringHold 牵制评估 | evaluate.cpp |
搜索中 | 车炮牵制威胁 | ✅ 是,逐步加分 |
RookMobility 车机动性 | evaluate.cpp |
搜索中 | 车活动范围 | ✅ 是,逐步加分 |
KnightTrap 马陷阱评估 | evaluate.cpp |
搜索中 | 马是否被憋 | ✅ 是,逐步加分 |
MVV-LVA 吃子排序估值 | genmoves.cpp |
搜索中 | 吃子走法排序 | ❌ 否,仅用于排序 |
Quiescence Eval 静态搜索评估 | search.cpp |
叶子节点 | 吃子延伸评估 | ✅ 是,替代静态评估 |
✅ 二、评估流程与判断顺序
🔍 步骤 1:PreEval(搜索前)
-
作用:为每个棋子赋予位置价值(中局/残局插值)
-
结果:写入
vlWhite
,vlBlack
,作为评估起点
🔍 步骤 2:Material(搜索中)
-
作用:快速计算子力总价值
-
代码:cpp
-
复制
vl = this->Material();
-
是否累加:是,作为评估基准
🔍 步骤 3:逐步加分评估(evaluate.cpp)
这些评估按顺序执行,逐步累加,但每一步都可提前返回(剪枝优化):
cpp
复制
vl += this->AdvisorShape(); // 士象形状
vl += this->StringHold(); // 牵制
vl += this->RookMobility(); // 车机动性
vl += this->KnightTrap(); // 马陷阱
⚠️ 注意:每一步后都检查是否超出vlAlpha/vlBeta
,若超出则立即返回,不再继续累加。
🔍 步骤 4:Quiescence Search(叶子节点)
-
作用:在叶子节点进行吃子延伸,避免“水平线效应”
-
是否替代静态评估:是,不再使用 Material + Evaluate,而是使用
SearchQuiesc()
返回的值
✅ 三、总结:是否累加?
表格
复制
体系 | 是否累加 | 累加方式 | 备注 |
---|---|---|---|
PreEval | ✅ | 初始化时累加 | 作为基础价值 |
Material | ✅ | 评估起点 | 可单独使用 |
AdvisorShape 等 | ✅ | 逐步累加 | 可中途剪枝 |
MVV-LVA | ❌ | 不参与评估 | 仅用于走法排序 |
Quiescence | ✅ | 替代静态评估 | 在叶子节点使用 |
✅ 四、一句话总结
ElephantEye 使用“分层评估 + 逐步累加 + 条件剪枝”的策略,PreEval 和 Material 是基础,形状/机动性/陷阱等是可选加分项,MVV-LVA 仅用于排序,Quiescence 在叶子节点替代评估。
全部评论