是否应该施加额外的约束来缩短 SMT 求解器的求解时间?
Should imposing additional constraints improve solving time for SMT solvers?
我有一个 SMT 应用程序(建立在 Haskell SBV 库上),它使用 Z3 在实数逻辑中针对单个 s
变量求解一些复杂方程。就我而言,找到解决方案大约需要 30 秒。
为了加快速度,我添加了额外的约束 s < 40000
,因为我对解决方案有一些估计。我在想这样的约束会缩小搜索 space 并使求解器 return 更快地得到结果。然而,这只会让它变慢(实际上它甚至没有在 10 分钟内完成)。
问题是:是否可以假设附加约束总是 会减慢down/speeds 求解过程,或者没有通用规则并且总是取决于具体情况?
我担心即使我的 30 秒算法也可能包含一些不一定需要的额外约束,但只会减慢过程。
我认为您不能对此做出任何一般性假设。它可能会或可能不会影响解决时间,假设 sat
/unsat
状态没有改变。
等式通常有帮助(因为它们可以自由传播),但对于其他任何事情,这是任何人的猜测。此外,对于相同的加法,不同的求解器可能会表现出不同的行为。
考虑这一点的一种方法是,底层 DPLL(T) 算法本质上是一种非常智能的美化搜索算法。它不断生成 "learned lemmas",希望它能找到与先前已知事实的矛盾。您添加的新 "constraint" 可能会导致它生成大量正确但不相关的引理,使它陷入困境而没有任何有用的结果。 (量化公式通常是这样的:您可以用一百万种不同的方式实例化它们;但除非您找到 "correct" 实例化,否则它们所做的只是污染您的搜索 space。)
至少这是我的经历!
我有一个 SMT 应用程序(建立在 Haskell SBV 库上),它使用 Z3 在实数逻辑中针对单个 s
变量求解一些复杂方程。就我而言,找到解决方案大约需要 30 秒。
为了加快速度,我添加了额外的约束 s < 40000
,因为我对解决方案有一些估计。我在想这样的约束会缩小搜索 space 并使求解器 return 更快地得到结果。然而,这只会让它变慢(实际上它甚至没有在 10 分钟内完成)。
问题是:是否可以假设附加约束总是 会减慢down/speeds 求解过程,或者没有通用规则并且总是取决于具体情况?
我担心即使我的 30 秒算法也可能包含一些不一定需要的额外约束,但只会减慢过程。
我认为您不能对此做出任何一般性假设。它可能会或可能不会影响解决时间,假设 sat
/unsat
状态没有改变。
等式通常有帮助(因为它们可以自由传播),但对于其他任何事情,这是任何人的猜测。此外,对于相同的加法,不同的求解器可能会表现出不同的行为。
考虑这一点的一种方法是,底层 DPLL(T) 算法本质上是一种非常智能的美化搜索算法。它不断生成 "learned lemmas",希望它能找到与先前已知事实的矛盾。您添加的新 "constraint" 可能会导致它生成大量正确但不相关的引理,使它陷入困境而没有任何有用的结果。 (量化公式通常是这样的:您可以用一百万种不同的方式实例化它们;但除非您找到 "correct" 实例化,否则它们所做的只是污染您的搜索 space。)
至少这是我的经历!