Choco Sat配方

时间:2017-01-09 12:53:40

标签: constraint-programming sat choco

我正在尝试使用Choco 4.0.1为SAT公式建模。我读了docs,我试图从javadoc中理解,但不幸的是我到目前为止失败了。这是我第一次处理这类问题以及choco。所以,我可能会问一些非常明显的事情。

我需要为模型添加一些约束(每个var都是一个BoolVar):

x <-> (a and -b)

我试图在Model中使用ifOnlyIf方法,但我不知道如何否定变量,或者使用和。有人可以(理想情况下)提供一些示例代码或关于如何对这些类型的约束进行建模的任何想法吗?

1 个答案:

答案 0 :(得分:2)

根据Choco 4.0.1 online manual,它应该是这样的:

SatFactory.addClauses(LogOp.ifOnlyIf(x, LogOp.and(a, LogOp.nor(b))), model);
// with static import of LogOp
SatFactory.addClauses(ifOnlyIf(x, and(a, nor(b))), model);

但是,手册似乎已经过时了。 就像评论中提到的那样,我到达了:

import static org.chocosolver.solver.constraints.nary.cnf.LogOp.and;
import static org.chocosolver.solver.constraints.nary.cnf.LogOp.ifOnlyIf;
import static org.chocosolver.solver.constraints.nary.cnf.LogOp.nor;

import org.chocosolver.solver.Model;
import org.chocosolver.solver.variables.BoolVar;

public class AkChocoSatDemo {

    public static void main(String[] args) {
        // 1. Create a Model
        Model model = new Model("my first problem");

        // 2. Create variables
        BoolVar x = model.boolVar("X");
        BoolVar a = model.boolVar("A");
        BoolVar b = model.boolVar("B");

        // 3. Post constraints
        // LogOp omitted due to import static ...LogOp.*
        model.addClauses(ifOnlyIf(x, and(a, nor(b))));

        // 4. Solve the problem
        model.getSolver().solve();

        // 5. Print the solution
        System.out.println(x); // X = 1
        System.out.println(a); // A = 1
        System.out.println(b); // B = 0
    }
}

我使用nor()将单个参数设为not()来否定输入。