如何用不连续的半径恒定的圆覆盖平面中的一组圆?

时间:2019-05-09 08:00:11

标签: algorithm optimization geometry language-agnostic computational-geometry

因此,您有一个给定尺寸的图纸/区域,并且在该区域内有孔(给出了它们的中心点(x,y)和半径)。问题是您需要用补丁覆盖这些孔。这些圆形贴片具有固定的半径(即,半径为5),并且不允许彼此重叠(但可以接触)。您可以随意使用任意数量,目的不是找到最理想的数字,而是查看是否有可能覆盖每个孔。

我已经用KD树解决了一个类似的问题,但是由于该问题中孔的3D尺寸特性,我不确定如何处理它。只是寻找正确方向的指针,而不是编码解决方案:)

2 个答案:

答案 0 :(得分:1)

取决于贴片和孔的大小,可能没有解决方法。

具有最紧凑的补丁阵列的解决方案:

enter image description here


没有解决方案,因为孔比斑块大,这允许裸露的区域:

enter image description here


无法解决,因为孔太小了:

enter image description here


对于一般构造,您应先从孔的中心开始放置补丁。然后根据需要平移并旋转(围绕连续补丁的中心):

enter image description here

答案 1 :(得分:0)

您可能正在寻找对此的分析或至少确定性的解决方案。但是,恐怕要拥有一个太复杂了。另一方面,MetaheuristicsEA一样,由于它们的随机性,可以解决这类问题。当您决定采用这种方法时,必须将问题更改为optimization problem

我尝试使用基本形式DE algorithm解决此问题。为了定义优化问题,我假设解向量是2*N浮点变量的数组,其中N是孔的数量。该数组表示补丁的XY坐标,因为最多需要N个补丁才能覆盖N个孔。

成本函数(需要最小化)定义如下:

Find closest patch to each hole
Find A1 as sum of uncovered areas of holes by their closest patchs
Find A2 as sum of intersection areas of active(!) patches
return max(A1, A2)

在此功能中,活动色块是最接近至少一个孔的色块。这个定义被添加到问题中,以涵盖您在评论Ripi2的答案时提到的情况(当一个补丁覆盖两个孔时,因此还有另一个没有用的补丁)。为了更具描述性,我们假设存在一个P1补丁,它与任何漏洞都不是最接近的补丁。 H1是最接近此贴片的孔,但其最接近的贴片是P2。因此,我们可以肯定地说H1P1的交集面积小于或等于H1P2的交集面积。由于其最近的孔是正确的,因此其他所有孔都相同,因此我们认为它不存在!

这是一个示例:

enter image description here

请记住,这些算法永远不能保证找到全局最优解,但是,它们会给出手头的(一组)次优解。