He estado pensando en el siguiente problema por un tiempo, y no he encontrado una solución polinómica para él. Solo de origen bruto. He estado tratando de reducir un problema NP-Complete en él también sin éxito.
Aquí está el problema :
Tiene un conjunto ordenado de pares enteros positivos.
La siguiente operación se puede aplicar a un par: Swap(pair)
. Intercambia los elementos del par, por lo que se convertirá en
Cuando se intercambia un par en el conjunto, el conjunto se ordena automáticamente de nuevo (el par intercambiado está fuera de lugar y se moverá a su lugar en el conjunto).
El problema consiste en ver si hay una secuencia que, comenzando en algún par, intercambie todo el conjunto, con la siguiente condición:
Después de intercambiar un par, el siguiente par que se debe intercambiar debe ser el par sucesor o el par predecesor del conjunto.
Sería genial encontrar una solución de tiempo polinómico para este problema, o una reducción de un problema NP-Complete en él.
Nota:
ya es un problema de decisión. No quiero saber cuál es la secuencia: solo si existe una secuencia.
Ejemplo de cómo se ordena el conjunto después de cambiar un par
Si cambio el primer par, se convierte en: , y después de ordenar el conjunto (colocando el par ordenado en su nueva posición), tenemos:
Luego tengo que intercambiar el par (predecesor) o (sucesor), y repetir el proceso hasta que se intercambien todos los pares (si es posible).( 7 , 8 )
Importante:
No puede intercambiar un par ya intercambiado.
Si hay una secuencia de operaciones de 'intercambio', entonces todos los pares deben renombrarse una vez y solo una vez.
Ejemplo donde no es posible intercambiar todos los pares
( 1 , 4 ) ( 3 , 2 ) ( 5 , 5 )
fuente
Respuestas:
... Busqué algunos patrones para construir una reducción de un problema de NPC, pero no encontré una forma de representar un "flujo" con un "tenedor" ...
Entonces (después de un poco de trabajo) este es un algoritmo polinómico ...
ALGORITMO
La lista de inicio puede verse como una matriz de " agujeros " consecutivos . Para cada par inicial ( a j , b j ) , coloque el " elemento " b j en el hoyo número a j . Cada par puede verse como un borde dirigido desde la posición a j hasta la posición b j . Un movimiento consiste en elegir un elemento b j en la posición a j y moverlo a su posición de destino b jnorte∗ 2 ( aj, bj) sij unaj unaj sij sij unaj sij (el agujero de destino se convierte en una clavija inamovible ). Eliminamos el borde y procedemos a elegir el siguiente movimiento que comenzará desde uno de los dos elementos alcanzables más cercanos desde la posición b j (solo se permiten agujeros entre b j y b k ). Debemos encontrar una secuencia de N movimientos consecutivos.sik sij sij sik norte
Para cada considere b j (en la posición de la matriz a j ) como el elemento inicial s t a r t .( aj, bj) sij unaj start
Para cada considere a k como el elemento final e n d (el borde desde la posición a k hasta la posición b k será el borde final).(ak,bk),ak≠aj ak end ak bk
Cuando realiza un movimiento, fija una clavija en la posición y la matriz se divide en dos particiones L (izquierda) y R (derecha) y la única forma de ir de L a R (o de R a L ) es usando un borde que salta a través de la clavija. Conjuntobj L R L R R L
Casos:
A) si entonces una de las dos particiones se volverá inalcanzable, deténgase|flow|>1
Ahora suponga que , es decir, e n d ∈ Rend>bj end∈R
B) si entonces hay un borde adicional de izquierda a derecha, debe ir a la izquierda (elija el elemento más cercano de L ), de lo contrario nunca llegará a e n dflow=1 L end
C) si entonces hay un borde adicional de derecha a izquierda y cualquier nodo que elija nunca llegará a e n d , pareflow=−1 end
D) si debe ir a la derecha (elija el elemento más cercano de R ), de lo contrario nunca llegará a e n dflow=0 R end
Si ( e n d ∈ L ), B, C, D están invertidos.end<bj end∈L
NOTA: cuando se mueve hacia la izquierda o hacia la derecha, debe considerar como una clavija. Por ejemplo, si debe ir a la derecha, pero el elemento más cercano en R es e n d, entonces el movimiento es imposible (y debe proceder con otro par ( s t a r t , e n d ) )end R end (start,end)
Aplica la misma resonancia en cada movimiento.
COMPLEJIDAD
Los flujos sobre cada orificio pueden calcularse previamente en O (N) y reutilizarse en cada exploración.
Los bucles son:
No se realizan elecciones durante el cálculo, por lo que la complejidad del algoritmo esO(N3)
CÓDIGO
Esta es una implementación funcional de Java del algoritmo:
fuente
Esta no es una solución, sino una reformulación que evita la mención explícita de las operaciones de intercambio y clasificación. Comience ordenando toda la lista combinada de nombres de archivo y sus versiones intercambiadas, e identifique cada nombre de archivo con su índice en esa lista. Luego, dos archivos son vecinos si todos los nombres de archivo anteriores entre ellos ya se han destruido, y si ninguno de los nuevos nombres de archivo entre ellos se ha creado todavía. El problema reformulado es el siguiente:
fuente