识别“模糊连接”子图的算法

5
我有一个问题,看起来跟连接的子图问题很像,但实际上不属于严格的定义。
我面对的是一张拥有数百万个节点和链接的图(无法进行手动分析),其中有已知的2或3个“集合”。
每个“集合”由数十万个节点和成千上万个子图组成,这些子图不强连通。理论上,这些“集合”不应该相互连接...但是(估计)有几十个错误链接最终将它们连接起来。
问题在于找到这些集合和错误链接,或者至少得到一个人类可管理的错误链接候选列表,可以通过手动验证进行确认。
我的目前的“最佳想法”是随机选择两个节点,找到它们之间的最短路径,然后标记该最短路径上的链接。重复执行数百万次,错误链接最终会成为最多被标记的链接,因为它们是集合之间的“瓶颈”。
然而,这种方法相当缓慢,并且当一个集合比其他集合大得多并且具有内部瓶颈时,它会主导“最多被标记”的列表,使其毫无意义。
是否有更好的算法/方法来解决这个问题?
编辑:路径标记的改进是按路径长度成比例地标记,这有助于解决“大集合的内部瓶颈”问题,但并不完全消除它,因为某些集合可能具有远离的“异常值”,而其他集合具有许多紧密连接的节点(短内部距离)。

3
在两个随机节点之间运行最小割算法是否可行? - Peter de Rivaz
1个回答

1

我的想法是使用蚁群算法。我受到你选择两个随机节点的方法的启发,但认为在计算最短路径之外做更多的事情会很有用。

在n个随机节点上放置n只蚂蚁。需要通过试错的方法调整n。蚂蚁在经过的边上留下信息素。信息素会随着时间蒸发。蚂蚁根据概率选择其中一个不同的边进行移动。边上的信息素越多,蚂蚁选择该边的概率越大。

一开始蚂蚁完全随机移动,因为没有信息素,边的概率是相同的。然而,随着时间的推移,最受欢迎的边缘,即连接两个“模糊连接”组件的桥梁,将在其上具有越来越多的信息素。

所以,你可以投掷n只蚂蚁,在m轮模拟后返回信息素最高的边缘。你可以可视化这个过程,以清楚地看到正在发生什么。

更新: 我意识到这句话"然而,随着时间的推移,最受欢迎的边缘,也就是两个“模糊连接”组件之间的桥梁,将会有越来越多的信息素"是错误的。我实现了它,看起来大部分时候桥梁不一定会吸引蚂蚁:

enter image description here

有1000只蚂蚁和1000个步骤。 初始时,每条边都有1个单位的信息素,如果蚂蚁经过它,则增加1个单位。没有蒸发,但我认为这不会改善情况。 桥上有49845个信息素,但还有另外三条边的信息素超过了100k。


根据评论中Peter de Rivaz的建议,我尝试了(源代码)在两个随机节点之间重复min-cut,效果更好:

enter image description here

使用python-igraph库生成的图表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接