假设我有一个边缘相对较少的有向图(例如N
= 1000个节点,M
= 3000个边缘)。我需要枚举从1到N
的节点,以便尽可能少的边从较低编号的节点指向较高编号的节点。
例如,这是一个很好的优势:
44 o----------->o 12
这个很糟糕:
3 o------------> 117
我怎么能解决这个问题?我想这些任务有现有算法,但不知道要搜索什么。此外,我不需要找到绝对最好的解决方案,只需要在实践中足够接近。例如。如果全局最佳是5个坏边缘,那么10个坏边缘的解决方案对我的目的来说也足够了(但是200不是)。
答案 0 :(得分:1)
特别是因为你只想要一个好的解决方案,而不一定是最好的,这听起来像马尔可夫链蒙特卡罗方法应该适合你。
从节点的随机枚举E_0开始计算得分S(E_0)
许多步骤
运行此算法时,请跟踪获得的最低分数和实现该分数的枚举。
答案 1 :(得分:1)
你必须有来自周期的边缘,所以你首先想要将问题分解为strongly connected components。
请注意,强连接组件的图形是非循环的,这意味着可以轻松比较来自不同组件的两个节点。
然后,您可以尝试在每个循环中搜索循环并“标记坏”一个边缘,这将自己将组件转换为DAG(您可以尝试删除许多循环中常见的边缘,这应该有帮助)。
我不得不承认我不知道这会如何处理坏边缘,但我认为这将是一个很好的方法。