我有一个问题看起来像一英里高的连接子图问题,但非常明显,因为它不属于严格的定义。
我面对的是一个包含数百万个节点和链接的图表(手动分析是不可能的),在这些数百万个节点中,已知有2或3个“集合”。
每个“集合”由数百分之一的节点和数万分之一的子图组成,没有强连接。这些集合中的每一个在理论上都不应该与其他集合相关联......但是(猜测)有十几个错误的链接最终连接这些集合。
问题是找到那些集合和错误的链接,或者至少得到一个人工管理的错误链接候选列表,可以手动验证。
我目前的“最佳想法”是随机选择两个节点,找到它们之间的最短路径,然后在最短路径上标记链接。冲洗&重复数百万次,错误的链接最终成为最明显的链接,因为它们是集合之间的“阻塞点”。
然而,这是非常缓慢的,当一个集合比其他集合大得多且具有内部阻塞点时,它最终占据“最明显”的列表,使其变得毫无意义。
有更好的算法/方法吗?
编辑:路径标记的细化是与路径的长度成比例地标记,这有助于“大集合的内部阻塞点”问题,但并不完全消除它一些集可以有远距离的“异常值”,而其他集合有很多紧密连接的节点(短内部距离)
答案 0 :(得分:1)
我的想法是ant colony algorithm。我对你选择两个随机节点的方法感到鼓舞,但认为做更多的事情而不仅仅是计算最短的路径会很有用。
在n个随机节点中启动n个蚂蚁。您需要使用试错法调整n。蚂蚁在旅行边缘留下信息素。信息素及时蒸发。蚂蚁根据概率选择一个独特的边缘旅行。边缘的信息素越多,蚂蚁选择边缘的可能性就越大。
一开始蚂蚁完全随机移动,因为没有信息素,边缘的概率相同。然而,随着时间的推移,最流行的边缘,两个之间的桥梁,模糊连接"组件上会有越来越多的信息素。
所以,你扔n蚂蚁,模拟m转,并返回具有最高信息素量的边缘。您可以直观地看到这个过程,以清楚地看到发生了什么。
更新:我意识到句子" 然而,随着时间的推移,最流行的边缘,两个之间的桥梁,模糊连接的#34;组件上会有越来越多的信息素" 是错误的。我implemented它看起来像大多数时候桥梁不一定吸引蚂蚁:
有n = 1000个蚂蚁,m = 1000步。最初每个边缘都有1个单位的信息素,如果蚂蚁在它上面移动,它会增加1个。没有蒸发,但我认为这不会改善情况。 Bridge有49845个信息素单位,但还有另外三个边缘超过100k。
根据评论Peter de Rivaz的建议,我尝试(source code)在两个随机节点之间重复min-cut,这样做要好得多:
使用python-igraph库生成的图表。