Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 对图形进行排序,使尽可能多的箭头指向前方_Algorithm_Sorting_Graph_Directed Graph - Fatal编程技术网

Algorithm 对图形进行排序,使尽可能多的箭头指向前方

Algorithm 对图形进行排序,使尽可能多的箭头指向前方,algorithm,sorting,graph,directed-graph,Algorithm,Sorting,Graph,Directed Graph,我需要对有向图的节点进行排序,以使向后流动的箭头数量(与排序顺序相反)最小 我可以想到算法(例如,不断交换节点,直到没有交换可以改善情况),但我不确定它们运行的速度有多快,或者它们是否达到最佳解决方案 这个问题的名称和复杂性是什么?可以使用a按深度排序节点,但是,这只适用于不包含循环的图。你的问题听起来像是图表中有循环。一种选择是找到循环(请参阅以了解执行此操作的方法)并中断循环,记录中断的位置。然后对节点进行排序并重新链接 如果您这样做是为了可视化,那么有一个名为的图形渲染库,它执行与您所描述

我需要对有向图的节点进行排序,以使向后流动的箭头数量(与排序顺序相反)最小

我可以想到算法(例如,不断交换节点,直到没有交换可以改善情况),但我不确定它们运行的速度有多快,或者它们是否达到最佳解决方案


这个问题的名称和复杂性是什么?

可以使用a按深度排序节点,但是,这只适用于不包含循环的图。你的问题听起来像是图表中有循环。一种选择是找到循环(请参阅以了解执行此操作的方法)并中断循环,记录中断的位置。然后对节点进行排序并重新链接


如果您这样做是为了可视化,那么有一个名为的图形渲染库,它执行与您所描述的非常类似的操作,然后布局节点。它易于集成和使用,并将渲染到屏幕或各种不同的输出格式。

经过思考,我意识到问题可以分为两部分:

  • 确定图的最大无环子图(其中)
  • 对其进行拓扑排序(即

  • 谢谢拓扑排序可以推广到处理循环,基本上使用你的想法,但这并没有给我我想要的排序。顺便说一句,我们确实将这些图输入到GraphViz,但我也需要对它们进行排序。PS我想了很久,我真正想要的是在图中找到一个最大的非循环子图,然后对其进行排序。第一个问题是NP难:-(它必须是最大的吗?你能使用一个启发式算法来找到一个大的子图吗?是的,原则上;我认为增量算法最好,它只是试图找到一个更大的子图,直到超过某个限制,作为一个参数传递。你可以使用整数规划作为启发式算法来解决旅行商问题。它是当然,我们不一定要找到一条最优路径(我想这与局部极小值有关),但它通常会找到一条好的路径。也可以使用其他启发式方法。也许类似的方法可以适应您的问题。