首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有目标函数的拓扑排序

具有目标函数的拓扑排序
EN

Stack Overflow用户
提问于 2016-07-13 15:56:08
回答 2查看 1.6K关注 0票数 15

我有一个具有N个节点的DAG,即1, 2, ..., N,并且每个节点都有一个权重(我们可以称之为x_1, x_2, ..., x_N )。我想做一个拓扑排序,但困难是我在排序时有一个目标函数。我的目标函数是最小化几对节点之间的总时间。

例如,我有一个有6个节点的DAG,我想要一个特定的拓扑排序,使(1,3) + (2,4)最小化,其中(A,B)表示两个节点A和B之间的时间。例如,如果我们有一个排序[1, 6, 3, 2, 5, 4, 7](1,3) = x_6(2,4) = x_5。基于DAG,我希望找到一种最小化(1,3) + (2,4)的排序。

这个问题我已经思考了一段时间了。生成所有可能的拓扑排序(参考link)并逐个计算目标函数始终是一种可能的解决方案,但如果N很大,则会花费太多时间。我还被建议在生成所有可能的排序时使用分支边界修剪(我不是很熟悉分支边界,但我认为这不会显着降低复杂性)。

有没有解决这类问题的(最优或启发式)算法?如果该算法也能应用于其他目标函数,如最小化某些节点的总启动时间,那将是完美的。任何建议都是值得感谢的。

PS:或者,是否可以将这个问题表示为一个线性整数优化问题?

EN

回答 2

Stack Overflow用户

发布于 2016-07-19 17:44:34

解决此问题的一种方法如下:

首先,我们运行所有对最短路径算法Floyd-Warshall。该算法在O(V^3)时间内运行,可用essentially 5 lines of code编写。它生成图中每对顶点之间的最短路径,即生成最短路径的V×V矩阵作为其输出。

修改这个算法很简单,这样我们就可以得到每个O(N^2)路径中包含的顶点的计数。所以现在我们可以消除所有少于N个顶点的路径。对于剩余的路径,我们根据它们的成本对它们进行排序,然后测试它们中的每一个,看看是否没有违反拓扑排序属性。如果这个属性没有被违反,那么我们就找到了我们想要的结果。

上面的最后一步,即测试拓扑排序,可以在O(V+E)中对每个O(V^2)路径执行。这会产生O(V^4)的最坏情况运行时间。然而,在实践中,这应该是很快的,因为Floyd-Warshall可以使其非常适合缓存,而且我们实际上只测试了一小部分O(N^2)路径。此外,如果您的DAG不是密集的,那么您也可以使用适当的数据结构来优化拓扑测试。

票数 1
EN

Stack Overflow用户

发布于 2017-06-13 23:04:11

这是一个想法:

为简单起见,首先假设您有一个要优化的对(稍后我将对一般情况进行评论),并假设您已经将图形拓扑排序到一个数组中。

取数组片段,从该对的较低(根据拓扑顺序)节点开始(假设l ),并在较高节点(假设h )结束。对于在lh之间排序的每个节点,计算它是否从下到下由l和/或从上到上由h限定。您可以通过在l的“向上”BFS中标记节点,在h之上的节点排序的处切割节点来计算前者的属性;类似地,通过在h的“向下”的BFS中标记节点,在l下的节点排序的处切割节点,可以计算前一个属性。这两个过程的复杂度都是O( B*L ),其中B是分支因子,L是最初在lh之间排序的节点数。

现在,如果保留向上或向下重定位的每组节点内的原始排序顺序,则所有未由h从上方限定的节点可以移动到h上方,并且所有未由l从下方限定的节点可以移到l下方(两个集合可能重叠),所有这些都不会违反数组的拓扑排序。

如果从原始排序顺序中剪切的线段不重叠,则可以根据需要对任意数量的线段应用相同的过程。

如果任何两个对重叠,例如(l1, h1)(l2, h2),例如l1 < l2 < h1 < h2在原始排序的顺序中,则会出现以下两种情况:

1)在拓扑代码顺序中h1l2碰巧不相关的小情况下,您应该能够优化这两个对,它们基本上彼此独立,只需小心地将l2移到h1之上或h1移到l2之下(但不是,例如h1,如果这应该是可能的话)。

2)如果l2 < h1在拓扑顺序中,您可以将这两个对视为单对(l1, h2),然后可能将该过程再次应用于(l2, h1)

由于还不清楚在非平凡的重叠情况下,完整的过程将实现什么,特别是如果您有更复杂的重叠模式,那么无论重叠与否,统一对待所有对可能会更好。在这种情况下,可以重复处理订单,同时每次运行都会产生比前一次更好的结果(我不确定这个过程在目标函数方面是否会是单调的--可能不是)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38345747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档