6

一連のブール方程式を解くために、次の入力を使用してConstraint-Programming Solver MiniZincを試しています。

%  Solve system of Brent's equations modulo 2

%  Matrix dimensions
int: aRows = 3;
int: aCols = 3;
int: bCols = 3;
int: noOfProducts = 23;

%  Dependent parameters
int: bRows = aCols;
int: cRows = aRows;
int: cCols = bCols;
set of int: products = 1..noOfProducts;

%  Corefficients are stored in arrays
array[1..aRows, 1..aCols, products] of var bool: A;
array[1..bRows, 1..bCols, products] of var bool: B;
array[1..cRows, 1..cCols, products] of var bool: C;

constraint
    forall(rowA in 1..aRows, colA in 1..aCols) (
        forall(rowB in 1..bRows, colB in 1..bCols) (
            forall (rowC in 1..cRows, colC in 1..cCols) (
                xorall (k in products) (
                    A[rowA, colA, k] /\ B[rowB, colB, k] /\ C[rowC, colC, k]
                ) == ((rowA == rowC) /\ (colB == colC) /\ (colA == rowB))
            )
        )
    );

solve satisfy;

%  Output solution as table of variable value assignments
output 
["\nSolution for <" ++ show(aRows) ++ ", " ++ show(aCols) ++ 
                 ", " ++ show(bCols) ++ "> " ++ show(noOfProducts) ++ " products:"] ++
["\nF" ++ show(100*rowA+10*colA+k) ++ " = " ++ 
show(bool2int(A[rowA, colA, k])) |
rowA in 1..aRows, colA in 1..aCols, k in products] ++

["\nG" ++ show(100*rowB+10*colB+k) ++ " = " ++ 
show(bool2int(B[rowB, colB, k])) |
rowB in 1..bRows, colB in 1..bCols, k in products] ++

["\nD" ++ show(100*rowC+10*colC+k) ++ " = " ++ 
show(bool2int(C[rowC, colC, k])) |
rowC in 1..cRows, colC in 1..cCols, k in products];

MiniZincは小さなパラメータの解決策を見つけます(rows=cols=2, products=7)が、わずかに増加したパラメータでは解決しません。生成されたFlatZincモデルをCryptominisatLingeling 、またはClaspなどのSAT ソルバーにフィードしたいと考えています。これらのツールが既存の MiniZinc バックエンドよりも優れていることを願っています。

私の質問:純粋な Boolean FlatZincモデルをCNF (DIMACS)
に変換するツールはありますか? MiniZinc バックエンドの一部がサポートしていないように見える ため、述語を置き換えるにはどうすればよいですか?
xorall()

4

1 に答える 1

5

FlatZinc ファイルを CNF (DIMACS) ファイルに変換するツールを知りません。(MiniZinc ディストリビューションには、flatzinc を XCSP 形式に変換するプログラムがあります。XCSP を CNF に変換するツールがあるのではないでしょうか?)

ただし、minicsp、fzn2smt など、より優れた SAT ベース/インスパイアされたソルバーがいくつかあります。問題は、あなたが言及したように、まったく新しい xorall() 関数をサポートしていないことです。

また、ラベル付けされた検索、つまり次のようなものを使用することをお勧めします (bool_search に注意してください)。

  solve :: bool_search(
       [A[i,j,k] | i in 1..aRows, j in 1..aCols, k in products],
       first_fail,
       indomain_min,
       complete)
     satisfy;

また、代わりに 0..1 ベースのモデルに変換してテストすることをお勧めします。これらのソルバーは他のソルバーと同様にテストできます。

これは、var bool を var 0..1 に変更し、xorall() を sum() と bool2int() に置き換えた変換後のモデルです [正しく変換できれば幸いです。] 更新: バージョンに変更しましたアクセルが提案した。

 %  Solve system of Brent's equations modulo 2

 %  Matrix dimensions
 int: aRows = 3;
 int: aCols = 3;
 int: bCols = 3;
 int: noOfProducts = 23;

 %  Dependent parameters
 int: bRows = aCols;
 int: cRows = aRows;
 int: cCols = bCols;
 set of int: products = 1..noOfProducts;

 %  Corefficients are stored in arrays
 array[1..aRows, 1..aCols, products] of var 0..1: A; % hakank: change to 0..1
 array[1..bRows, 1..bCols, products] of var 0..1: B;
 array[1..cRows, 1..cCols, products] of var 0..1: C;

constraint
     forall(rowA in 1..aRows, colA in 1..aCols) (
         forall(rowB in 1..bRows, colB in 1..bCols) (
             forall (rowC in 1..cRows, colC in 1..cCols) (
                 % hakank: changed
                 sum (k in products) (
                     bool2int(A[rowA, colA, k]=1/\ B[rowB, colB, k]=1 /\ C[rowC, colC, k]=1)
                ) == 
                     %% bool2int(rowA == rowC)+ bool2int(colB == colC) + bool2int(colA == rowB)
                     bool2int((rowA == rowC)/\(colB == colC)/\(colA == rowB))
             )
         )
     );


     solve :: int_search(
         [A[i,j,k] | i in 1..aRows, j in 1..aCols, k in products] ++ 
         [B[i,j,k] | i in 1..aRows, j in 1..aCols, k in products] ++ 
         [C[i,j,k] | i in 1..aRows, j in 1..aCols, k in products] 
         ,
         first_fail,
         indomain_min,
         complete)
     satisfy;

    %  Output solution as table of variable value assignments
    output 
    ["\nSolution for <" ++ show(aRows) ++ ", " ++ show(aCols) ++ 
             ", " ++ show(bCols) ++ "> " ++ show(noOfProducts) ++ " products:"] ++
    ["\nF" ++ show(100*rowA+10*colA+k) ++ " = " ++ 
        show(A[rowA, colA, k]) |
        rowA in 1..aRows, colA in 1..aCols, k in products] ++

    ["\nG" ++ show(100*rowB+10*colB+k) ++ " = " ++ 
       show(B[rowB, colB, k]) |
       rowB in 1..bRows, colB in 1..bCols, k in products] ++

    ["\nD" ++ show(100*rowC+10*colC+k) ++ " = " ++ 
       show(C[rowC, colC, k]) |
       rowC in 1..cRows, colC in 1..cCols, k in products];

モデルは次のとおりです: http://www.hakank.org/minizinc/akemper1_2.mzn .

[更新: これらの時間は以前の間違ったモデルのものです。] モデルの問題インスタンスは、3 秒で minicsp (平坦化を含む) によって、5 秒で Opturion CPX ソルバーによって、6 秒で fzn2smt によって解決されます (最初の解決策)。また、モデルはラベル付けなどでさらに微調整できる可能性があります。

言及されているソルバーへのリンク:

FlatZinc ソルバーのより長いリストについては、私の MiniZinc ページ ( http://www.hakank.org/minizinc/ ) も参照してください。

于 2014-03-13T23:09:06.143 に答える