我有一个无向的加权图,其中任意类型的对象作为节点。两个节点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。
他们的算法是否符合我的需求?
答案 0 :(得分:5)
请注意以下事项:
log(p1 * p2) = log(p1) + log(p2)
p1 < p2
然后log(p1) < log(p2)
,那么:-log(p1) > -log(p2)
声明[基于上面提到的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。
然后在计算路径后,只需恢复转换并检查哪些“距离”适合您。