为给定空间

时间:2016-01-24 17:28:18

标签: algorithm 2d packing tiling

我们必须创建一个算法来完美地填充HxW的给定空间。我们有125个测试配置,其中给定的图块集可以填满该字段。给出了tile集和字段的代码,我们必须编写一个可以放置tile并填充字段的代码(如果需要,可以交换它们)。有人有关于如何创建这样一个算法的建议,因为我们被困住了,没有任何灵感。

我们创建了一个贪婪的算法,首先填充最大的区块,然后尝试适应小区块,但这只解决了1个区块集,并且被更大的区块集粘住了。

下面是两个给定的配置:

宽度:12高度:17比例:20 2次5x5 1次7x3 3次5x4 1次5x3 1次6x2 1次3x3 2次4x2 1次6x1 1次3x2 1次2x2 1次3x1 1次2x1

宽度:42高度:39比例:10 1次15x14 1次14x14 1次14x8 1次11x9 1次12x6 1次14x5 1次11x6 1次16x4 1次12x5 1次10x5 2次8x6 2次8x5 1次9x4 1次6x6 1次7x5 2次6x5 1次7x4 1次6x4 1次10x2 1次5x4 3次6x3 2次7x2 1次12x1 2次6x2 1次11x1 1次10x1 1次5x2 1次8x1 1次6x1 2次3x2 1次5x1 2次2x2 3次3x1 3次2x1 1次1x1

1 个答案:

答案 0 :(得分:1)

当然,这是一个NP难题(NP-complete,如果你只是想知道它是否可能,但看起来你已经答应了这个,无论如何你想要一些配置)这并不是一件坏事 - 虽然这意味着它可能不会过于高效,但它也暗示了很多攻击角度,因此不必从头开始接触。

例如整数线性规划,其模型如(这是一个非常基本的)

minimize: 0
subject to:
for all (x,y), sum[all i such that tp[i] covers (x,y)] x[i] = 1
for all tiles k, sum[all i such that tp[i] is tile k] x[i] = 1

其中tp包含所有可能的"磁贴展示位置",每次都可以包含每个位置的副本。

第一批约束强制网格中的所有位置都被一个图块覆盖,第二个约束条件强制所有图块仅使用一次。

使用这个我可以解决你的42x39实例:

solution

对于较大的实例,可能需要更多技巧。提到here的一些削减适用,但是当我用Gurobi解决这个问题时,花费大部分时间来寻找可行的解决方案,而不是整数阶段。