确定最大开放空间的有效算法

Posted

技术标签:

【中文标题】确定最大开放空间的有效算法【英文标题】:Efficient algorithm to determine largest open space 【发布时间】:2016-03-09 16:42:58 【问题描述】:

我有一种情况,如下图所示,我需要计算出一个区域内最大的圆圈(空地)。在下面的示例中,黑色圆圈是固定的已知位置,我需要找到不接触黑色圆圈的最大区域(由橙色和绿色圆圈表示)。在下面的示例中,橙色圆圈是最大的开放空间,这是我要计算的区域。

我可以暴力破解它,选择一个位置并扩大一个圆,直到它碰到一个黑点,然后只记录圆的位置和半径(开放空间),但这将大大降低迭代所有可能的效率职位。

有没有一种有效的方法来分析在这种情况下最大的开放空间在哪里?请记住,此字段上的最大黑点数为 15,但可能会低很多。

编辑感谢 Yves 和所有其他评论者。基于答案和其他cmets的一些澄清。黑盒是一个边界,因此定义的任何区域都必须在黑盒内。黑色圆圈的半径是已知的并且是静态的,但是出于这些目的,它们可以简化为点。最后,圆的近似是可以接受的。它将用于 AI 例程中,该例程在决定哪个区域最好时存在一定的误差。所以,如果圆在半径或位置上稍微偏出一点,那也不是什么大问题。

我目前正在研究 Voronoi 方法,我想我理解它,但现在尝试提取适合的算法是问题所在!我会测试并回复你。

编辑 2:感谢 Yves,我查看了 Voronoi 图并使用了一种简单的方法循环遍历所有 Voronoi 顶点(以及它穿过边界框的点)并从中找到最大的圆不包含任何“黑圈”的中心点。对于一个相对较小、有限的点集,我对这个实现很满意。结果见下文,在空间中显示前 3 个空圆圈。

【问题讨论】:

黑盒子也是有界的,还是彩色圆圈应该只被黑色圆圈包围? 所有黑圈的半径都一样吗? 我觉得右边的某个地方比橙色圆圈的地方有更多的开放空间 下图精彩哈哈 【参考方案1】:

这被称为“最大空圆”问题。它可以通过Voronoi图有效地解决。

如果黑色圆圈的直径有限,您可以将它们缩小到它们的中心,然后从找到的解中推断出半径。

无论如何,如果允许在矩形上使用圆形,则需要修改算法以解决此问题。一项不平凡的任务。

更新

“TOUSSAINT, Godfried T. Computing large empty circles with location constraint. International journal of computer & Information Sciences, 1983, 12.5: 347-358”和“CHEW, L. Paul; DRYSDALE, Scot . 寻找具有位置限制的最大空圆。1986 年。当中心被约束在给定的凸多边形内时,它描述了一个有效的解决方案。 (但我猜你是在要求完全包含圆圈。)


在数字域中可以使用完全不同的方法(处理离散图像,有限大小的像素):您可以计算到黑色像素的欧几里得距离图。有一种非常聪明的高效算法可以在线性时间内实现(取决于图像大小,而不是障碍物的数量);请参阅“A. Meijster、J. B. T. M. Roerdink 和 W. H. Hesselink,用于计算线性时间距离变换的通用算法”。

计算完距离图后,所需圆的中心是距离值最大的像素。此方法适用于任何形状的障碍物。


更新

在您的情况下,由于障碍物的数量很少,详尽的搜索可能是可以接受的。您需要尝试通过 3 点、通过 2 点并与边相切或通过 1 点并与 2 边相切的圆。

对于所有这些圆圈,检查它们是否包含其他点并保持最大。原则上,这需要时间 O(N^4)。显然,这种复杂性可以降低到 O(N³),但我在这个问题上找到的每个条目都描述了基于 Voronoi 的方法,而不是详尽的方法。

【讨论】:

黑圈不能做边框吗? @cricket_007: 是的,但你需要无限数量的 :( 为什么是无限的?只需将它们排成一行,使直径接触即可。一个像素是一个有限值。 这样做,你得到的边界不是直的,解决方案会稍微超过矩形。如果允许近似解决方案,您可以这样做。 (像素是方形的,不是圆形的。) 在实践中,“沿一条线等距分布的许多点”通常是一条直线的良好近似值。通常一个近似的答案就足够了。事实上,计算机上几乎所有的非整数数值计算都是近似值。但最好弄清楚你愿意接受什么样的近似值。

以上是关于确定最大开放空间的有效算法的主要内容,如果未能解决你的问题,请参考以下文章

KNN 分类器算法不适用于所有情况

[数据结构] 时间复杂度与空间复杂度

重温基础算法内部排序之计数排序法

重温基础算法内部排序之计数排序法

算法设计与分析——回溯法算法模板

查找具有值范围的 k 个最大元素的有效算法