将 Boolean FlatZinc 转换为 CNF DIMACS

2024-04-29

为了解决一个布尔方程组 http://arxiv.org/abs/1108.2830,我正在尝试Constraint-Programming Solver MiniZinc http://www.minizinc.org/使用以下输入:

%  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 http://www.minizinc.org/确实找到了小参数的解决方案(rows=cols=2, products=7),但并没有随着稍微增加而结束。 我想喂养生成的FlatZinc http://www.minizinc.org/模型化为SAT求解器 http://en.wikipedia.org/wiki/SAT_solver#Algorithms_for_solving_SAT like 小型隐秘卫星 http://www.msoos.org/cryptominisat2/, 林格林 http://fmv.jku.at/lingeling/ or Clasp http://www.cs.uni-potsdam.de/clasp/。我希望这些工具的性能可能优于现有的 MiniZinc 后端。

我的问题:
有没有什么工具可以转换纯布尔值FlatZinc http://www.minizinc.org/模型化为CNF (DIMACS) http://people.sc.fsu.edu/~jburkardt/data/cnf/cnf.html?
我可以做什么来更换xorall()谓词,因为某些 MiniZinc 后端似乎不支持它?


我不知道有什么工具可以将 FlatZinc 文件转换为 CNF (DIMACS) 文件。 (MiniZinc 发行版有一个将 flatzinc 转换为 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() [我希望我转换正确。] 更新:我已更改为版本阿克塞尔提议道。

 %  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 http://www.hakank.org/minizinc/akemper1_2.mzn .

[更新:这些时间针对较早的错误模型。] 模型中的问题实例由 minicsp 在 3 秒内解决(第一个解决方案),由 Opturion CPX 求解器在 5 秒内解决,由 fzn2smt 在 6 秒内解决。该模型也许可以通过标签等进一步调整。

提到的求解器的链接:

  • 选项 CPX:http://www.opturion.com/cpx.html http://www.opturion.com/cpx.html

  • 小型CSP:http://www.inra.fr/mia/T/katsirelos/minicsp.html http://www.inra.fr/mia/T/katsirelos/minicsp.html

  • fzn2smt:http://ima.udg.edu/Recerca/ESLIP/fzn2smt/index.html http://ima.udg.edu/Recerca/ESLIP/fzn2smt/index.html

另请参阅我的 MiniZinc 页面,了解更多 FlatZinc 求解器列表:http://www.hakank.org/minizinc/ http://www.hakank.org/minizinc/ .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Boolean FlatZinc 转换为 CNF DIMACS 的相关文章

  • 如何在 MiniZinc 中安装 Google 的 CP 求解器 OR-Tools?

    我目前正在研究 MiniZinc 并且我一直在使用 MiniZinc 中集成的两个求解器来运行我的模型 Gecode 和 Chuffed 我一直在 IDE 中运行它 但我知道它也可以在 bash 中运行 使用minizinc命令 但我想测试
  • Google OR 工具 - 火车调度问题

    我试图解决的问题有点像这里的员工调度问题 https github com google or tools blob master examples python shift scheduling sat py 然而 有一些事情我被困住了
  • 约束编程:多个工人的调度

    我是约束编程的新手 我想这是一个简单的问题 但我无法解决它 问题是这样的 我们有多台机器 N 每台机器的资源都是有限的 比如说内存 所有机器的资源可以相同 我们有 T 个任务 每个任务都有一个持续时间 并且每个任务都需要一定量的资源 只要不
  • 约束规划:在最短的时间内安排发言人

    我正在尝试通过以下方式调整已经解决的约束规划问题哈坎 凯勒斯特兰德 hakankless 并且需要一些帮助 原来解决的问题 有6个公共演讲者和6个房间 每个发言者应分配到一个房间 没有任何房间是空的 每个发言者只能在一个房间内 解决方案在这
  • 使用 Solver Foundation 进行约束规划的缺点

    使用 Microsoft Solver Foundation for CLP 有哪些缺点 Solver 确实在 Express Standard 版本中提供了一些支持 但可以想象 人们需要购买昂贵的 Gurobi Knitro 附加组件才能
  • 如何使 Z3 的 (Python) SAT 求解偏向某个标准,例如“更喜欢”具有更多否定文字

    在 Z3 Python 中 有什么方法可以将 SAT 搜索 偏向 标准 吗 一个案例 我想要Z3获取一个模型 但不是任何模型 如果可能的话 给我一个具有大量否定文字的模型 因此 举例来说 如果我们必须搜索A or B一个可能的模型是 A T
  • OptaPlanner 是否支持连续变量的优化和约束?

    我正在阅读文档中矛盾的内容 一方面 这段话似乎表明连续计划变量是可能的 规划值范围是一个可能的规划值的集合 规划变量 该集合可以是离散的 例如第 1 2 3 行 或 4 或连续 例如 0 0 和 1 0 之间的任何双精度值 另一方面 在定义
  • Google OR 工具:如何评估复杂或多级布尔约束

    Set up 我使用 google OR 工具作为约束编程求解器 from ortools sat python import cp model 我定义了以下 BoolVars model cp model CpModel a model
  • 来自加德纳的拼图

    我试图在 Prolog 中解决以下难题 编号为 0 9 的 10 个单元格刻有一个 10 位数字 每个单元格 例如 i 表示数字 i 在该数字中出现的总数 找到这个号码 答案是6210001000 这是我在 Prolog 中写的 但我被卡住
  • 引入输出语句时MiniZinc找不到解决方案

    我有一个用 minizinc 编写的简单模型 我使用 gecode 首先将其编译为 flat zinc 来解决它 作为输入 模型采用一些常量 数组和矩阵 二维数组的形式 模型的输出是另一个必须满足一些约束的二维矩阵 目标优化是最小化 目标
  • 布尔表达式的最小化是NP完全的吗?

    我知道布尔可满足性是 NP 完全的 但它是布尔表达式的最小化 简化 我的意思是采用符号形式的给定表达式并生成符号形式的等效但简化的表达式 NP 完全 我不确定是否会从可满足性降低到最小化 但我觉得可能是这样 有人有确切消息么 好吧 这样看
  • 有没有办法在 minizinc 中自定义 int_search ?

    我正在处理图形着色问题 想知道是否可以指定搜索策略 我找到了搜索注释 比如int search q first fail indomain min 但例如 我希望算法选择具有最高节点度数的下一个节点 假设这会导致更快的失败 因为具有高度数的
  • 解决命题逻辑/布尔表达式的工具(SAT Solver?)

    我对命题逻辑和布尔表达式主题很陌生 所以这就是我需要帮助的原因 这是我的问题 在汽车行业 当您购买汽车时 有数千种不同的组件可供选择 并非每个组件都是可组合的 因此对于每辆车都存在许多用命题逻辑表达的规则 就我而言 每辆车都有 2000 到
  • 为什么我的规则不能用简单的代数方程求解 X?

    我是 Prolog 新手 所以请保持温柔 这是我的规则 solve X A B A is 7 X 2 B is 3 X 4 显然 这里的正确答案是6 5 如果我把它交给 Prolog 它会证实 solve 6 5 yes 然而 如果我要求
  • 具有重叠时隙的会议调度算法

    我想做类似的事情预约调度算法 N个人 N个忙闲时段 约束满足 https stackoverflow com questions 11143439 appointment scheduling algorithm n people with
  • 用累积值表示设置时间

    调度问题有很多系列 我正在研究一个问题 我有一系列的工作 任务 需要从一个家庭过渡到另一个家庭 需要重新配置机器 设置时间 我在用着cumulatives 2 3 解决这个问题 但我不确定设置时间如何 可以表达 在这个小例子中 我有 10
  • Google Or-Tools员工排班。条件无法正常工作

    我在用着那个护士调度的例子 https developers google com optimization scheduling employee scheduling 我有 3 名员工 2 班次 7 天 我有一个条件 如果一名员工在 1
  • Smullyan 数值机的解决方案

    在这里我建议找到 Smullyan 数值机的解决方案 此处定义 http heras gilsanz com manuel smullyan machines html 问题陈述 它们是接受数字列表作为输入 并根据输入模式遵循一些规则将其转
  • 使 K 不同(基数) google OR-TOOLS

    我想知道 google or tools 中是否存在 Solver AllDifferent x 的泛化 允许指定我允许的不同元素的数量 因此 如果 len x 4 则 AllDifferent x 意味着 len set x 4 但是 如
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含

随机推荐