这个问题出现在一个挑战中,但由于它现在已经关闭,所以应该可以询问它。
问题(不是这个问题本身,这只是背景信息)可以这样直观地描述,借用自己的形象:
我选择以最佳方式解决它。这可能(对于决策变体)是一个 NP 完全问题(它肯定在 NP 中,而且它闻起来像一个精确覆盖,尽管我还没有证明可以将一般精确覆盖问题简化为它),但这很好,它只需要在实践中快速,不一定在最坏的情况下。在这个问题的上下文中,我对任何近似算法都不感兴趣,除非它们提供削减。
有一个明显的 ILP 模型:生成所有可能的方格(如果方格仅覆盖存在的网格单元格,则方格是可能的),x_i
为每个方格引入一个二进制变量,指示我们是否使用它,然后
minimize sum x_i
subject to:
1) x_i is an integer
2) 0 ≤ x_i ≤ 1
3) for every cell c
(sum[j | c ϵ square_j] x_j) = 1
约束 3 表示每个单元只被覆盖一次。约束 1 和 2 使 x_i 二进制。最小解给出了原始问题的最优解。
这个(即忽略约束 1)的线性松弛是半体面的,但它会做这样的事情(这是一个 6x6 网格,左上角缺失):
这里选择了 13 个正方形的“一半”(客观值为 6.5),大小(这样你可以更容易地找到它们)
- 1 的 4x4
- 3 的 3 x 3
- 6 个 2x2
- 3 个 1x1
此实例的最佳解决方案的目标值为 8,例如:
线性放松是半体面的,但我并不完全满意。差距有时超过 10%,这有时会导致整数阶段非常缓慢。
这就是实际问题出现的地方,是否有额外的约束可以添加(懒惰地)作为削减,以改进分数解决方案?
我已经尝试了问题的替代公式来找到切割,例如,而不是选择正方形,如果我们选择“左上角”和“右下角”,然后将它们匹配以形成不重叠的正方形覆盖所有细胞?然后在每个“类似反斜杠的对角线”上,必须有匹配数量的左上角和右下角。但这无济于事,因为如果我们选择正方形,那么无论如何该条件总是正确的,在分数解决方案中也是如此。
我还尝试了一些关于重叠的推理,例如,如果两个正方形明显重叠,它们的总和不能大于 1,并且可以通过添加完全包含在重叠区域中的所有正方形来改进。但该约束不如所有单元格仅被覆盖一次的约束强大。
我尝试过对总面积进行推理(例如,总覆盖面积必须等于单元格的数量),但这已经通过每个单元格必须被覆盖一次的约束来保证,并根据总面积来说明只允许更多的自由。
我也尝试过用平方数(每个平方的面积是,嗯,一个平方)和平方数的差异做一些事情,但这也没有任何有用的结果。