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