为了解决布尔方程组问题,我正在使用以下输入对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模型输入到卫星解算器中,比如隐孢子虫、凌岭或卡环。我希望这些工具的性能可能优于现有的MiniZinc后端。
我的问题:
是否有任何工具可以将纯布尔型FlatZinc模型转换为CNF (DIMACS)
当一些xorall()后端似乎不支持它时,我能做什么来替换MiniZinc谓词呢?
发布于 2014-03-13 23:09:06
我不知道有什么工具可以将FlatZinc文件转换为和CNF (DIMACS)文件。( MiniZinc发行版有一个程序将平面锌转换为XCSP格式。也许有一个XCSP到CNF的工具?)
然而,有一些基于SAT的/受启发的解决方案可能更好,例如minicsp、fzn2smt。问题是,正如您提到的,它们不支持非常新的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(),我希望转换正确。更新:我已经更改为Axel建议的版本。
% 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];下面是模型:2.mzn。
更新:这些时间是早期的,错误的,模型。该模型中的问题实例用3s的最小解(包括平坦)、5s的Opturion CPX求解器和6s的fzn2smt求解。该模型还可以通过贴标等进行进一步的调整。
与所提到的解决者的链接:
还可以查看我的MiniZinc页面,以获得更长的FlatZinc解决程序列表:http://www.hakank.org/minizinc/。
https://stackoverflow.com/questions/22392219
复制相似问题