好的,我说有一堆光盘坐在固定已知位置的飞机上。每个圆盘的半径为1个单位。该平面被该组光盘完全覆盖,实际上,该光盘被该组光盘广泛覆盖,在某些区域中大约一个数量级或两个数量级。我想找到一个完全覆盖飞机的光盘子集。最佳是好的,但不是必需的。
以下是之前的插图:
这是后插图:
在我看来,有一个与Delaunay三角测量有关的双重问题,但我不太确定这对我有帮助。我也知道这与计算几何中的盘覆盖问题类似,但不相同。这是一个标准问题,我的名字不知道吗?
在我看来,可能的方法包括使用本地贪婪搜索来增加覆盖集,并迭代地使用最近对查询来逐个删除光盘。我不确定是否保证两者都能正常工作,而且我还没有完成细节。
哦,如果您没有猜到,应用程序是在查询时查找邮政编码质心的子样本以覆盖地图,因此 n 大约为50,000。
答案 0 :(得分:2)
以下基本上只是对问题进行更精确的重述,但它可能有所帮助:
这可能没有利用问题中可用的所有结构,但它肯定会给你一个最佳答案。
在步骤1中枚举区域并记录哪些磁盘覆盖每个区域是棘手的部分。区域通常不是凸面,这使得交叉点测试变得棘手,并且您添加的每个圆圈可能会使区域的数量翻倍。以下是我的方法:
忘记每个区域的实际位置,并仅根据内部磁盘和外部磁盘定义区域。即区域由长度为n的0/1值向量定义,每个向量指示该盘内部或外部的区域是否包含在交叉点中 - 所讨论的区域是通过交叉所有这些n个区域形成的。所以原则上你可以拥有多达2 ^ n个区域,但实际上一些(大多数)矢量产生空区域,因为它们需要交叉两个没有交叉的磁盘 - 这很容易测试,谢天谢地。递归生成所有非空区域应该是直截了当的,除了......
不幸的是,我现在看到 必须执行完整的交叉点测试,因为并不总是可以判断某个区域何时为空。关键的反例是,给定两个磁盘A和B有一小部分重叠,另一个磁盘C重叠A和B中的每一个,取决于所有3个磁盘的位置,所有3个磁盘的交叉点可能会也可能不会是非空的。 (要看到这一点,请在绘图程序中以不同颜色绘制3个不透明度为50%的磁盘,然后移动它们。)
由于生成非空区域的确切列表看起来很多工作并且由于交叉测试需要很长时间,并且您声称不需要最佳解决方案,因此您可以尝试使用网格样本点作为“要覆盖的事物”的集合而不是非空区域的确切列表。可以直接确定哪些磁盘覆盖给定的采样点。然后像以前一样解决最大集合覆盖。
为了确保没有间隙,重新运行几次,每次随机抖动采样点的坐标。增加样本点的密度,直到最终结果没有变化。