¿Cómo dividir un conjunto en un número dado de subconjuntos disjuntos sujetos a algunas condiciones?

11

Me dan un conjunto A{1,,k} , un número entero sk y números enteros no negativos aij . Mi problema es encontrar s subconjuntos disjuntos Sj de {1,,k} modo que:

  1. j=1sSj=A ; y
  2. |Sj|aij para todos iSj y j=1,,s .

¿Cómo resolver este problema? ¿Es difícil encontrar una solución factible?

Creo que no es fácil resolver el problema porque probé un procedimiento que comienza con algunos j{1,,n} y asigna i{1,,k} hasta el número de i asignaron a j son mayores que aij para algunos i asignado. Pero esto no es correcto porque podría quedarme de alguna i que no podría asignarse a ninguna j (debido a su aij que no podría satisfacerse).

El método de fuerza bruta, cuando tengo que generar todos los subconjuntos de A y probar cada uno, funciona para mí ( k=8,n=3 ) pero muy ineficiente.

drzbir
fuente
Compruebe si la edición corresponde a la pregunta que desea hacer. Además, ¿de dónde viene ? ¿Es una constante fija (no parte de la entrada, pero está fijada para siempre) o es parte de la entrada? Finalmente, ¿estás buscando una solución práctica? o estás buscando la complejidad teórica de este problema? Si es lo primero, ¿ha intentado usar programación lineal entera? amax
DW

Respuestas:

10

Este problema es NP-duro por reducción de Vertex Cover.

En el problema de la cubierta de vértices, se nos da un gráfico y un número , y nuestra tarea es determinar si hay algún subconjunto de a lo sumo vértices de modo que cada borde en sea ​​incidente en al menos un vértice en . (Equivalentemente: ¿Es posible matar cada borde en eliminando a lo sumo vértices?)G=(V,E)rUrVEUGr

Primero, dividir en subconjuntos disjuntos de es equivalente a asignar a cada elemento en exactamente una de posibles etiquetas. La idea básica de la reducción es crear una etiqueta para cada vértice en , y "permitir" que a cada borde se le asigne solo una de las dos etiquetas correspondientes a sus puntos finales, en el siguiente sentido: asignar a un borde un correspondiente la etiqueta no introduce ninguna restricción (genuina) sobre qué otros bordes pueden asignarse a la misma etiqueta, mientras que asignar un borde a una etiqueta no correspondiente evita que a cualquier otro borde se le asigne la misma etiqueta, lo que por supuesto tiene el efecto de subir el número de distintas etiquetas requeridas.AsAsSjvjV

Para construir una instancia de su problema a partir de una instancia de Vertex Cover:(A,a,s)(G,r)

  1. Establezca enY crear un elemento en para cada borde en . (Estos pares pueden considerarse como los enteros ; cualquier biyección entre ellos servirá).k|E|(i,j)AvivjE1,,k
  2. Establezca ensi o ; de lo contrario, establezca en 1.a(b,c),d|E|d=bd=ca(b,c),d
  3. Establecer .s=r

Si es una instancia SÍ de Vertex Cover, entonces es fácil ver que la instancia recién construida de su problema también es una instancia SÍ: simplemente elija las etiquetas correspondientes a los vértices en cualquier solución , y para cada arista asigne el elemento correspondiente cualquiera de las etiquetas o (elija arbitrariamente si se seleccionaron ambas etiquetas). Esta solución utiliza subconjuntos de , y es válida porque los únicos en vigor son los correspondientes(G,r)SjvjUvbvcE(b,c)ASbScsaijetiquetas, que tienen el efecto (no) de prevenir más deA los bordes se les asigna la misma etiqueta.|E|

Queda por demostrar que una instancia SÍ de su problema implica que el original es una instancia SÍ de Vertex Cover. Esto es un poco más complicado, ya que una solución válida a en general puede asignar un borde una etiqueta no correspondiente , es decir, , lo que significa que no podemos necesariamente "leer off" una cubierta vértice válido a partir de una solución válida .X=(A,a,s)(G,r)YX(i,j)Smm{i,j}UY

