use*_*997 18 algorithm computational-geometry
覆盖所有n点所需的半径为r的最小圆数是多少?r和n将作为输入给出,接着是n对整数,表示n个点的xy坐标.r是实数且大于0.n <20.
如果该点位于圆内,则圆圈覆盖一个点.如果点与圆心之间的距离小于或等于r,则点位于圆内.
dfe*_*ens 11
这可能不是最佳解决方案,但尝试对其进行优化.
算法基于随机抽样:
以下是您可以预览的代码:http://jsfiddle.net/rpr8qq4t/示例结果(每30分13个圆圈):

参数化:
var POINTS_NUMBER = 30;
var RADIUS = 50;
var SAMPLE_COUNT = 400;
Run Code Online (Sandbox Code Playgroud)
可能会添加一些优化(例如,某些圈子可能会过早地从列表中排除)
编辑:
编辑2(最终算法)
最后:
这是给我带来最佳效果的版本,你可以在这里查看 http://jsfiddle.net/nwvao72r/4/ 这里 每30分平均12圈.

我确定这个问题是NP难的,尽管我不打算在这里证明这一点.
如果它是NP难的,那么为了找到保证最优的解决方案,我建议采用以下方法:
给定2个小于2r的点,正好有两个半径为r的圆圈通过这些点:

[编辑:我对"最好的"圈子的原始描述是错误的,虽然这不会导致问题 - 感谢评论家乔治描述正确的思考方式.]
如果圆圈覆盖了一组最大点(意味着圆圈无法重新定位以覆盖同一组点加上至少1个点),则该圆圈可以滑动,直到其边界恰好触及它所覆盖的两个点 - - 比如说,向左滑动直到它接触到已经覆盖的点,然后围绕这个触摸点顺时针旋转它,直到它接触另一个已经覆盖的点.这个移动的圆圈将完全覆盖原始圆圈所覆盖的一组点.此外,我们永远不需要考虑覆盖非最大点集的圆,因为覆盖这些点和更多点的最大圆至少同样有用并且不再花费更多.这意味着我们只需要考虑触及两点的圆圈.如果我们为输入中每个足够接近的点生成两个圆,我们将生成我们可能需要的所有圆.
因此,我们的潜在圆圈池每对点最多包含2个圆圈,总共最多有n*(n-1)个潜在圆圈.(通常会有更少的,因为一些双点通常会进一步比2R开,并且因此不能由半径为r的单个圆圈覆盖.)此外,我们需要为进一步比2R从每个点的额外圆任何另一点 - 这些圈子也可能以这些远程点为中心.
我们真正关心的是每个潜在圈子所涵盖的一组点.因此,对于每个潜在的圈子,找到它所涵盖的点.这可以在整个O(n ^ 3)时间内完成,对每个潜在的圆使用O(n)通过.为了加快速度,如果我们发现两个不同的圆圈覆盖完全相同的一组点,我们只需要保留其中一个圆圈(覆盖点集).此外,我们可以丢弃任何覆盖点集,这是一些其他覆盖点集的子集 - 在这种情况下,最好选择较大的覆盖点集.
最后,我们有一组覆盖点集,我们希望找到涵盖每个点的这些集的最小子集.这是设置封面问题.我不知道一个特定的算法来解决这个问题,但分支限界是此类问题的标准方法-这是经常比一个简单的详尽回溯搜索快得多.我首先通过首先找到一个(或多个)启发式解决方案来进行搜索,希望产生一个良好的上限,这将减少分支和边界搜索时间.我认为,即使是在这个最好的算法需要指数时间在最坏的情况下,虽然我认为这将是可控的对于n <20为有最多19*18 = 342套不同点.
平铺然后摇晃
步骤 2,如果平铺非常稀疏,可以通过逐步遍历每个点并仅计算/保留那些包含点的圆来优化平铺。
小智 5
摘自 Gautam K. Das 等人的论文“On the Discrete Unit Disk Cover Problem”。阿尔:
最小几何磁盘盖。在最小几何圆盘覆盖问题中,输入由平面中的一组点组成,问题是找到一组具有最小基数的单位圆盘,其并集覆盖了这些点。与 DUDC 不同,磁盘中心不限于从给定的离散集合中选择,而是可以以平面中的任意点为中心。同样,这个问题是 NP-hard [9] 并且有一个 PTAS 解决方案 [11, 12]。
参考:
- R. Fowler、M. Paterson 和 S. Tanimoto,平面中的最优包装和覆盖是 NP 完全的,信息处理快报,第 12 卷,第 133-137 页,1981。
- G. Frederickson,平面图中最短路径的快速算法,以及应用,SIAM J. on Computing,第 16 卷,第 1004-1022 页,1987 年。
- T. Gonzalez,涵盖多维空间中的一组点,信息处理快报,第 40 卷,第 181-188 页,1991 年。
- D. Hochbaum 和 W. Maass,图像处理和 VLSI 中覆盖和打包问题的近似方案,J. ACM,第 32 卷,第 130-136 页,1985 年。
如果您将n圆(半径为r)全部放置在每个点的中心,则查找最大重叠的区域/点并将新圆(半径为r)放置在该区域的中心。我不确定这是否是解决该问题的最佳方法(如果这是解决该问题的方法,除了暴力方法之外),我确信您可以通过相当多的数学来实现它,并且从而降低解决方案的运行时复杂性。希望这可以帮助。请给予反馈。
| 归档时间: |
|
| 查看次数: |
7887 次 |
| 最近记录: |