如何在图表中找到n个最不同的路径?

时间:2014-02-28 13:28:55

标签: python algorithm graph

我在我的应用程序中使用Python的 NetworkX 库进行一些图形处理。一个任务是调用 NetworkX all_simple_paths()函数,为我提供图中所有非循环路径(最多可达一定长度的路径)。这很有效。

使用图表中所有简单路径的列表,任务现在是从此列表中找到许多 n 路径,其中每个 n 路径都应该尽可能与所有其他 n 路径不同。或者换句话说:来自生成的 n 路径的任何两条路径应该具有尽可能少的公共节点。或者换句话说:生成的 n 路径中的每条路径都应尽可能唯一。

你能想到任何(非强力)算法来实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

您可以根据它们共享的边数创建两条路径之间的相似性或距离。然后应用聚类算法来查找n个聚类,并从每个聚类中选择一个代表,也许是以贪婪的方式来最小化(在相似的情况下)代表之间的边权重。

答案 1 :(得分:0)

这在很大程度上取决于您的特殊需求。有几个选择。两个内置,一个需要更多工作,但可能更快。

如果您真正想要的是找到两条不相交的路径,那么您可以使用过滤后的图形 - 找到一条路径后,引入一个删除了中间节点的子图,并找到该图形中的最短路径。

如果你不能保证路径不会相交,那么你又回到了暴力。由于路径不包括循环,并且它们是简单列表,因此查找相交节点的数量就像从两条路径生成集合并查找差异的长度一样简单,这非常快。检查所有对,找到交叉点最小的对。

以上哪两个更快取决于您的特定图表 - 它是稀疏还是密集?有多少个节点?等。

由于all_simple_paths是一个生成器,您实际上可以稍微关注该算法。即如果你绘制前两个路径的图形,并且它们完全不相交,那么你 已经有你的小案例,不需要再看了。可能有很多路径,但是您可以使用上限的上限或允许的阈值(即,如果这些只有1个共同点,而不是绝对0,那么它就足够了,返回它),或其他一些组合使用我查看的路径数和当前最大值以限制计算时间。

如果计算时间对你的算法至关重要,也可以考虑切换到igraph ... networkx更容易处理,通常性能“足够好”,但对于像这样的大型强力算法,igraph可能会至少快一个数量级。

最后一种可能性是避免使用all_simple_paths,而是使用bfs树。我不确定all_simple_paths是否是BFS,它可能是,但是这可能会让你更好地选择第二种算法来查看初始路径,但不确定。例如。如果你知道你的源节点有多个后继节点,你可以通过强制你的起始两条路径从两个不同的后继节点而不是从初始节点开始,来获得不错的结果。请注意,这也可以咬你 - 这个贪婪的算法也会让你误入歧途,除非你的图形已经非常适合它(你可能已经知道,或者可能不是)。