【问题标题】:Topological sort with an objective function具有目标函数的拓扑排序
【发布时间】:2016-07-13 07:56:07
【问题描述】:

我有一个有 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:或者,是否可以将这个问题表述为线性整数优化问题?

【问题讨论】:

  • 我怀疑这个问题很难,因为它的 2 个小的变化肯定是:(1)如果距离的 sum 被替换为 maximum 的距离,那么你可以将 NP-hard Bandwidth Minimization 问题减少到这个问题(从输入图 G 开始,删除所有边,并添加一个根顶点和一个出边到每个其他顶点 - 这意味着 任何原始n个顶点的排序都是有效的拓扑顺序——对于G中的每条边(u,v)(你删除的),在目标函数中添加一个术语(u,v)以最小化); ...
  • ... (2) 如果您改为保留对之间距离的总和(而不是最大值),但稍微概括目标函数以允许每个术语(例如 (1,3)(2,4) in你的例子)乘以一个单独的权重,那么你可以以同样的方式将 NP-hard 二次分配问题减少到这个问题。可能即使每个权重为 1 的 QAP 的特殊情况仍然是 NP 难的——这意味着你的问题也是如此——但我无法用几个谷歌确认这一点。
  • @j_random_hacker。感谢您的回复。我也相信这个问题是NP难的。我意识到我的问题类似于旅行推销员问题。我不知道二次分配问题和带宽最小化问题。感谢您带来连接。我已经为这个问题设计了一种启发式方法。但是,我正在寻找一种组合优化公式,以便可以应用分支定界来获得最佳解决方案,以比较我的启发式方法。
  • 请记住,要显示 NP-hardness,我们需要能够获取某个已知 NP-hard 问题(如 QAP)的任意实例,并将其机械地转换为您的问题的实例。对于我给出的简化,我们创建了一个您的问题的实例,其中唯一的优先约束是根顶点必须在前:这是您的问题的一个有效的可能实例,因此解决您的问题的算法必须能够解决它.查找(例如使用 Google)如果您感到困惑,如何使用 NP-hard 问题的归约来显示问题的 NP-hardness。
  • (为了清楚起见:我们需要的不仅仅是证明 NP-hard 问题的实例可以转换为您的问题的实例——但这里的关键是,如果您的问题允许我们在减少中未使用或未充分使用的其他约束。)

标签: algorithm graph topological-sort


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果我错了,请纠正我。我觉得你的方法有问题。也就是说,我的最优解不一定最小化从开始节点到结束节点的路径,即我的最优解不一定在 Floy-Warshall 解的集合中。例如,如果我们有一个有 3 个节点的 DAG,一个从 1 到 2、1 到 3 和 2 到 3 的链接(1 在 2 之前,1 在 3 之前,等等),我们想要最小化 (1,3)。唯一可能的拓扑排序是 [1,2,3] 和 (1,3)=x_2。但是,很容易看出 Floyd-Warshall 的解决方案的顶点数都是 2。
  • 我想我对你的例子不是很清楚。在您的示例中,只有一种拓扑排序是可能的,因此无法最小化任何事情。我的理解是,您拥有具有多种可能的拓扑排序的 DAG,并且您希望选择一个使排序顶点中“主要”路径中的总成本最小化的 DAG。可能只有从 x 到 y 的路径是您想要优化的,这可以通过将其他边的成本设置为 0 来完成。如果您能给出一些不平凡的完整示例,那就太好了。
  • 换句话说,Floyd-Warshall 的所有可能解决方案的计数都可能小于 N。因此,您的方法将消除所有解决方案,最后不会产生任何解决方案。但是我的问题总是有解决方案的,因为这是 DAG 并且总是存在拓扑排序。考虑一个具有 4 个节点的非平凡 DAG,链接从 A 到 B、B 到 C、A 到 D 和 D 到 C。我想最小化 (A,C) + (B,C)。因此,所有最短路径最多有 2 个计数,并且它们都在您的方法中被消除。然而,拓扑排序产生两种可能的解 [A,B,D,C] 和 [A,D,B,C]。第二个是我的最优解。
【解决方案2】:

这是一个想法:

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

获取从该对的较低(根据您的拓扑顺序)节点开始的数组段,例如l,并以较高的节点结束,例如h。对于在lh 之间排序的每个单个节点,计算它是否从下方以l 为界和/或从上方以h 为界。您可以通过在l 的“向上” BFS 中标记节点来计算前一个属性,在h 上方的节点 sorted 处进行切割;同样,后者通过在h 的“向下” BFS 中进行标记,在l 以下的节点 sorted 处进行切割。任一通道的复杂度将为 O( B*L ),其中 B 是分支因子,L 是最初在 lh 之间排序的节点数。

现在,所有不受h 限制的节点都可以移动到h 之上,并且所有不受l 限制的节点都可以移动到l 之下(这两组可能重叠,) 都不会违反数组的拓扑排序,前提是保留向上或向下重定位的每组节点内的原始排序顺序。

只要从原始排序顺序中切出的片段不重叠,则可以根据需要将相同的过程应用于任意多对。

如果任何两对重叠,例如 (l1, h1)(l2, h2),例如l1 排序顺序,你有以下两种情况:

1) 在h1l2拓扑 顺序中碰巧不相关的微不足道的情况下,那么您应该能够大部分独立地优化这两对,只有小心地将l2 移动到h1 之上或h1 移动到l2 之下(但 例如h1 低于l1,如果这应该成为可能的话。)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多