对元素进行排序,以使某些元素不会介于其他元素之间


10

给定一个整数和一组不同的整数的三元组 找到一种算法,该算法可以找到集合的置换,使得 或正确确定不存在这种排列。非正式地,我们想对数字1到重新排序;每个三元组在表示必须之前出现在新的顺序,但不能之间出现n

S{(i,j,k)1i,j,kn,ij,jk,ik},
π{1,2,,n}
(i,j,k)S(π(j)<π(i)<π(k))  (π(i)<π(k)<π(j))
n(i,j,k)Sikji和。k

例子1

假设且。然后n=5S={(1,2,3),(2,3,4)}

  • π=(5,4,3,2,1)有效的置换,由于,但。(1,2,3)Sπ(1)>π(3)

  • π=(1,2,4,5,3)有效的置换,由于,但。(1,2,3)Sπ(1)<π(3)<π(5)

  • (2,4,1,3,5) 2,4,1,3,5是有效的排列。

例子2

如果且,则没有有效的排列。同样,如果并且 (我认为;这里可能犯了一个错误。小号= { 1 2 3 2 1 3 } Ñ = 5 小号= { 1 2 3 3 4 5 2 5 3 2 1 4 }n=5S={(1,2,3),(2,1,3)}n=5S={(1,2,3),(3,4,5),(2,5,3),(2,1,4)}

奖励:哪些属性确定是否存在可行的解决方案?S


为什么不在中将第二个条件改写为?然后,您将遇到一个直接的,或多或少的约束满足问题。(请注意,我已根据其他假设简化了条件。)(σmi,σmj,σmk)S(i>jj>k)
Dave Clarke

顺便说一句:这个问题的动机是什么?
戴夫·克拉克2012年

@DaveClarke参见我的编辑。这个问题是从我与实验室的其他学生讨论的有关调度问题的讨论中抽象出来的。基本上,您的想法是您有很多工作,其中一些工作必须按一定顺序执行。但是,您可能不希望出于某些微妙的原因而希望在某个作业之间按顺序安排一些作业。
Patrick87

3
为什么是西格玛?只需定义。嵌套的下标使小耶稣哭泣。Σ={1,2,,n}
JeffE

@JeffE老实说,我只是喜欢玩方程式游戏的借口。对于编写可编译为小的代码,有些内在的满足感。老兄别从我那儿拿走东西。σ
Patrick87

Answers:


3

这是一个幼稚的算法。它最终依赖于蛮力,但有时可能还不错。

每个约束 包括两个合点;我们称它们为Type-,和type-,。依赖于的事实,每个型约束可以等效地写为析取。(σmi,σmj,σmk)Si<k¬(i<j<k)Ai<kB¬(i<j<k)Bi>jj>kij,jk

  1. 收集所有型约束。将此。检查它们是否一致,即这是排序的线性化。使用拓扑排序,这会在约束数量上花费。AΘO(|S|)
  2. 对于型约束中的每个析取项,检查其是否与偏序一致。如果不一致,请删除析取符。如果两个析取符都与不一致,则失败。只要删除了一个型约束,就将其余的添加到。此步骤为。BΘΘBΘO(|S|2)
  3. 现在,有一个明显的算法可以找到一个解决方案,即考虑型析取对的所有组合并测试它们与的一致性,但这显然在是指数的。。 一种提高性能的启发式方法是将型析取对视为树的分支-一对形成根,第二对为子代,第三对为子代,依此类推。使用此数据结构,可以通过以深度优先的方式遍历树来找到解决方案。每次添加新约束(使用分支上的标签)时,都可以检查一致性。可以修剪不一致的子树。BΘ|S|
    B
  4. 如果到达树的叶子,则我们具有一组一致的约束,其中包括所有类型约束和一个类型约束的析取。线性化结果以获得所需的顺序。AB

我的首选方法实际上是将其编码为一组约束,并使用约束求解器(例如Choco)。我将在范围内引入整数变量,并要求它们都是不同的。然后,我将上面的每个约束直接编码为约束,然后让Choco处理。x i [ 0 n 1 ]nxi[0,n1]


1

这是部分答案:

如果删除每个三元组上的约束,那么您的问题将成为的非弹性之间的问题,并且没有已知的有效算法可解决此类问题。但是由于约束,它可能会强制采用一些不错的结构,可以利用该结构找到问题的多项式时间算法。N P i < ki<kNPi<k

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.