【发布时间】: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 连接到a 和c,但a 和c 不一定连接。
什么算法解决了这个问题?
感谢您提供的任何帮助。
【问题讨论】:
-
是否适合将您的问题视为试图找到具有加权边和与这些边之间的角度成比例的顶点成本的图的 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