减少scrasapper的方法(带高度提示的拉丁方)到SAT

问题描述 投票:0回答:1

我正在尝试将摩天大楼的拉丁方问题简化为SAT。

[skyscrapper问题与Latin-sqaure相同,但此外,摩天大楼难题还要求玩家将高度不同且独特的建筑物放置在网格上,以便满足网格边缘上的提示。这些“边缘线索”告诉玩家,从给定线索沿木板边缘的位置看,可以看到多少座建筑物。 (full explanation

因此,为了使用SAT解算器解决此问题,我尝试了类似的方法来使用SAT解决suduko(我已经做过)。因此,首先我定义了所有n ^ 3个二进制变量X_i,j,k,这表明在i,j单元格中值k为真(因此在i,j单元格中我们有一个高度为k的摩天大楼) >

我以CNF的形式添加了以下缺点:

  1. 每个单元格仅包含1个真实变量
  2. 每行恰好包含每个值中的1个
  3. 每个列包含每个值的大约1
  4. 现在,我很难确定应该为线索和高度添加哪些约束。首先,我考虑了为给定的每个线索添加每种可能的顺序的选项,例如,如果从左边我可以看到3个摩天大楼(n = 4),那么可能性是:[[2,3,4,1],[1,3,4,2]]但我认为总共是O(n!)...

我使用ILP实现了Suduko求解器,因此我读到了有关使用ILP(整数线性编程)解决此问题的信息。我发现this link描述了如何执行此操作。但是我仍然找不到他们在ILP情况下添加的高度约束的等效项,以适合SAT求解器。

非常感谢!

我正在尝试将摩天大楼的拉丁方问题简化为SAT。摩天大楼问题与拉丁方相同,但此外,摩天大楼难题还要求玩家......>

algorithm reduction sat latin-square
1个回答
0
投票

可能有很多方法,但是想到的可能如下。

对于每个线索C_i,您引入新的帮助程序变量:

© www.soinside.com 2019 - 2024. All rights reserved.