带权重限制的图搜索

时间:2011-08-18 13:45:30

标签: algorithm graph graph-algorithm

我有一个无向的加权图,其中任意类型的对象作为节点。两个节点A和B之间边缘的权重是这两个节点在区间(0,1)中的相似性。0的相似性导致节点之间没有连接,因此图形可以被分区。

给定目标权重w和起始节点S,该起始节点S是用于找到具有权重>的所有节点的算法。 W上。子节点(从S看)应该具有路径上所有权重的乘积。即:

S --(0.9)-- N1 --(0.9)-- N2 --(0.6) -- N3

从S开始,节点将具有以下相似性值:

N1: 0.9 
N2: 0.9 * 0.9 = 0.81
N3: 0.9 * 0.9 * 0.6 = 0.486

因此,给定S和目标权重0.5,搜索应返回N1和N3。从N2开始的搜索将返回S,N1和N3。

他们的算法是否符合我的需求?

2 个答案:

答案 0 :(得分:5)

请注意以下事项:

  1. log(p1 * p2) = log(p1) + log(p2)
  2. 如果p1 < p2然后log(p1) < log(p2),那么:-log(p1) > -log(p2)
  3. 声明[基于上面提到的1,2]:找到从s到t最相似的路线,实际上是找到从s到t的最小路径,其中权重是原始的-log

    我建议使用以下算法,基于Dijkstra's algorithm和上述声明。

    1. define for each edge e: w'(e) = -log(w(e)) //well defined because w(e) > 0
    2. run Dijkstra's algorithm on the graph with the modified weights.
    3. return all vertices v that their weight is dijkstra(v) < -log(needed)
    

答案 1 :(得分:0)

您可以尝试使用Bellman-Ford算法,因为它在边缘的求和和乘法以及最小值和最大值(您计算最长路径 - 使用最大值 - 通过执行倒置操作时工作正常)。

另外,如果你取所有路径的对数,问题就会从乘法减少到求和。之后,您可以反转权重的符号(将问题从找到最小值转变为找到最大值)并在该图上使用Bellman-Ford算法。由于你的所有权重最初都在0和1之间,所以在这两种变换之后你也应该能够使用Dijkstra。

然后在计算路径后,只需恢复转换并检查哪些“距离”适合您。