我一直在寻找“最短路径搜索算法的MapReduce实现”。
然而,我能找到的所有实例“计算从节点x到y的最短距离”,并且没有实际输出“实际最短路径,如x-a-b-c-y ”。
至于我想要实现的是我有数百个节点的图表,我需要在各个节点之间的最短路径上进行频繁的模式分析。这是我正在研究的一个研究项目。
如果某人能指出某些实现(如果存在)或者给出how to hack the existing SSSP implementations to generate the paths along with the distances
的一些指示,那将是一个很大的帮助。
答案 0 :(得分:1)
基本上这些实现适用于某种消息传递。因此,消息将在map和reduce阶段之间发送到HDFS。
在减速器中,它们按距离进行分组和过滤,最低距离获胜。在这种情况下更新距离时,您必须设置消息来自的顶点(可能是某些ID)。
因此,每个顶点都有额外的空间要求,但您可以重建图中每条可能的最短路径。
根据您的评论:
是的可能
我需要编写另一个顶点对象类来保存它 附加信息。谢谢你的提示,虽然它会非常 如果你可以指出我可以捕获它的地点和时间,这会很有帮助 最小重量来自哪里的信息,博客中的任何内容可能是: - )
是的,也可能是一个非常酷的主题,也适用于Apache Hama。大多数实现只是考虑成本而不是真正的路径。在你的情况下(从你上面链接的博客),你将不得不提取一个顶点类,它实际上将相邻的顶点保持为LongWritable
(可能是一个列表而不是文本对象上的这个分割),只需添加一个父或源ID为字段(当然也是LongWritable
)。
您将在映射器中传播时设置此值,即在当前关键节点的相邻顶点上循环的for循环。
在reducer中,你将在迭代分组值的同时更新某个地方的最低点,在那里你必须通过更新到最小值的顶点在关键顶点设置源顶点。
您可以从我的博客中实际获取一些顶点类: Source 或直接从存储库: Source
也许它会对你有所帮助,但是如果你有一个特定的问题,请回复我。
以下是BSP中使用Apache Hama的相同算法:
https://github.com/thomasjungblut/tjungblut-graph/blob/master/src/de/jungblut/graph/bsp/SSSP.java