注意:这是我其他答案的延续和修订。
减少问题
回顾决策问题:
是否有一个完美的拼贴覆盖一个给定的网格,其中包含唯一的拼贴?n(n + 1 )× (n + 2 )ñ
因此,对于网格,我们只能使用变量。n(n + 1 )× (n + 2 )ñ
但:
- 我们的约简需要很多唯一变量,远不。O(n )
- 此外,我们的电线是开放式的,从而导致:
为了解决第一个问题,我们人为地使游戏板更大。本质上,我们使等于我们实际需要的变量数量,然后创建一个大小为的网格,并将该网格放置在左下角。这将导致二次爆破。(n + 1 )× (n + 2 )ñ(n + 1 )× (n + 2 )
对于第二个问题,我们必须重新考虑一下小工具。
证明我们可以根据规则成功平铺板子的其余部分似乎有些艰巨。因此,我们从一种实际用于生成大小游戏板的策略开始:(n + 1 )× (n + 2 )
首先,我们生成一组所有可能的图块。所有这些瓷砖都必须放在板上。然后,我们移除瓷砖,并留下它们的正方形。
但是,我们的小工具不能保证会放置特定的瓷砖。放置的瓷砖取决于状态。因此,无论选择哪种状态,我们都必须仔细修改小工具以确保将删除特定的图块。
那让我们来看一下我们的小工具。
线和子句门有问题是出于两个原因。
- 我们不知道导线或子句门周围的正方形是否可以正确平铺;毕竟,有些导线可以向左推动,另一些导线可以向右推动,并且平铺剩余的空白正方形变得不平凡。我们将这个问题称为“流量”问题。
- 无法知道要从图块集中删除哪些图块。在一种状态下,将在线或子句门中对一组正方形进行平铺,在另一种状态下,将对一组完全不同的正方形进行平铺。
解决这些问题:
- 首先,我们生成一组所有可能的图块。所有这些瓷砖都必须放在板上。当我们将它们放置在板上时,我们将从套装中移除瓷砖。尽管我们可能最初并不知道,但是由于我们尚未完全描述该公式,因此可以根据需要在增加时添加所有新的图块可能性。我们必须从此集合中删除的所有图块都必须是可放置的(至少,如果公式是可满足的,则要保证是可放置的)。我们称从瓷砖组中取下一块瓷砖,以从瓷砖组中“排出”瓷砖,以履行我们将其放置在游戏板上的义务。ñññ
- 无论选择哪种状态,我们都必须精心设计小工具以确保将删除特定的图块。
- 我们必须关闭小工具,以免它们根据其状态在整个板上推开瓷砖。而是它们的所有状态都只能占用一个明确定义的区域。
- 另外,必须保证其所有状态都能够占据明确定义的区域。这保证了满意的平铺,但不保证会发生特定的平铺。这与制作Dominosa游戏的方式相同:
- 首先,将图块生成为一个集合。
- 然后将瓷砖以随机配置放下,
- 放置每个图块时,会将其从图块集中删除。
- 然后将瓷砖从板上移开,留下正方形。
- 这并不保证将选择预期的配置,
- 相反,它保证能够选择预期的配置,因此存在解决方案。我们可以在这里做同样的事情。
- 在放置了配方的所有小工具之后,默认情况下不是放置唯一的正方形(即在所有“空白”上),而是确保空白是具有一个均匀尺寸的矩形区域,或者将空白分解为带有一个偶数维,我们只需将空白区域与图块集中的其余图块平铺即可。⋆
- 放置场景中的所有图块之后,我们知道所有内容都是可放置的。
- 由于小工具之间的关系的性质,有些瓷砖显然可以放置,例如墙内的瓷砖,而只有当公式满足要求时,其他瓷砖才可以放置。
- 然后,我们移除瓷砖,并留下它们的正方形。
那让我们来看一下我们的小工具。
强制小工具
我们可以通过确保每个构建块都不能与自己配对来构建任意数量的构建块。
例如,假设我们要强制使用磁贴,以便可以将用作积木。(请注意,是一个任意变量,我们希望将其强制成对使用,而不必像以前使用的值那样强制使用构造块)1 ⋆ 1 ⋆ 1(1 ⋆,1 ⋆)1 ⋆1 ⋆1个
为了确保我们的 -building-block储备,我们将其放置在进行以下配置:我们将保留号码放置,我们将其称为像壁挂式(形状像)那样靠在墙上;靠墙,中间第二排一个。然后,我们将放置另外两个数字,我们将它们称为和;这些是此小工具所独有的。我们将它们放在左右顶部。(1 ⋆,1 ⋆)1 ⋆ ⊥ 3 2 ⋆ 3 ⋆ 1 ⋆1 ⋆(1 ⋆,1 ⋆)1 ⋆⊥32 ⋆3 ⋆1 ⋆
如下图所示,共享的黑色边框是游戏板的底部,从左至右进行了描述。
- 小工具的配置。此小工具在每个和都是唯一的。3 ⋆2 ⋆3 ⋆
- 平铺中心的3种可能状态。1 ⋆
执行完此操作后,我们可以保证可以用一组特定的图块对小工具进行平铺,同时保证我们的小工具必须强制使用对。(1 ⋆,1 ⋆)
- 我们知道必须发生,因为下中间所有3种可能的平铺状态都平铺为,如右图所示。1 ⋆ (1 ⋆,1 ⋆)(1 ⋆,1 ⋆)1 ⋆(1 ⋆,1 ⋆)
- 剩余的图块可以按和进行平铺,覆盖小工具。因此,我们可以从全局图块集中删除这些图块。如下图所示。(1 ⋆,3 ⋆)(1 ⋆,2 ⋆)(1 ⋆,3 ⋆)
描述,从左至右:
- 左,上:左状态,左,下:剩余方块的有效平铺。
- 中间,顶部:中间状态,中间,底部:剩余正方形的有效平铺。
- 右上方:右状态,右下方:剩余正方形的有效拼贴。
请注意,并非强制平铺其余正方形,因为它们可以与附近的邻居平铺而不是,但由于它是所有状态下游戏板的有效平铺,我们可以将其从平铺集中移除,并假设它们将以这种方式平铺。由于我们知道存在有效的可能平铺,因此如果公式可满足,我们至少有一个游戏板可能平铺。尽管不能保证以这种方式将它们平铺,但可以保证拼贴将被强制使用。(1 ⋆,1 ⋆)1 ⋆(1 ⋆,1 ⋆)
注意:如果您对此不满意,或者对“能够平铺”与“被迫平铺”的区别感到困惑,则可以用相同的方式在小工具周围放置一堵墙我们在下面为子句小工具创建墙。3 × 23 × 23 × 2
此小工具未关闭,因为它不需要关闭(但您可以,如果需要)。它不是必需的,因为它具有可行的配置,我们可以从平铺集中删除它。尽管可以进行其他配置,但这不会影响问题的可满足性。
保证将以下图块平铺(因此可以从图块集中删除): (1 ⋆,1 ⋆)
下面瓦片保证是能够被平铺(因此可以从瓦片集合中移除): (1 ⋆,2 ⋆),(1 ⋆,3 ⋆)
如果您选择用墙壁关闭此小工具,则也将是保证被覆盖。(1 ⋆,2 ⋆),(1 ⋆,3 ⋆)
新的Wire和Clause门
由于流动的问题以及排空瓷砖集的问题,我们需要重新设计导线。
解决流动问题的一种方法是使导线成为电路,而不仅仅是简单的左右状态。也就是说,它将是圆形而不是直线,因此,如果将圆的顶部向右推,则将底部推向左。这样解决了流动问题。
按照这条路线,我们可以更改wire和子句门来解决这两个问题。
保留和˚FŤF
让我们介绍两个新的普世价值,和。这两个值是通用的。网格中的实际值,例如平方值和(根据约定,我们保留作为墙的构造块),或您选择的任何值。它们分别代表真与假。˚F 2 3 1ŤF231个
我们强迫储备瓦片,,,如下:下图,说明从左到右:(T,T)(F,F)(T,F)(T,Ť)(F,F)
- 我们使用与强制所有磁贴相同的方案,将用作。此小工具在每个和都是唯一的。Ť 1 ⋆ 2 ⋆ 3 ⋆(1 ⋆,1 ⋆)Ť1 ⋆2 ⋆3 ⋆
- 我们使用与强制任何磁贴相同的方案,将用作每个和在此小工具中是唯一的。˚F 1 ⋆ 2 ⋆ 3 ⋆(1 ⋆,1 ⋆)F1 ⋆2 ⋆3 ⋆
- 我们用同样的方式,强迫一瓦,使用为在中心,在的其他位置使用。这会强制平铺。和可以使用进行平铺,因此我们将其从平铺集中删除。此小工具在每个和都是唯一的。˚F 1 ⋆ Ť(˚F,Ť)2 ⋆ 3 ⋆ Ť 2 ⋆ 3 ⋆(1 ⋆,1 ⋆)F1 ⋆Ť(F,Ť)2 ⋆3 ⋆Ť2 ⋆3 ⋆
线
每条导线将以一个值开头和结尾,我们将其称为,这是导线唯一的。对于导线参与的每个子句,导线将具有两个导线值和,它们对于每个导线都是唯一的,并参与同一子句。下图,说明从左到右。X ⋆ X ' ⋆一个⋆X ⋆X′⋆
- 参与一个子句的导线。导线的高度为,长度为,其中是导线参与的子句数。导线在左侧用两个正方形填充,并且右边两个。当然,它的四周都被一堵墙包围着,用蓝色轮廓表示。请注意,对于此连接线是唯一的,并且仅在该连接线及其参与的子句中使用。2 * p + 3 p 甲⋆ 1 ⋆22 * p + 3p一个⋆1⋆
下面说明的是两种状态,从左到右进行描述。
- 在真实状态下参与一个子句的导线。当正方形与正方形配对,而正方形与正方形配对时,导线被认为是正确的。在另一种状态下,如果平铺反转,则认为它是错误的。请注意,一旦选择了磁贴,将如何强制平铺:之前已经被强制执行,因此其余磁贴必须为水平。Ť X ' ⋆ ˚F 甲⋆(Ť,˚F)x⋆Tx′⋆FA⋆(T,F)
- 同一根导线处于假状态。
当参与更多的子句时,会有更多的值 和,即导线参与的每个子句一对。它们交替位于顶部和底部,就像将每个对分开的和平方。X ' ⋆ Ť ˚F X ⋆,X ' ⋆x⋆x′⋆TFx⋆,x′⋆
两个对应的状态。
该小工具已关闭,因此没有“流量问题”。
请注意,无论在哪种状态下,无论状态如何,我们都将收集以下图块: ,, 。(甲⋆,Ť)(甲⋆,˚F)(A⋆,A⋆)(A⋆,T)(A⋆,F)
但是,有些不确定的地方,我们不确定。在一种状态下,我们可以删除,而在另一种状态下,我们可以删除从瓦集,所以该瓷砖可以我们实际删除?答案是:子句门具有相同的问题,但是具有相反的一组图块。它将始终收集剩余的,相对的和未收集的图块,这将在下一部分中看到。由于这些都与子句门配对,因此我们可以将它们都删除。(1 ⋆,˚F),(1 ' ⋆,Ť),(2 ⋆,˚F),(2 ' ⋆,Ť)(1⋆,T),(1′⋆,F),(2⋆,T),(2′⋆,F)...(1⋆,F),(1′⋆,T),(2⋆,F),(2′⋆,T)...
条款
接下来,我们将创建新子句门的第一次迭代。它由 ×小工具组成,被墙壁包围。在小工具内部,我们在顶部中心放置一个,在下角放置两个正方形;一个在左下角,另一个在右下角。其余的正方形将是代表三个不同导线的导线变量的值。让我们将它们称为和。所述将被迫对与导线-变量之一,并且剩余的线变量将与配对值。下图为从左到右的说明。˚F Ť 一个⋆,b ⋆,Ç ⋆ ˚F Ť2×3FTa⋆,b⋆,c⋆FT
- 左:新子句门的第一次迭代的配置。
- 右平铺的三种可能状态。F
这三种状态导致三种可能的平铺。下图,从左到右的描述。
- 左,上:向左平铺,左,下:平铺其余正方形。F
- 中间,顶部:向右平铺,中间,底部:拼接其余正方形。F
- 右上方:向下平铺,右下方:平铺其余正方形。F
由于将与子句中的一个线变量配对,因此该wire-variable将不再与该线中配对;从而迫使电线正确。相反,用进行平铺的其余线变量将被迫在其导线中以进行平铺。这与子句的约束完全相同。F T F 1 -in- 3 - S A TFF TF1-in-3-SAT
请注意,和是线变量,但它们各自可以引用或有线变量;使用本质上是否定电线变量。Ç ⋆ X ⋆ X ' ⋆ X ' ⋆a⋆,b⋆,c⋆x⋆x′⋆x′⋆
另外一项:为了履行了解可以从图块集中删除哪些图块的义务,我们必须对该条款“加倍和相反”。我的意思是,再制作 x 小工具,另外个变量表示和。让我们称它们为和。这些必须是和的取反变量线值。这个小工具是不同的,因为它将在中间有一个,另外两个3 一个⋆,b ⋆,Ç ⋆ 一个' ⋆,b ' ⋆,ç ' ⋆ 一个⋆,b ⋆,Ç ⋆ 3 × 2 Ť ˚F(Ť,X ⋆),(Ť,X ' ⋆),(˚F,X ⋆),(˚F,3×23a⋆,b⋆,c⋆a′⋆,b′⋆,c′⋆a⋆,b⋆,c⋆3×2TF拐角处的值;与到目前为止描述的小工具完全相反。通过将这样的子句“加倍”,我们重新添加了与上述小工具相同的约束。但是,我们还会释放 (对于每个变量(以及和,因为它们毕竟是线变量)。如下图所示,描述从左到右。一个⋆, b ⋆, Ç ⋆(T,x⋆),(T,x′⋆),(F,x⋆),(F,x′⋆)a⋆,b⋆,c⋆
- “双重和相反”子句。底部是上述子句;顶部是新描述的对立条款。新子句具有完全相同的逻辑约束。它是bottom子句的对立面。这些组合的小工具和导线一起将(对于参与该子句的每个电线变量而言)。(T,x⋆),(F,x⋆),(T,x′⋆),(F,x′⋆)
- 最左图中间的蓝线是为了便于查看;实际上,可以在不允许任何其他状态的情况下将其删除。
因此,让我们以一个示例为例,以证明所有瓷砖都按承诺排放了。如下图所示,描述从左到右。
- 参与单个条款的电线图;为子句选择状态。在这里,我们使用,而和在此子句中代表其他线值。一个⋆ b ⋆1⋆=b⋆a⋆b⋆
- 对于子句中的给定状态,值被强制与相邻的配对。Ť1⋆T
- 这将导致导线被强制为真值(可以看出,导线的正变量被强制与配对,而负变量被强制与配对,如上所述) )。˚FTF
- 这迫使相反的子句(子句的上部)中的与子句中的配对。现在,如果您查看电线,则可以保证电线中的每个瓷砖都被放电:既可以在电线本身中放电,也可以在相应的子句小工具中放电。在这种状态下,我们有,,,,,和。1′⋆T(A⋆,A⋆)(A⋆,T)(A⋆,F)(1⋆,T)(1⋆,F)(1′⋆,F)(1′⋆,T)
尝试其他状态时,我们得到以下插图,描述从左到右。
- 子句处于另一种状态,以两种方式之一平铺。(1⋆,T
- 因此,被压在电线上,(1⋆,F
- 引导其余的导线相应地平铺,并将导线的值设置为false。
- 最后,在子句-小工具的对换句/上部段,必须瓦片,因为取在线。在这种状态下,我们有,,,,,和。这些是与其他状态下排出的砖块相同的砖块。(1′⋆,F)(1′⋆,T)(A⋆,A⋆)(A⋆,T)(A⋆,F)(1⋆,T)(1⋆,F)(1′⋆,F)(1′⋆,T)
因此,在任何一种状态下,我们都会排出相同的瓷砖。因此,如果有令人满意的分配,则导线和子句一起可以成功地排出特定的瓷砖。
该小工具已关闭,因此不会出现流量问题。
保证子句小工具和Wire小工具始终释放相同的图块对值,因此即使我们不知道它将以哪种方式进行图块化,我们也可以将其释放。
现在,我们所有的小工具都符合标准。
公式
在最终的公式中,我们创建三行小工具,每行均由水平墙隔开。
- 在底部,我们放置了两块砖高的强制小工具。我们需要一个强制小工具作为构建块,以及和。我们将强制小工具彼此紧邻放置。TF
- 在中间一排,我们将电线小工具水平放置,这是两块瓷砖高。电线配件应相互垂直隔开。
- 在第一行中,放置子句小工具,这些小工具高4格。子句小工具应通过垂直墙彼此隔开。
随后是插图,每个图上方都有说明。单击图像可获得全分辨率。页面底部列出了用于重现/生成图像的源代码。
以公式为例,我们有一个令人满意的结果解决方案作为见证人。Φ(x)=(x1,¬x2,x3)∧(x2,¬x3,x4)∧(x1,x2,¬x4)(¬x1,x2,x3,¬x4)
首先,我们从水平墙分开小工具的行开始。我们显示了正方形,以及被迫在墙内平铺的对。
接下来,我们展示这些小工具。蓝色轮廓代表小工具的边框;强制小工具为蓝色虚线,因为它们不会被墙壁包围。请注意,小工具子句中间的线没有被墙包围;它是为了便于查看;如上所述,删除该行不允许该子句中出现更多状态,但是我们在此演示中显示了蓝线。注意:在适用的情况下,我们使用平方名称来赋予数字语义可读性。每个名称代表一个数值。
在这里,我们填充垂直墙。
在这里,我们填写见证人解决方案;即,如果使用SAT解决方案来生成它,则为切片解决方案。
接下来,我们对填充区域进行平铺;到目前为止,电路板的其余部分(根据需要)与一样大。因此,我们将图块集中的其余对放电。此处的虚线表示有效但非强制的平铺;可能有另一种方式来平铺这些内容。在这里,我们显示左下角。n
在这里,我们使用有效的平铺图填充剩余的正方形。
在这里,我们显示了网格的右下角。
在这里,我们显示了网格的右上角。请注意垂直砖不再适合;因此,如有必要,我们会水平平铺第一行。
最后是左上角。
通过TeX一次生成整个游戏板会失败,并会出现pdflatex的内存不足错误,因此,如果要查看它,则必须生成剪辑并将它们修补在一起。确保检出笔记本查看器。
TikZ来源
游戏生成器: