【问题标题】:Minimum spanning tree for pairs of adjacent edges相邻边对的最小生成树
【发布时间】:2021-10-12 18:56:07
【问题描述】:

对于某些图,每对相邻边都有相关的成本。我希望找到一个子图,使得每个点都连接起来并且成本最小化(最小生成树)。

对于上面的例子,解决方案将包括边 AB、BC 和 CD,但不包括 DA,避免了昂贵的 CDA 和 DAB 三元组,得到 28 分(ABC + BCD 的权重)。

为了激发这个问题,让我们假设我们正在设计一个地点之间的道路网络,每当汽车在急转弯处转弯时,它就会减速。创建具有少量急弯的理想网络可能会受益于我们将节点三元组考虑在内。

我打算应用此算法的图将具有 5,000 到 20,000 个节点和 15,000 到 80,000 条边。据推测,该函数将是这种类型或类似的:

(
  nodes: [T],
  edges: [(int, int)],
  distance: (a: T, b: T, c: T) => float
) => [(int, int)]

其中b 连接到ac,但ac 不一定连接。

什么算法解决了这个问题?

感谢您提供的任何帮助。

【问题讨论】:

  • 是否适合将您的问题视为试图找到具有加权边和与这些边之间的角度成比例的顶点成本的图的 MST?如果是这样,如果许多边与一个顶点相邻,角度如何定义?
  • @Richard Hmm... 如果对于任何一对相邻边 distance(a,b,c) = edgeCost(a,b) + edgeCost(b,c) + vertexCost(a,b,c),那么对于一个顶点 V,具有 3 个相邻顶点 W、X 和 Y,其顶点成本将为vertexCost(W,V,X) + vertexCost(W,V,Y) + vertexCost(X,V,Y)。这有帮助吗?
  • @Richard Hmm...我想知道V这个具有3个相邻顶点的顶点的成本是否应该除以3^2,这样分支度就不会被无意中最小化。跨度>
  • 我对当前形式的问题提出了建议,但正如@Richard 指出的那样,如果我们知道远处的结构,那么我们可能能够更好地利用它。

标签: algorithm optimization dynamic-programming graph-theory minimum-spanning-tree


【解决方案1】:

二次目标似乎有足够的余地来构建用于降低 NP 硬度的小工具,尽管我目前没有证据。

由于您的图表很稀疏,我希望最大度数很小,尤其是考虑到您对道路网络的评论。我建议使用以下整数规划公式:

  • 变量:对于每条边 {v, w},设一个 0-1 变量 x(v, w) 如果 {v, w} 属于生成树则为 1,否则为 0。此外,对于每个顶点 v 和每个与 e 关联的边的非空子集 S,假设存在一个 0-1 变量 y(v, S),如果树中与 e 关联的边的子集为 S,则该变量为 1,否则为 0 .

  • 目标:最小化 ∑v,S{u,w}⊆S 距离(u, v, w) y(v, S)。

  • 初始约束:我们要求 ∑v,S y(v, S) = 1,即每个顶点必须在树中准确地选择一个邻域。我们还要求对于每条边 {v, w} ∑v,S∋w y(v, S) = x(v, w),即 v 选择的邻域必须是与边缘是否存在一致。

  • 连接约束:现在没有任何东西强迫求解器选择任何边。可以静态地制定连接约束,但我建议采用以下方法。到目前为止,使用约束运行求解器并计算其连通分量。如果只有一个组件,那很好,这是最佳解决方案。否则,对于每个分量 C,要求 ∑{v,w}∈E(C,V∖C) x(v, w) ≥ 1——即树包含至少一条边一个端点在 C 中,一个端点不在 C 中——然后重试。

我通常使用OR-Tools,因为它是我工作的首选库,但您有很多选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2012-04-13
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多