增量SAT求解:保存求解实例 - 在运行之间更改模型

时间:2016-05-24 07:27:27

标签: sat sat4j

根据我的理解,增量SAT求解有助于评估彼此非常接近的不同模型。

我想用它来评估模型,如果我稍后更改它,请使用之前的解决方案再次重新评估它以获得更快的结果。然而,在研究了各种SAT求解器(Sat4J,Minisat,mathsat5)之后,似乎只有在一次运行中呈现所有模型时它们才能逐步求解。

我对SAT解决方案很陌生,所以我可能会忽视某些事情。有没有办法保存解决方案以供以后使用?关闭实例时,所有学习都会丢失吗?

2 个答案:

答案 0 :(得分:0)

在增量模式下,您可以使用新约束为求解器提供信息。

根据设置,解算器可能会或可能不会忘记以前学过的从句和启发式。

要充分利用增量模式并丢弃先前在系统中输入的约束,您需要使用“假设”,即将激活或禁用求解器中约束的特定变量。

参见例如minisat新闻组中的讨论:https://groups.google.com/forum/#!topic/minisat/ffXxBpqKh90

答案 1 :(得分:0)

SAT4J提供了一种机制,允许您提供解算器,然后删除部分条款,并添加新的子句,以便下次检查是否可满足。需要删除的子句需要添加到ConstGroup中。不幸的是,由于单元条款需要特殊处理,因此它更加复杂。它的工作方式大致如下:

solver = initialize it with clauses which are not to be removed
boolean satisfiable;
ConstrGroup group = new ConstrGroup();
IVecInt unit = new VecInt();
try {
    for (all clauses to be added and removed) {
        if (unit clause) {
            unit.push(variable from clause);
        } else {
            group.add(solver.addClause(clause));
        }
        satisfiable = solver.isSatisfiable(unit);
    } catch (ContradictionException e) {
        satisfiable = false;
    } finally {
        group.removeFrom(solver);
    }

不幸的是,删除条款是以一种相当幼稚的方式实施的,需要在要删除的条款数量方面进行二次努力。

虽然此解决方案适用于FeatureIDE(请参阅https://github.com/FeatureIDE/FeatureIDE/blob/develop/plugins/de.ovgu.featureide.fm.core/src/org/prop4j/SatSolver.java中的isSatisfiable(节点节点)),但可能会有更多高性能解决方案。

具有假设的其他解决方案在我们的情况下不起作用,因为我们对具有多达20,000个变量的单个SAT求解器实例有数百万个查询。假设会将变量的数量从2万增加到100万,这不太可能有所帮助。