Algorithm 对图形进行排序,使尽可能多的箭头指向前方
我需要对有向图的节点进行排序,以使向后流动的箭头数量(与排序顺序相反)最小 我可以想到算法(例如,不断交换节点,直到没有交换可以改善情况),但我不确定它们运行的速度有多快,或者它们是否达到最佳解决方案Algorithm 对图形进行排序,使尽可能多的箭头指向前方,algorithm,sorting,graph,directed-graph,Algorithm,Sorting,Graph,Directed Graph,我需要对有向图的节点进行排序,以使向后流动的箭头数量(与排序顺序相反)最小 我可以想到算法(例如,不断交换节点,直到没有交换可以改善情况),但我不确定它们运行的速度有多快,或者它们是否达到最佳解决方案 这个问题的名称和复杂性是什么?可以使用a按深度排序节点,但是,这只适用于不包含循环的图。你的问题听起来像是图表中有循环。一种选择是找到循环(请参阅以了解执行此操作的方法)并中断循环,记录中断的位置。然后对节点进行排序并重新链接 如果您这样做是为了可视化,那么有一个名为的图形渲染库,它执行与您所描述
这个问题的名称和复杂性是什么?可以使用a按深度排序节点,但是,这只适用于不包含循环的图。你的问题听起来像是图表中有循环。一种选择是找到循环(请参阅以了解执行此操作的方法)并中断循环,记录中断的位置。然后对节点进行排序并重新链接
如果您这样做是为了可视化,那么有一个名为的图形渲染库,它执行与您所描述的非常类似的操作,然后布局节点。它易于集成和使用,并将渲染到屏幕或各种不同的输出格式。经过思考,我意识到问题可以分为两部分:
谢谢拓扑排序可以推广到处理循环,基本上使用你的想法,但这并没有给我我想要的排序。顺便说一句,我们确实将这些图输入到GraphViz,但我也需要对它们进行排序。PS我想了很久,我真正想要的是在图中找到一个最大的非循环子图,然后对其进行排序。第一个问题是NP难:-(它必须是最大的吗?你能使用一个启发式算法来找到一个大的子图吗?是的,原则上;我认为增量算法最好,它只是试图找到一个更大的子图,直到超过某个限制,作为一个参数传递。你可以使用整数规划作为启发式算法来解决旅行商问题。它是当然,我们不一定要找到一条最优路径(我想这与局部极小值有关),但它通常会找到一条好的路径。也可以使用其他启发式方法。也许类似的方法可以适应您的问题。