2017-11-28 12 views
0

ソルバー古いクラス:チョコ私はチョコソルバーで魔方陣プログラムを解決するため、このコードを見つけ

public static void main(String[] args) { 
    int n = 4; 
    System.out.println("Magic Square Problem with n = " + n); 

    Problem myPb = new Problem(); 

    IntVar[] vars = new IntVar[n * n]; 
    for (int i = 0; i < n; i++) 
     for (int j = 0; j < n; j++) { 
     vars[i * n + j] = myPb.makeEnumIntVar("C" + i + "_" + j, 1, n * n); 
    } 
    IntVar sum = myPb.makeEnumIntVar("S", 1, n * n * (n * n + 1)/2); 

    myPb.post(myPb.eq(sum, n * (n*n + 1)/2)); 
    for (int i = 0; i < n * n; i++) 
     for (int j = 0; j < i; j++) 
     myPb.post(myPb.neq(vars[i], vars[j])); 

    int[] coeffs = new int[n]; 
    for (int i = 0; i < n; i++) { 
     coeffs[i] = 1; 
    } 

    for (int i = 0; i < n; i++) { 
    IntVar[] col = new IntVar[n]; 
    IntVar[] row = new IntVar[n]; 

    for (int j = 0; j < n; j++) { 
     col[j] = vars[i * n + j]; 
     row[j] = vars[j * n + i]; 
    } 

    myPb.post(myPb.eq(myPb.scalar(coeffs, row), sum)); 
    myPb.post(myPb.eq(myPb.scalar(coeffs, col), sum)); 

    myPb.solve(); 
}  

しかし、クラスの問題は '「モデル」クラスに置き換えられているようです。 Problem.makeEnumIntVarの代わりにModel.intVarを使用するのは正しいですか? Problem.neq、Problem.eq、Problem.scalarを置き換える現在の関数は何でしょうか?

答えて

1

廃止予定のコードがあるようです。例えば、上記のコードは、スカラー積は、容量に等しく、OBJ1ことがOBJ2に等しくなければならないという制約を表現

int capacity = 34; // max capacity 
int[] volumes = new int[]{7, 5, 3}; 

// Problem.scalar 
model.scalar(new IntVar[]{obj1, obj2, obj3}, volumes, "=", capacity).post(); 

// Problem.eq 
model.arithm(obj1, "=", obj2).post(); 

として表現

Problem.scalar and Problem.eq 

を表すことができます。 。

さらに読書や資源:特にhttps://github.com/chocoteam/choco-solver/tree/master/src/test/java/org/chocosolver/solver

choco tutorial

が最後にあなたもgithubのにテストケースをチェックアウトすることができます:ここで

あなたはいくつかのサンプルコードでlatestsのチュートリアルを見つけますの変数の式のテストは面白いかもしれません。

ここにいくつかのコード例があります: more code samples

関連する問題