“高性能实现常用双监视文字维护传播队列,用VSIDS选择下一决策变量,并按SAT 重启策略周期性清空非根 trail。这三者分别改变索引、搜索顺序和搜索阶段,不参与学习子句可靠性的证明;换掉其…”
形式陈述 ​
VSIDS 为尚未赋值的变量维护活动度,并优先选择分数最高者作为下一决策变量。原始 Chaff 版本按文字出现和周期衰减更新;现代求解器更常采用 EVSIDS:在每次CDCL冲突分析后,对参与冲突或学习子句的变量 bump,并让旧贡献按指数速度衰减。一个便于分析的规范化递推是
其中
变量选择与极性选择是两个接口。VSIDS 决定“下一次问哪个变量”,saved phase、phase caching 或随机相位决定“先试真还是假”。优先队列中的键必须随 bump 更新;已经赋值的高分变量暂时跳过,回溯后再恢复候选资格。活动度只改变搜索顺序,不增添子句,也不作为传播理由。
直觉
一次冲突暴露了当前公式中刚刚活跃的一片约束。若变量反复出现在近期冲突原因里,围绕它作新决策往往能较快触发传播或新的冲突,从而继续细化这一局部结构。指数衰减让很久以前的热点逐渐让位,而不是让早期偶然事件永久统治队列。
VSIDS 的“state independent”不表示它与求解状态无关;名称强调分数不直接按变量当前真、假、未赋值三态定义。实际活动度高度依赖已学子句、冲突分析和 restart 历史。它是一种在线反馈控制,而不是对变量语义重要性的静态测量。
例子与边界
取
按递推计算,
若三者均未赋值,第三次冲突后选择
边界在于“近期活跃”不等于“应取真”,也不保证产生最小搜索树。某些构造实例会诱导启发式长期关注错误区域,改变 tie-breaking 或随机种子即可令运行时间大幅变化。VSIDS 不承担可靠性:即使分数更新有 bug,只要求解器仍公平探索并验证冲突,可能只是变慢;若启发式永久饿死某些必要决策,则终止性和完备性才会受损。活动度也不是概率,不能解释为变量属于模型的置信度。
推论与应用
高活动变量与 learned clauses 共同形成短期搜索焦点。Restart 后 trail 被清空而活动度通常保留,使下一阶段围绕刚才的冲突区域重新排列决策;若连活动度也清零,restart 就失去这部分跨阶段记忆。Clause activity 与 variable activity 是不同队列:前者常用于决定保留哪些 learned clauses,后者用于分支,不能混用阈值。
实际评估需固定衰减率、bump 集定义、phase policy、restart 与子句删除,因为这些机制相互反馈。只报告“启用了 VSIDS”不足以复现实验。自适应分支算法可以混合活动度、学习率或随机探索,但任何更换都应通过运行分布而非单个最快样例比较。
参考资料
- Matthew W. Moskewicz, Conor F. Madigan, Ying Zhao, Lintao Zhang, and Sharad Malik, “Chaff: Engineering an Efficient SAT Solver,” DAC, 2001, pp. 530–535。
- Niklas Eén and Niklas Sörensson, “An Extensible SAT-solver,” Theory and Applications of Satisfiability Testing, LNCS 2919, Springer, 2004, pp. 502–518。
- Armin Biere, Marijn Heule, Hans van Maaren, and Toby Walsh, eds., Handbook of Satisfiability, 2nd ed., IOS Press, 2021, Chapter 4。