Sin embargo, asignar una etiqueta no correspondiente tiene un alto costo que limita severamente la estructura de la solución: cada vez que se le asigna un borde dicha etiqueta , con , el hecho que asegura que debe ser el único borde asignado a esta etiqueta. Entonces, en cualquier solución contenga un borde etiquetado de manera no correspondiente , podríamos construir una solución alternativa siguiente manera:(i,j)Smm{i,j}a(i,j),m=1Y(i,j)SmY

  1. Elija arbitrariamente la nueva etiqueta para como o .Sz(i,j)SiSj
  2. Asigne esta nueva etiqueta. Si esto da como resultado una solución no válida, debe ser porque exactamente a otro borde , ya se le había asignado la etiqueta . En ese caso, establezca y vaya al paso 1.(i,j)(i,j)z{i,j}Sz(i,j)=(i,j)

El algoritmo anterior debe terminar de una de dos maneras: se encuentra una nueva etiqueta que no introduce contradicción o se encuentra un ciclo completo de vértices. En el primer caso, se encuentra una nueva solución válida con conjuntos , mientras que en el último caso se encuentra una nueva solución válida con conjuntos ; De cualquier manera, hemos construido una nueva solución válida con al menos un borde más asignado a una etiqueta correspondiente . Después de repetir todo este proceso a lo sumoEn ocasiones, habremos producido una solución válida partir de la cual se puede leer una solución al problema original de Vertex Cover .Szs1s|E|Y

Esta construcción es claramente un tiempo polinomial, por lo que se deduce que su problema es NP-hard.

j_random_hacker
fuente
Gracias por tu ayuda. ¿Tienes alguna idea de cómo se puede resolver (aproximadamente) este problema? (Como, por ejemplo, ¿puedo usar técnicas para resolver el problema de la cubierta de vértices?) Intenté un enfoque ambicioso pero, a veces, no logra dar una solución factible. (La forma en que elijo hace que el enfoque codicioso falle donde podría existir una solución.)Sj
drzbir
Bueno, se espera que un enfoque codicioso a veces no pueda dar una solución factible, ya que si siempre lo hiciera, estaría resolviendo un problema NP-hard en tiempo polivinílico ;-) Recuerde que no es necesariamente incorrecto si no puede encuentre una solución: puede ser que no exista una solución factible.
j_random_hacker 01 de
En cuanto a las técnicas de solución, una que me gusta se llama haz de búsqueda. Esto es básicamente un tipo de bifurcación que "olvida" soluciones parciales suficientemente malas para limitar su uso de memoria. (B & B es en sí una muy buena aproximación, ya veces resuelve problemas rápidamente, y es un poco más simple que la búsqueda de haz por lo que es digno de un tiro - pero ya que es un método exacto, que por supuesto puede adoptar miles de años en algunos casos.)
j_random_hacker
(Todo lo siguiente se aplica también a la búsqueda de haces así como a los B & B). B & B es una técnica muy general. La clave es explotar los detalles específicos del problema para organizar las decisiones que tome de modo que, en la medida de lo posible, las malas decisiones (es decir, las decisiones que no conducen a soluciones viables) se tomen temprano en el árbol de búsqueda. (Estas decisiones se tomarán en algún lugar , y cada nivel más profundo que se haga duplica la cantidad de veces que se toman). Para su problema, sugeriría primero clasificar los elementos en en orden decreciente de "maldad", donde. ..A
j_random_hacker 01 de
... la maldad del elemento podría ser, por ejemplo, el mínimo de sobre todo , rompiendo los lazos de segunda mínimo, entonces el tercer mínima, etc. En términos generales, el elemento "peor" será el elemento que restringe más severamente cualquier conjunto al que se agrega. En cada nodo en la profundidad del árbol de búsqueda, tendrá una solución parcial en la que los primeros (y, por lo tanto, "peores") elementos ya se han asignado a conjuntos; necesitará elegir a cuál de los conjuntos asignará el elemento th: es decir, necesitará hasta llamadas recursivas. ("Hasta" porque espero que tengamos, ...iaijjddn(d+1)n
j_random_hacker