我正在寻找一种方法,在给定的定向未加权图上执行拓扑排序,包含循环。结果不仅应包含顶点的排序,还应包含给定排序违反的边集。这组边缘应该是最小的。
由于我的输入图可能很大,我不能使用指数时间算法。如果不可能在多项式时间内计算最优解,那么对于给定的问题,启发式算法是否合理?
答案 0 :(得分:11)
有一种拓扑排序算法可以通过选择一个没有传入弧的顶点,在图形上减去顶点的递归,并将该顶点预先添加到顺序来构建顶点顺序。 (我正在递归地描述算法,但你不必那样实现它。)Eades-Lin-Smyth算法也可以查找没有传出弧的顶点,追加它们。当然,可能会发生所有顶点都有传入和传出弧。在这种情况下,选择传入和传出之间具有最高差异的顶点。毫无疑问,这里有实验的空间。
具有可证明的最坏情况行为的算法基于线性编程和图形切割。这些都很整洁,但保证不太理想(log ^ 2 n或log n log log是所需弧数的n倍),我怀疑有效的实现将是一个非常好的项目。
答案 1 :(得分:0)
受 Arnauds 答案和其他有趣的拓扑排序算法的启发,我创建了 cyclic-toposort 项目并将其发布在 github 上。 cyclic_toposort 完全符合您的要求,因为它可以快速对有向循环图进行排序,从而提供最少数量的违规边。如果需要,它还可以选择提供处于同一拓扑级别(因此可以同时激活)的最大节点分组。
如果问题仍然与您相关,那么如果您查看我的项目并告诉我您的想法,我会很高兴!
这个项目对我自己的神经网络拓扑研究很有用,所以无论如何我都必须创建这样的东西。我这么晚才回答你的问题,以防其他人偶然发现这个帖子来寻找同样的问题。