【问题标题】:MST from an array of 2D triangles, but with a little twist来自二维三角形数组的 MST,但有一点扭曲
【发布时间】:2017-10-23 00:28:10
【问题描述】:

以下是迄今为止所采取步骤的示意图:

  1. 伪随机矩形生成
  2. “中心节点”插入、矩形分离和最终节点选择
  3. Delaunay triangulation(显示之前选择的节点)
  4. 三角形边的渲染

此时(第 5 步),我想用这些数据形成一个Minimum Spanning Tree,但是有一个轻微 问题...

图表中的某处(可能靠近中心,但并非总是如此)将是一个节点,需要从其他唯一节点到它的 3-5 个连接。这使事情变得复杂,因为每个其他节点都应该只包含一个连接,并且正在使用的数据结构使得很难以可靠的、可遍历的格式确定“什么连接到什么”。

因此,给定上述格式的三角形数组,以及用作“根节点”的随机顶点,我如何正确地遍历网络以创建一个 MST,其中至少有 3 个连接到我们的“中心节点”,但与它的连接不超过 5 个?这可能吗?

【问题讨论】:

  • 忘了说。权重只是顶点之间的简单欧式距离。
  • 识别节点可能有多少个候选边?
  • @DavisHerring 我添加了一个示例图像,说明了从矩形生成到三角测量的所有步骤。在该示例中,您可以看到所有节点都有不同数量的边(因为图形由三角形组成)。但是“中心节点”的生成保证至少有 3 条边。下一步是选择一个随机节点,并让它遍历所有其他节点,同时以某种方式保证“中心节点”将有 3-5 个连接。
  • 如果它有助于可视化目标,您可以说右上角的节点是“根节点”,但它是哪一个并不重要,只要“中心节点”在最终的 MST 中有 3-5 个与它的连接,并且所有其他节点都被访问不超过一次
  • 显然,如果任何节点不与根相邻,则其他节点将具有多个连接。因此,我忽略了“每个其他节点应该只包含一个连接”,认为它只是意味着“其他节点没有度数限制”。但是你真的是说这个图必须是从根发出的 3-5 条路径吗?如果是这样的话,那确实是一个非常特殊的 MST,而且它一般不存在(尽管它可能适用于凸三角剖分)。

标签: c++ algorithm design-patterns graph-theory procedural-generation


【解决方案1】:

由于 Delaunay 三角剖分中的顶点很少有超过 6 条边,因此您可以使用蛮力:只有 20+15+6 种方法可以从 6 条边中选择 3 条、4 条或 5 条边(分别),所以尝试所有这些。对于这样创建的 41 个(9 级最多 336 个)小树(根和一些边)中的每一个,运行 Kruskal's algorithmPrim's algorithm 从已经“发现”为 MST 一部分的那棵树开始。 (忽略根的其他边,以免进一步增加它的度数。)然后只选择最好的一个(包括种子树的成本)。

至于一般的邻居信息问题,看来你只需要先建立一个标准的图表示。例如,您可以通过扫描所有 Edge 对象并将每个端点存储在与另一个相关联的列表中(在 map<Vector2<T>,vector<Vector2<T>>> 或基于顶点的任何标识符的等效项中)来创建邻接列表。

【讨论】:

  • 是的,Prim's 最初是在发布之前就在大脑中​​的。但是一旦你加入一个需要与它有特定范围的连接的节点,它就会变得相当混乱。所以你说总是从“中心节点”开始,但我们如何保证它成为树中唯一具有多个连接的节点? Prim 的第一次迭代不会再次破坏从该节点向外移动的能力吗?因为它需要有 3 个“出口”,这是否意味着需要有 3 个相邻的、未访问的节点?
  • 哦,等等,当您说“小树”和“忽略未选择的边缘”时,我可能误解了您的意思。我是否需要多次运行 prim,使用相同的根,但每次选择不同的边缘?
  • @RectangleEquals:我进行了编辑以澄清,但我也对这个问题发表了评论,因为我可能严重误解了它。
  • 我会一直努力解决这个问题,直到我找到工作为止。它比您的平均 MST 更复杂,但我几乎可以肯定它可以完成,即使它最终需要成倍地更长的时间来执行
【解决方案2】:

我采取了一种解决方法...

在算法的第 3 步之后,我只需删除连接到“中心节点”的所有边,跟踪哪些边形成围绕它的“环”(也称为“边循环”),然后在所有节点上运行 MST剩余边。

对于 MST,我使用了 boost 图形库。 这使得遍历我拥有的三角形变得很容易,将它的三个边中的每一个都添加到adjacency_list。然后简单地调用提供了 boost 的 MST 算法来处理剩下的事情。

最后,我读取了之前取出的边缘。最短路径是上一步中的任何一条,加上连接到“环”上另一条边的读取边的长度最短。

然后我可以添加(或删除)任意数量的先前边,以确保有 3 到 5 条边从边循环连接到“中心节点”。

按此顺序执行操作还可以让我在第 3 步时就知道我们是否会有有效数量的边,因此我们不会浪费运行 MST 的周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 2016-02-06
    • 2015-01-04
    • 1970-01-01
    • 2015-10-03
    • 2014-04-21
    相关资源
    最近更新 更多