Ordenar elementos para que algunos elementos no se interpongan entre otros.


10

Dado un entero y un conjunto de tripletes de enteros distintos encuentre un algoritmo que encuentre una permutación del conjunto tal que o determina correctamente que no existe tal permutación. Menos formalmente, queremos reordenar los números del 1 al ; cada Triple en indica que debe aparecer antes de en el nuevo orden, pero no debe aparecer entreS { ( i , j , k ) 1 i , j , k n , i j , j k , i k } , π { 1 , 2 , ... , n } ( i , j , k ) Sn

S{(i,j,k)1i,j,kn,ij,jk,ik},
π{1,2,,n}n ( i , j , k ) S i k j i
(i,j,k)S(π(j)<π(i)<π(k))  (π(i)<π(k)<π(j))
n(i,j,k)Sikjiy .k

Ejemplo 1

Supongamos que y . LuegoS = { ( 1 , 2 , 3 ) , ( 2 , 3 , 4 ) }n=5S={(1,2,3),(2,3,4)}

  • π=(5,4,3,2,1) no es una permutación válida, porque , pero .π ( 1 ) > π ( 3 )(1,2,3)Sπ(1)>π(3)

  • π=(1,2,4,5,3) no es una permutación válida, porque pero .π ( 1 ) < π ( 3 ) < π ( 5 )(1,2,3)Sπ(1)<π(3)<π(5)

  • (2,4,1,3,5) es una permutación válida.

Ejemplo 2

Si y , no hay permutación válida. Del mismo modo, no hay permutación válida si y ( Creo que puede haber cometido un error aquí).n=5S={(1,2,3),(2,1,3)}n=5S={(1,2,3),(3,4,5),(2,5,3),(2,1,4)}

Bonificación: ¿Qué propiedades de determinan si existe una solución factible?S


¿Por qué no reformular la segunda condición como ? Entonces tiene un problema de satisfacción de restricciones más o menos sencillo. (Tenga en cuenta que he simplificado la condición en función de los otros supuestos).(σmi,σmj,σmk)S(i>jj>k)
Dave Clarke

Por cierto: ¿Cuál es la motivación para este problema?
Dave Clarke el

@DaveClarke Vea mi edición. Este problema se ha extraído de una discusión en torno a un problema de programación que estaba discutiendo con otros estudiantes en el laboratorio. Básicamente, la idea es que tenga muchos trabajos, algunos de los cuales deben ejecutarse en un orden determinado. Sin embargo, no desea que se programen algunos trabajos entre trabajos en una secuencia, posiblemente por razones muy sutiles.
Patrick87

3
¿Por qué las sigmas? Simplemente defina . Los subíndices anidados hacen llorar al niño Jesús. Σ={1,2,,n}
JeffE

@JeffE Honestamente, me gusta la excusa para jugar con la ecuación. Hay algo simplemente visceralmente satisfactorio sobre escribir código que se compila a esos pequeños 's. No me quites eso , hombre. σ
Patrick87

Respuestas:


3

Aquí hay un algoritmo ingenuo. En última instancia, depende de la fuerza bruta, pero a veces puede funcionar bien.

Cada restricción consta de dos conjuntos; llamémoslos tipo- , , y tipo- , . Cada restricción de tipo se puede escribir de manera equivalente como una disyunción , basándose en el hecho de que .A i < k B ¬ ( i < j < k ) B i > j j > k i j , j k(σmi,σmj,σmk)Si<k¬(i<j<k)Ai<kB¬(i<j<k)Bi>jj>kij,jk

  1. Recoge todas las restricciones de tipoLlama a esto . Compruebe si son consistentes, es decir, que se trata de una linealización de la ordenación. Esto toma -time en el número de restricciones usando la ordenación topológica.Θ O ( | S | )AΘO(|S|)
  2. Para cada uno de los disyuntos en la restricción de tipo , verifique si es consistente con el orden parcial . Si no es consistente, elimine la disyunción. Si ambos disjuntos son inconsistentes con , entonces falla. Siempre que se elimine una restricción de tipo , agregue la restante a . Este paso es .Θ Θ B Θ O ( | S | 2 )BΘΘBΘO(|S|2)
  3. Ahora hay un algoritmo obvio para encontrar una solución, a saber, considerar todas las combinaciones de los pares de disyunción tipo y probar su consistencia con , pero esto es claramente exponencial en. Una heurística para mejorar el rendimiento sería tratar los pares de disyunción tipo como las ramas de un árbol: un par forma la raíz, sus hijos son dados por el segundo par, sus hijos por el tercero y así sucesivamente. Usando esta estructura de datos, se encuentra una solución atravesando el árbol de una manera profunda primero. Cada vez que se agrega una nueva restricción (usando la etiqueta en una rama), se puede verificar la consistencia. Los subárboles inconsistentes pueden ser podados.Θ | S |BΘ|S|
    B
  4. Si se alcanza una hoja del árbol, entonces tenemos un conjunto consistente de restricciones que consisten en todas las restricciones de tipo y una disyunción de las restricciones de tipoLinealice el resultado para obtener el orden deseado.BAB

Mi enfoque preferido sería codificarlo en un conjunto de restricciones y usar un solucionador de restricciones como Choco. Introduciría variables enteras en el rango y requeriría que todas fueran distintas. Luego codificaría cada una de las restricciones anteriores directamente como restricciones y luego dejaría que Choco haga su negocio.x i [ 0 , n - 1 ]nxi[0,n1]


1

Aquí hay una respuesta parcial:

Si elimina la restricción en cada triple, entonces su problema se convierte en el problema de No-Betweeness, que es completo y no se conocen algoritmos eficientes para tales problemas. Pero con la restricción , puede forzar alguna estructura agradable que puede ser explotada para encontrar un algoritmo de tiempo polinómico para su problema.N P i < ki<kNPi<k

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.