近似最小集合封面Python

时间:2014-09-22 20:24:25

标签: python set cover

我有一个列表列表,每个列表包含多边形的边长。例如:

[[0, 1, 2],
 [0, 1.1, 2],
 [0, 1.2, 2],
 [0, 1.3, 2],
 [4.5, 1.1],
 [4.4, 1.1],
 [5, 1, 2],
 [5, 1.1, 2],
 [5, 1.2, 2]
 [6, 1, 7, 4],
 [6, 1.1, 7, 4.1]]

我希望能够找到最近的"封面"从某种意义上说,对于"封面"它所有的值都在它所覆盖的元素的指定容差范围内。例如,如果上面的列表给出了公差为.1,我想得到:

[[0, 1, 2],
 [0, 1.2, 2],
 [4, 1],
 [4.5, 1.1],
 [5, 1.1, 2],
 [6, 1, 7, 4],]

我对python有些新意,所以希望我对术语的使用并不太远。也许解释我的动机会很有帮助。我是一名建筑师,试图优化给定的表面镶板。由于制造公差,具有边缘长度相差一定量的面板可以被认为是相同的(在上面的示例中,所有边缘可以相差0.1,并且仍被认为是相同的)。我试图找到一组可以生产的最小面板,并且仍然可以将表面镶嵌在其中。

1 个答案:

答案 0 :(得分:0)

要找到一个最佳解决方案,这在计算上会非常困难 - 你似乎在寻求某些东西,但它并不是必须完美的。

对于其余部分,我将讨论针对1D案例的建议算法,理由是它更容易描述,但您可以将算法扩展到3d。我宣布了一个"范围"是[min,max]。

对于每个点,请执行以下操作:
- 检查范围列表以查看该点是否落入其中一个中 ----如果确实如此,请立即设定该范围[max(min,point-interval),min(max,point + interval)]。
----如果没有,添加新范围[point-interval,point + interval]
完成后,输出点列表将成为每个范围的中心。

这里的想法是将每个点表示为它所适合的可接受范围。一旦有了这个,任何重叠范围都可以减少到它们的交点,因为该交点中的任何地方都可以被两个初始点接受。可以继续此过程,直到剩余的范围不重叠。