Algorithm 一组线段的最小面积几何覆盖

Algorithm 一组线段的最小面积几何覆盖,algorithm,computational-geometry,Algorithm,Computational Geometry,我试图解决的问题是: 给定圆可以居中的平面上的一组M点和一组需要圆覆盖的N条线段,求线段的最小面积圆覆盖。也就是说,找到圆的半径和中心(从M个点中选择),以覆盖所有N条线段,并最小化圆的总面积 请注意,如果线段的任何部分都不在圆之外,则线段将被覆盖 任何指向论文、代码或近似算法的指针都会很好 编辑:刚刚意识到原始方法(移到末尾)可能无法很好地涵盖多个圆最好覆盖线段的情况。因此,我认为最好迭代点,而不是直线段,在圆边界处切割直线段: 找到“最差”点,即需要最大附加圆面积的点,以获得最佳圆心选项,相

我试图解决的问题是:

给定圆可以居中的平面上的一组M点和一组需要圆覆盖的N条线段,求线段的最小面积圆覆盖。也就是说,找到圆的半径和中心(从M个点中选择),以覆盖所有N条线段,并最小化圆的总面积

请注意,如果线段的任何部分都不在圆之外,则线段将被覆盖


任何指向论文、代码或近似算法的指针都会很好

编辑:刚刚意识到原始方法(移到末尾)可能无法很好地涵盖多个圆最好覆盖线段的情况。因此,我认为最好迭代点,而不是直线段,在圆边界处切割直线段:

  • 找到“最差”点,即需要最大附加圆面积的点,以获得最佳圆心选项,相应线段至少部分位于圆中。构造/延伸相应的圆
  • 从集合中删除完全覆盖的线段,并在圆边界处剪切部分覆盖的线段
  • 迭代,直到不再保留线段
  • 主要思想是在任何情况下都要坚持做必要的事情。重叠圆是如何计算的?这些区域是相加的还是合并的?当在以后的迭代中返回到第一步时,某种成本启发法可能能够改进结果

    最初的建议是:

  • 找到“最差”线段,即任何圆心选项需要最大圆的线段,并构造相应的圆
  • 从集合中删除覆盖的线段
  • 迭代,直到不再保留线段

  • 我刚刚发布了一些代码来实现这里建议的算法:


    我认为您的问题是NP难问题,因此您必须采用近似算法。作为建议的启发式方法,从可能的中心集中找到最接近所有线段端点质心的点,并将其用作中心。圆的半径是从该中心到最远线段端点的距离。这应该涵盖大多数情况,但我无法证明它总能给出最佳答案。特别是,如果有一条线段与所有其他线段都相距很远,它可能会明显扭曲。我不理解你的解决方案。已经给出了圆的可能中心。我想把圆放在这些中心,选择它们的半径,这样这些线段就被覆盖了。啊。。。我想我误解了这个问题——在第一次阅读时,它听起来像是你想要一个单一的圆,它的中心被限制在一组有限的位置中的一个。。。拥有多个圆圈确实会让这变得更加困难——不过,听起来很适合动态编程方法。谢谢。我试试看。我提出了一种贪婪的方法,一次用最小面积覆盖每个线段,即开始用最小的圆覆盖,然后沿着半径向上延伸,直到线段被完全覆盖。然后取结果的并集。但可能不适用于重叠的圆。回答您的问题:重叠的圆是成本加起来的。仔细考虑后,某种形式的a*可能是您需要的最佳解决方案(尽早覆盖)--现在似乎比较容易构建一个示例,在这个示例中,所提出的启发式方法不会起到那么好的作用。对于这一点,计算剩余成本的下限可能是有用的……谢谢,但我对a*不熟悉。你能给我指一些参考资料吗?我喜欢你的方法。你能描述一下它会失败的情况吗?我想把可能的半径离散化,然后尝试所有的组合来得到一个最优值,但是运行时间太长了。我认为这肯定不是最优的情况是,你把线段聚集在一起——只有一个端点更接近“外部”点。无论如何,我都会实现它,因为主要的工作是在任何情况下都需要的帮助程序中(从段集合中切出一个圆)。答*:维基百科的描述似乎可读,但由于星星的缘故,链接不起作用。在那里搜索“A*_搜索算法”。