【问题标题】:Find path in graph with weighted vertices在图中找到带有加权顶点的路径
【发布时间】:2016-01-21 05:00:24
【问题描述】:
我有下图,其中每个顶点都有一个关联的“概率”
(graph with weighted nodes)。
我想找到从节点 0 到最后一个节点(最高索引,这里是 5)的路径,它的乘积概率最高。在该图中,最佳路径是 0-1-4-5,其概率为 0.72。
我曾考虑使用 BFS 来查找起始节点和结束节点之间的所有路径,然后将每个节点的概率相乘,但我认为这种方法适用于所有图表过于幼稚。如何使用 python 解决这个问题?
【问题讨论】:
标签:
python
graph
traversal
【解决方案1】:
正如 Julien 所建议的,Dijkstra's algorithm 将是一个好的开始。您的问题与正常 Dijkstra 的问题有两个不同之处。
Dijkstra 算法最小化权重总和。为了最大化概率的乘积,您可以将每个权重 p 映射到 -log(p)。快速证明:最大化(x1*x2*...*xn) 的乘积与最大化log(x1*x2*...*xn) 相同,因为log 是monotonically increasing。 argmax(log(x1*x2*...*xn)) = argmax(log(x1)+log(x2)+...+log(xn)) = argmin(-log(x1)-log(x2)-...-log(xn)))。请注意,如果您想要得到的概率,您可以通过采用 10^(-c) 来反转结果,其中 c 是 Dijkstra 使用上述减少返回的最小成本(假设您采用以 10 为底的日志)。另请注意,如果任何概率为 0,log(0) 未定义,因此您应该通过使权重无限来处理此问题(因此路径永远不会通过该节点)。
Dijkstra 使用加权边,而您有加权节点。但这是从加权节点到加权边的简单简化。使用edge_weight(u,v) = vertex_weight(v) 定义从u 到v 的边的权重。从你的图片来看,你有一个无向图,所以你需要用两个有向边替换每个无向边,使用与上述相同的权重(注意两个顶点 u 和 v 之间的两条边将有不同的权重,除非vertex_weight(u) == vertex_weight(v))。另外,如果要返回最短路径的值,则需要将vertex_weight(source_vertex) 添加到最终成本中,因为减少时会跳过此成本。