【问题标题】:Find Voronoi tessellation with area constraints查找具有区域约束的 Voronoi 细分
【发布时间】:2012-04-17 14:10:08
【问题描述】:

假设我们想要对具有 N 个点的矩形曲面进行 Voronoi 分区。 Voronoi 细分导致 N 个区域对应于 N 个点。 对于每个区域,我们计算其面积并将其除以整个表面的总面积 - 称这些数字为 a1,...,aN。它们的和等于一。

假设现在我们有 N 个数字的预设列表,b1,...,bN,它们的总和等于一。

如何找到用于 Voronoi 分区的 N 个点的坐标中的一个选项(任意一个),例如 a1==b1, a2==b2, ..., aN==bN?

编辑:

经过一番思考,也许 Voronoi 分区并不是最好的解决方案,关键是要对表面进行随机不规则分割,以使 N 个区域具有适当的大小。 Voronoi 在我看来是合乎逻辑的选择,但我可能弄错了。

【问题讨论】:

  • 您在寻找精确匹配吗?如果没有,我会使用一些遗传算法。
  • 嗯,“几乎”——精确就足够了。唉,我不熟悉遗传算法,但感谢指点!
  • 你为什么想要一个 voronoi 镶嵌?从答案/ cmets 听起来更像是您想要一个不规则/有吸引力的外观,并在区域上有一些限制。如果是这样的话,你应该这么说......
  • 好吧,我对 Voronoi 分区有点盲目,似乎是最简单的实现。你有什么特别的想法可能更合适吗?

标签: algorithm computational-geometry voronoi


【解决方案1】:

我会选择一些遗传算法。

基本流程如下:

1) 创建 100 组属于您的矩形的随机点。

2) 对于每个集合,计算 voronoï 图和面积

3) 对于每组,评估它与预设权重的比较情况(称之为分数)

4) 按分数对点集进行排序

5) 丢弃 50 个最差的集合

6) 通过混合点从剩余的 50 个集合中创建 50 个新集合并添加一些随机点。

7) 跳转到第 2 步,直到满足条件(得分高于阈值、出现次数、花费时间等...)

你最终会(希望)得到一个“有点合适”的结果。

【讨论】:

  • +1。两个注意事项:(1) 使用人口中的集合数量(我认为在 100 到 1000 之间)可能是一个好主意,(2)simulated annealing 也可以解决这个问题并且可以更容易实现
【解决方案2】:

如果您要查找的不一定是 Voronoi 镶嵌,也可能是幂图,那么以下文章中描述了一个不错的算法:

F。 Aurenhammer、F. Hoffmann 和 B. Aronov,“Minkowski 型定理和最小二乘聚类”, Algorithmica,20:61-76 (1998)。 p>

他们的问题版本如下:给定多边形 P 中的 N 个点 (p_i),以及一组非负实数 (a_i) 求和到 P 的面积,求权重 (w_i),使得Power cell Pow_w(p_i) 与 P 的交点面积正好是 a_i。在论文的第 5 节中,他们证明了这个问题可以写成凸优化问题。要实施这种方法,您需要:

  • 高效计算功率图的软件,例如CGAL
  • 凸优化软件。我发现使用 L-BFGS 等准牛顿求解器在实践中会产生非常好的结果。

我在my webpage 上有一些代码正是这样做的,名称为“二次最优传输”。然而,这段代码不是很干净,也不是很好的文档,所以实现你自己的算法版本可能会一样快。您还可以查看我关于此主题的 SGP2011 论文,该论文可在同一页面上找到,以简要描述 Aurenhammer、Hoffman 和 Aronov 算法的实现。

【讨论】:

  • 我对此进行了一些研究,但我很难阅读这篇论文。然而,这个想法似乎很好,我可能会实施它。谢谢!
【解决方案3】:

假设矩形的坐标轴与 x = 0 处的左边缘和 x = 1 处的右边缘以及 y = 0 处的水平平分线轴对齐。令 B(0) = 0 和 B(i) = b1 + ... + 双。将点放在 ((B(i-1) + B(i))/2, 0) 处。 这是不对的。我们将 x 坐标设为 xi,使得 bi = (x(i+1) - x(i-1)) / 2,将 x(0) 替换为 0,将 x(n+1) 替换为 1。这是三对角线和应该有一个简单的解决方案,但也许你不想要这么无聊的 Voronoi 图;这将是一堆垂直分区。

对于一个看起来更随机的图,可能是受到了物理学启发:随机放置点,计算 Voronoi 图,计算每个单元的面积,使超重的单元对其邻居的点有吸引力,而过轻的单元排斥并计算一个小的每个点的增量,重复直到达到平衡。

【讨论】:

  • 所以,你所有的点都在一条线上,所有的区域都是盒子。聪明的!即使我认为这不是 OP 正在寻找的 :)
  • 呵呵,好主意,当然!但是,是的,我正在考虑生成随机镶嵌。比如,随机放置一些点,然后通过某种算法得出一个有效的分区。我当然不想要这种堕落的情况。 :)
  • 但这就是你要的!
【解决方案4】:

当您计算最小生成树并移除最长边时,可以计算 voronoi 细分。然后,mst 子树的每个中心都是 voronoi 图的一个点。因此,voronoi 图是最小生成树的一个子集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    相关资源
    最近更新 更多