以最少的交换次数重新排序序列以满足偏序约束

Reorder a sequence with minimum number of swaps to fulfil partial order constraints

输入:元素数组和这些元素子集的偏序,被视为约束集。

输出:满足部分顺序的数组(或任何有序序列)。

问题:如何才能有效地实现重新排序?与原始输入序列相比,引入的反转(或交换)的数量应尽可能少。请注意,可以为任意数量的元素定义偏序(某些元素可能不是其中的一部分)。

上下文: 源于2层图交叉归约的一种情况:交叉归约阶段后,我想重新排序一些节点(因此,部分订单可能只包含一小部分)。

总的来说,我的想法是稍微削弱它并只解决属于偏序的元素的问题(尽管我认为这可能会导致非最佳结果)。因此,如果我有一个序列 A B C D E 并且偏序只包含 A、B 和 E,那么 C 和 D 将留在同一个位置。它让我想起了 Kemeny 分数,但我还不能将其转化为算法。

确定一下:我不是在搜索拓扑排序。这可能会引入比所需更多的反转。

编辑 1:

我找到了一篇看起来很有希望的论文:"A Fast and Simple Heuristic for Constrained Two-Level Crossing Reduction" 迈克尔·福斯特 (Michael Foster)。 连同我的问题下面的评论,它得到了回答。再次感谢@j_random_hacker!