Algorithm 在二维平面上求(近)最小覆盖集

Algorithm 在二维平面上求(近)最小覆盖集,algorithm,geospatial,computational-geometry,Algorithm,Geospatial,Computational Geometry,好吧,假设我在飞机上的已知固定位置有一堆光盘。每个圆盘的半径为1个单位。这个平面完全被这组圆盘覆盖,事实上,它被这组圆盘覆盖的范围很广,在某些区域超过了一到两个数量级。我想找到一部分仍然完全覆盖飞机的光盘。优化是好的,但不是必需的 下面是前面的插图: 下面是后面的插图: 在我看来,Delaunay三角剖分存在双重问题,但我不太确定这对我有什么帮助。我也知道,这与计算几何中的圆盘覆盖问题相似,但不同。这是一个我不知道名字的标准问题吗 在我看来,可能的方法似乎包括使用局部贪婪搜索增长覆盖集,以及

好吧,假设我在飞机上的已知固定位置有一堆光盘。每个圆盘的半径为1个单位。这个平面完全被这组圆盘覆盖,事实上,它被这组圆盘覆盖的范围很广,在某些区域超过了一到两个数量级。我想找到一部分仍然完全覆盖飞机的光盘。优化是好的,但不是必需的

下面是前面的插图:

下面是后面的插图:

在我看来,Delaunay三角剖分存在双重问题,但我不太确定这对我有什么帮助。我也知道,这与计算几何中的圆盘覆盖问题相似,但不同。这是一个我不知道名字的标准问题吗

在我看来,可能的方法似乎包括使用局部贪婪搜索增长覆盖集,以及迭代使用最近对查询一次删除一张光盘。我不确定这两种方法是否都能很好地发挥作用,而且我还没有仔细研究过细节

哦,如果你没猜到的话,这个应用程序就是在进行查询时找到一个邮政编码质心的子样本来覆盖地图,所以n大约是50000。

Game Plan 以下基本上只是对您的问题的更精确的重申,但可能会有所帮助:

  • 枚举绘制所有磁盘边界时产生的平面中的每个连接区域。根据假设,每个区域都由一个或多个磁盘覆盖
  • 每个区域都是一个“要覆盖的东西”,每个磁盘都是一个“覆盖的东西”。在这组区域上查找。不幸的是,这是NP难的
  • 这可能不是利用问题中所有可用的结构,但它肯定会给您一个最佳答案

    枚举区域 在步骤1中,枚举区域并记录每个区域覆盖的磁盘是一个棘手的部分。区域通常不是凸的,这使得相交测试变得棘手,并且添加的每个圆都可能使区域数量加倍。以下是我的做法:

    忘记每个区域的实际位置,只根据区域内部和外部的磁盘定义区域。也就是说,区域由0/1值的长度n向量定义,每个值指示该磁盘内部或外部的区域是否要包括在交叉点中——所讨论的区域是通过与所有这些n个区域交叉形成的。所以原则上最多可以有2^n个区域,但实际上一些(大多数)向量会产生空区域,因为它们需要相交两个没有相交的磁盘——谢天谢地,这很容易测试。递归生成所有非空区域应该很简单,除了

    坏消息 不幸的是,我现在看到有必要执行完整的交叉口测试,因为它并不总是能够告诉何时区域将是空的。关键的反例是,给定两个盘片A和B有一小部分重叠,另一个盘片C与A和B各有重叠,这取决于所有3个盘片的位置,所有3个盘片的交点可能是非空的,也可能不是非空的。(要看到这一点,请在绘图程序中以50%的不透明度绘制3个不同颜色的磁盘,并将其四处移动。)

    可行的方法 由于交叉测试,生成非空区域的精确列表似乎需要大量的工作和很长的时间,并且您声称不需要最佳解决方案,因此您可以尝试使用采样点网格作为“要覆盖的内容”的集合,而不是非空区域的精确列表。很容易确定哪些磁盘覆盖给定的采样点。然后像以前一样求解最大集合覆盖率


    要获得没有间隙的信心,请多次重新运行,每次随机抖动采样点的坐标。增加采样点的密度,直到最终结果没有变化。

    这可能更适合?鉴于问题的性质,您可能会在这方面找到更多帮助。也许。这里还有很多其他的计算几何问题。但如果我没有得到答案,我会交叉张贴。谢谢哇,回答得很好。我会花一些时间来思考/研究这个问题,如果最终效果良好,我会把解决方案归功于你。我最终做了类似的事情。我使用40000多个磁盘中心作为要覆盖的点,生成覆盖集(slow…O(n^2)),然后使用最小覆盖集的贪婪近似来选择覆盖大量点的磁盘,直到没有更多的磁盘具有未覆盖的点(更快,O(n*m),m随迭代次数减少)。从40000个磁盘增加到200多个!视觉效果不太理想,但绝对足够接近@哈兰:啊,很好。现在还没有定论,但是你可以通过按最长坐标(比如y)排序磁盘中心和点(在本例中,它们是相同的)来减少O(n^2)搜索覆盖磁盘:然后当你在(Xi,Yi)寻找覆盖点i的圆时,你只需要检查那些中心坐标大于等于Yi-r的圆。这意味着,当您从一个点检查到下一个点时,需要开始检查的圆列表中的“起点”只会增加。