我想知道有关以下问题的算法的一些事项: 给定一个0s和1s的矩阵以及一个正方形的大小,覆盖1s的相邻正方形的最大数量是多少,它们的位置是多少?如果有几种可能的方形组合,只需输出一个。
EX:尺寸为2:
输入:
0 0 1 0 0 0
0 1 1 1 1 0
0 0 1 1 1 0
0 1 1 1 1 0
0 1 1 1 1 0
0 1 1 0 0 0
可能的输出: 最多3个方格(每个标有字母)
0 0 1 0 0 0
0 1 a a 1 0
0 0 a a 1 0
0 b b c c 0
0 b b c c 0
0 1 1 0 0 0
我想知道是否存在用于最优解的多项式(或伪多项式)算法。如果是,算法及其渐近复杂度是什么?如果没有,我应该使用什么近似算法?
此外,您可以假设,如果这使问题更容易,则1s区域内没有0的“孤岛”,因此不应遇到以下情况:
1 1 1
1 0 1
1 1 1
我是业余程序员,这是我的第一个问题。如果你的答案也暗示了这个算法的研究领域,那对我来说非常有用。提前谢谢。
答案 0 :(得分:1)
我想知道是否存在用于最优解的多项式(或伪多项式)算法。如果是,算法及其渐近复杂度是什么?
多项式算法不存在。这就是原因。我们将把这个问题减少到一个更广为人知的问题。
我们可以做到以下几点:对于板上的每个单元格(x,y),我们可以说我们是否可以在板上放置一个正方形,使得正方形的左上角位于(x,y)并且方形仅覆盖1s。我们可以在恒定时间内回答这类问题,预计算需要O(n ^ 2)个时间。对于可以做到这一点的所有(x,y),我们可以构造以下图G(E,V)。顶点集合E恰好是满足上述条件的这组(x,y)。我们还说((x0,y0),(x1,y1))是一个边,如果分别从(x0,y0),(x1,y1)开始的正方形仅覆盖1s并且它们具有共同的正方形。但是,既然我猜它们很难实现,并且不会给出那么大的改进,我建议你写一个简单的回溯算法。
现在请注意,您的问题现已减少到finding the maximum independent sets。这个问题是NP-hard
。但请注意,文章中提到的算法比通常的强力O(n^2*2^n)
(检查每个顶点子集并检查它是否是一个独立的集合)更有效。但是因为我认为他们不会给你那么大的改进,我建议你写一个简单的回溯算法。在这种情况下做这件事是最好的。
答案 1 :(得分:0)
我认为你可以通过将3-sat(已知为NP-complete)平面减小到你的问题来证明这是NP完全的。大小为3。
想法是使用看起来像这样的电线:
111 111 111
111 111 111
1111111111111
111 111 111
111 111 111
这可以通过两种方式涵盖:
aaa bbb ccc
aaa bbb ccc
aaa1bbb1ccc11
111 111 111
111 111 111
或
111 111 111
111 111 111
11aaa1bbb1ccc
aaa bbb ccc
aaa bbb ccc
两种方式都使用相同数量的正方形(在这种情况下为3,尽管可以进一步扩展导线)。
现在的想法是在平面3-sat问题中为每个文字使用这些导线之一 (两种覆盖方式对应于文字是选择为真还是假)
还构造一个空盒子:
11X
111
1111
Y111
11Z
每个条款。
当且仅当X为空或Y为空或Z为空时,此框具有单个方格的空间。
使用更多电线将子句框连接到文字电线 (在子句框的X或Y或Z处连接,并根据在子句中是否正面或负面地使用字面来选择导线上的连接点。)
这个想法是每根电线总是用固定数量的方块覆盖, 但是如果至少有一条文字线最终没有覆盖其中一个特殊角(X,Y,Z),那么子句框只会被正方形覆盖。
因此,对于满足的每个子句,可放置的最大平方数将是固定数(对于导线)+ 1。
因此,您可以通过找到同时满足所有子句的文字的赋值来确定是否可以求解平面3-sat。
在实践中,您可以通过使用贪婪覆盖(在4倍之内)来获得简单的近似算法,因为放置正方形可以在最佳解决方案中与最多4个方格碰撞。
我希望标准的SAT求解器能够很好地找到近似/最佳答案。