是否有任何算法可以帮助最佳地找到最小数量的矩形,以包含遍布笛卡尔表面的一定数量的项目(每个项目是带有x和y坐标的点)?矩形必须与Ox轴正交并且在Ox轴上具有底部区段,并且每个矩形的区域必须<0。比给定值M。
答案 0 :(得分:1)
不是一个完整的解决方案,而是简化问题: 假设所有点P都处于一般位置并按x坐标排序。
然后通过找到F垂直栅栏(形式为x >= fx
)来形成解
将P划分为不相交的集合。
然后每个组都可以被轴对齐的矩形覆盖,其中集合中的第一个和最后一个点确定矩形的宽度,并且具有最高y坐标的集合中的点确定高度,由此确定矩形的表面大小。
显然,现在的诀窍是选择围栏,使围栏的数量(以及矩形的数量)最小化,同时将所有矩形的总表面尺寸保持在允许的最大值之下。
修改强>
可能使用动态编程解决放置F围栏的问题。 击>
这是我到目前为止所提出的:
如果是这样,最多有| P | -1个围栏位置;这些可能会成为动态编程表中的列。动态编程表中的每一行都应该表示使用额外的栅栏(记住,我们试图找到栅栏数最少的结果)。然后,每个单元格(X,Y)将代表在前X个可用位置上精确分配Y栅栏的最佳解决方案(就总矩形大小而言)。但是,我在查看表格的相邻单元格如何(或是否)可以帮助确定特定单元格的值时遇到了一些问题。
编辑2 :忘掉这一点,我认为动态编程方法是不可能的。这是因为我认为不可能逐步构建最优解决方案(最佳解决方案配置可能会通过添加另一个点或围栏来完全改变)。这也排除了一种贪婪的方法。
我能想到的唯一想法,虽然从算法的角度来看稍微不那么明显,但却是一种随机方法,例如Simulated annealing用于分配围栏。它不保证 最佳解决方案,但您应该能够非常接近它。
编辑3 :为了回应这篇文章的反应,我们不一定需要最佳解决方案,而是寻求一个“非常好”的解决方案相反,并应用你现在正在学习的东西。
无论如何,您可能需要从左到右对所有点进行排序。
贪婪的解决方案可能是定义第一个矩形,使其包含最左边的点。接下来,展开矩形,使其包含右侧的点。继续添加下一个点,直到矩形超过其最大大小。在这种情况下,从一个新的矩形开始,然后再次开始添加点等。
获得解决方案的分而治之的方法可以从覆盖所有点的矩形开始。显然,这个矩形超过了最大尺寸M,因此根据一些启发式(正好在中间,或者在两个后续点相距最远的点),将它垂直分割成2个较小的矩形M1和Mr。以相同的方式递归处理Ml和Mr,或者再次拆分矩形,或者如果它是&lt; = M,则将找到的矩形作为结果的一部分报告。
请注意,对于这两种方法,对于某些人为的配置,结果可能是任意不好的,但通常解决方案应该是'ok'。