根据我的理解,增量SAT求解有助于评估彼此非常接近的不同模型。
我想用它来评估模型,如果我稍后更改它,请使用之前的解决方案再次重新评估它以获得更快的结果。然而,在研究了各种SAT求解器(Sat4J,Minisat,mathsat5)之后,似乎只有在一次运行中呈现所有模型时它们才能逐步求解。
我对SAT解决方案很陌生,所以我可能会忽视某些事情。有没有办法保存解决方案以供以后使用?关闭实例时,所有学习都会丢失吗?
答案 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万,这不太可能有所帮助。