Nombre de este problema de reorganización / clasificación?

10

Se le da una matriz de longitud . Cada elemento de la matriz pertenece a una de las clasesSe supone que debe reorganizar la matriz utilizando un número mínimo de operaciones de intercambio para que todos los elementos de la misma clase estén siempre agrupados, es decir, que formen una submatriz contigua. Por ejemplo: Quedan otros tres arreglos válidos.KnK

[2,1,3,3,2,2][2,2,2,1,3,3], or[2,1,3,3,2,2][1,2,2,2,3,3], or[2,1,3,3,2,2][3,3,2,2,2,1].

¿Cómo se llama este problema en la literatura? ¿Hay un algoritmo eficiente para ello?

Marko Bukal
fuente
1
No estoy seguro de que este problema tenga un nombre, aunque ciertamente es posible. No todos los problemas concebibles tienen nombres.
Yuval Filmus
2
En la práctica, esto se llamaría agrupación . No conozco la terminología en algoritmos clásicos. (¡Sin duda es un problema interesante y potencialmente difícil! Minimizar el número de intercambios tiene la sensación de "encontrar la mejor permutación de grupos", que a su vez se siente NP-hard-ish.)
Raphael
Bueno chicos, gracias por ahora. Por supuesto, estoy interesado en la solución del problema, pero pensé que ya estaba estudiado, por lo que solicité una referencia.
Marko Bukal

Respuestas:

6

Nota: es una prueba de dureza, y creo que hay algoritmos prácticos como la programación de enteros, etc.

Dada una instancia de BIN_PACKING donde desea empaquetar los números en bins de tamaño , y se garantiza que , entonces podríamos diseñar una instancia de su problema de la siguiente manera:n 1 , ... , n K L m 1 , ... , m Ln i = m j = NKn1,,nKLm1,,mLni=mj=N

  • Hay clases ;K+(N+1)(L1)
  • Las primeras clases tienen tamaño respectivamente, y cada una de las clases de descanso tiene tamaño ;;Kn1,,nKN+1
  • La matriz se divide en ranuras de tamaño: donde cada ranura de tamaño está lleno clases , ordenadas contiguamente, y el resto está ordenado arbitrariamente.
    m1,(N+1)2,m2,(N+1)2,m3,,(N+1)2,mL
    (N+1)2N+1

Ahora, una observación clave es que no tiene sentido mantener al menos una clase en una ranura sin mover y mover otras (porque no cambiará el tamaño de un 'bin'). Por lo que el embalaje bin original está disponible si y sólo si el número mínimo de permutas no es mayor que . Dado que se sabe que BIN-PACKING es NP-completo , su problema es NP-hard.(N+1)2N

Willard Zhan
fuente
¡Esto es hermoso! En caso de que otros también hayan tenido problemas: (1) swaps siempre es suficiente para crear cualquier "empaque bin" que queramos en las ranuras de tamaño , ya que un solo intercambio es suficiente para mover un elemento a su ubicación final sin molestar a los elementos ya colocados. (2) Solo hay 2 cosas posibles que podríamos intentar hacer con la longitud- "zonas de amortiguamiento" entre "contenedores": mover una clase completa de longitud- en cualquier extremo a otro lado (pero esto ya cuesta intercambios, por lo que no podemos), o "deslizar" todo una posición hacia la izquierda o hacia la derecha (pero esto implica "deslizarse" cada uno ...m 1 , , m L ( N + 1 ) 2 ( N + 1 ) N + 1Nm1,,mL(N+1)2(N+1)N+1
j_random_hacker
... clase en el búfer a la izquierda o a la derecha una posición, y aunque podemos hacerlo con un solo intercambio por clase, hay clases en la zona, por lo que se necesitan al menos swaps, así que una vez más: imposible). Este punto es necesario para argumentar que una solución al problema del OP con el costo implica un embalaje válido. (3) Debido a que el embalaje bin es fuertemente NP-completo, la habitual "no-no" de la creación de un número de aparatos (en este caso, elementos de la matriz) proporcionales a los números codificados en la entrada no se aplica aquí :)N + 1 NN+1N+1N
j_random_hacker
1

También sospecho que esto es NP-hard, pero en ausencia de una idea para una prueba, aquí hay un par de límites inferiores rápidamente computables que podrían ser útiles para verificar la optimización de una solución heurística, o podar una búsqueda de bifurcación .

Deje que la clase contenga elementos. En cualquier solución válida, la clase debe comenzar en alguna posición . Por lo tanto, podemos calcular un límite inferior sobre el costo de "arreglar" la clase probando todas las posibles posiciones iniciales , contando el número de elementos que no son en el bloque longitud- que comienza en la posición (cada una de estas posiciones requerirá un intercambio), y tomando el mínimo. Este se puede calcular para cualquier en usando un enfoque de ventana deslizante, paran i i j L i i j i n i j L i i O ( n ) O ( K n )iniijLiijinijLiiO(n)O(Kn)tiempo en general. Dos límites inferiores generales son entonces:

  1. Tome el máximo sobre todo . Apretado para , probablemente muy débil para grande . K = 2 KLiK=2K
  2. Suma todo y divide entre 2, redondeando. Esto es válido porque cualquier intercambio puede arreglar como máximo 2 posiciones incorrectas.Li

En su ejemplo, estos límites dan 1 (0.5 puede redondearse en el último caso), que por supuesto es flojo.

j_random_hacker
fuente