2017-01-09 48 views
1

我想模擬一個使用巧克力4.0.1的SAT公式。我讀了docs,我試圖從javadoc瞭解,但不幸的是我失敗了。這是我第一次研究這些類型的問題,還有choco。所以,我可能會問一些非常明顯的問題。Choco Sat配方

我需要一些限制的增加,如模型(VAR每一個BoolVar):

x <-> (a and -b) 

我想在模型中使用ifOnlyIf方法,但我不知道如何否定一個變量,或者使用和。有人可以提供我(理想情況下)一些示例代碼或有關如何建模這些類型的約束的任何想法?

回答

2

按照Choco 4.0.1online 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()否定的輸入。

+0

感謝您的回覆,但問題是,當我在示例中使用SatFactory時,我無法訪問這些方法。我想知道我是否做錯了什麼。如果您嘗試使用它,請告訴我,我將不勝感激。 – begumgenc

+0

其實,我修改了一下,它似乎工作。 model.addClauses(LogOp.ifOnlyIf(x,LogOp.and(a,LogOp.nor(b)))); – begumgenc