我目前正在尝试用SAT求解器解决这个难题"Kuromasu",该求解器采用通用DIMACS格式输入,即以联合范式(CNF)。
在Kuromasu,你有一个带有mxn细胞的矩形板。细胞是黑色或白色。游戏的目标是决定哪个单元格是哪种颜色。一些单元格包含一个数字。包含数字的单元格始终为白色。该数字告诉您从该单元格中可以看到多少个单元格,包括其自身。同一行和列中的所有白色单元都可见,直到第一个黑色单元格。
示例5x4网格,#表示黑色单元格:
___________
| | |#| |2| <-- 2 cells including itself visible
___________
| | |#| |#|
___________
| |#|3| |#| <-- 3 cells including itself visible
___________
| | | | | |
___________
我需要制定这个约束来以SAT求解器理解的方式找到黑场的位置。 我已经能够通过遍历编号单元格的左侧,右侧,顶部,底部的所有单元格并检查黑色着色是否满足约束来生成每个数字的析取范式(DNF)版本。 这给了我一份DNF中可能的黑色细胞星座列表。 我通过在每个单元格中引入一个变量来编码游戏,如果它是假的则是黑色,如果是真的,则该单元格是白色的。 下面是上面字段的所有变量(1索引,因为DIMACS格式将伪变量指定为负整数,真实变量指定为正变量):
________________
| 1| 2| 3| 4| 5|
________________
| 6| 7| 8| 9|10|
________________
|11|12|13|14|15|
________________
|..|..| | | |
________________
对于上面示例中的仅2个数字约束,我将生成以下内容:
___________
| | | | |2| <-- 2 cells including itself visible
___________
| | | | | |
___________
| | | | | |
___________
| | | | | |
___________
( - 4&amp; -15)| (-3&amp; -10)(Eq 1。)
这表示可以遵循约束的两种方式。 但是,要将此输入到SAT-Solver,我需要将(Eq 1.)转换为CNF。 我实现了一个(天真的)转换器,它可以工作,但由于转换为CNF的complexity,它实际上很慢并且内存密集。对于具有超过4种方法来实现它们的约束来说,这是不可行的。
如何以可以直接输入求解器的方式制定约束?可能吗?我已经考虑了很长一段时间了,并且不能完全理解它。
谢谢!
答案 0 :(得分:1)
上述评论中提到的Tseytin转换效果很好。 以下是java中的一些代码,以防其他任何人需要它。
请注意:这不是Tseytin转换的完整实现,只有输入已经在DNF中才有效。下面的代码也只是一个示例hacky解决方案,例如输入和输出基本上是相同的格式,只是不同的解释,这不是非常类型安全的。随意修改。
编辑:为了我自己的安全/学术诚实,我会在课程作业截止日期(1月8日)之后添加代码。