¿Cómo minimizar la cardinalidad de un conjunto y particiones disjuntas sujetas a restricciones en el tiempo polinómico?

8

El verdadero problema al que me enfrento es el siguiente.

INSTANCIA : tengo juegosN:={1,,n} y K:={1,,k} y matriz aij>0 para todos iK y jN.

PREGUNTA : necesito encontrar un subconjuntoS de N de tamaño lo más pequeño posible y particione el conjunto K dentro |S| conjuntos disjuntos Kj cuya unión es igual K tal que para todos jS, Yo tengo

jSjjaijaij1,
para todo .iKj

Ejemplo:

Dado y la matriz n=k=3

[0.62.71.21.32.60.81.50.40.6].

En este ejemplo, debería ser igual a y y .SS={1,2}K1={3}K2={1,2}

Noté dos hechos:

  • Si existe alguna tal que para todo entonces y ; yjNaij1iKS={j}Kj=K
  • Si existe alguna tal que entonces .iKaij<1S=

Mi pregunta : ¿es posible resolver este problema de optimización en tiempo polinómico (al menos con algoritmo de aproximación)?

Lo primero que intenté hacer es transformarlo en un problema conocido y luego apliqué un algoritmo conocido para eso. Pensé en transformarlo en una tapa de conjunto o en un contenedor de basura, pero fallé y tampoco creo que esto sea interesante.


El problema que intenté formular.

Tengo conjuntos y y la matriz para todo y . Además, tengo conjuntos disjuntos para cada , (agregué como entradas porque de lo contrario no podría formularlo).N:={1,,n}K:={1,,k}aij>0iKjNnKjKjNKj

Finalmente, obtengo esto:

minimizeS|S|subject tojSjjaijaij1,jS,iKj,SN.

Gracias.

drzbir
fuente
¿Has intentado reformular como ILP usando variables binarias ? Su objetivo cambia a min con un cambio similar en la restricción. Un solucionador de ILP listo para usar puede manejarlo bien. xjxj
Nicholas Mancuso
¿Pero creo que eso no me daría un algoritmo de tiempo polinómico?
drzbir
Quizás en teoría, pero no en la práctica. Los solucionadores modernos como CPLEX son increíblemente buenos para encontrar soluciones óptimas en un tiempo relativamente corto gracias a las heurísticas de ramificación y unión y otras.
Nicholas Mancuso
¿Son los todos ? Si es así, entonces creo que la formulación de su "problema real" tiene un problema, ya que se optimiza trivialmente al permitir que sea ​​cualquier conjunto único : esto hace que la suma en el LHS de su función objetivo sea 0 .aij1S{j}
j_random_hacker
No todos los son mayores que . aij1
drzbir

Respuestas:

4

Incluso la versión de decisión de este problema, en la que tratamos de determinar simplemente si existe alguna solución factible, es NP-difícil por reducción de Exact Cover . (La versión de optimización, donde buscamos una solución factible que minimice , es claramente al menos tan difícil como esta).|S|

La matriz de una sola fila y una sola columna que contiene el valor 0.5 es un ejemplo de una entrada para la cual no hay una solución factible. Aquí está otro:

[0.243.1350.6].

Creación de un gadget "Elija como máximo uno"

Primero, observe que si el valor máximo en alguna fila es , y esta fila contiene (al menos) dos copias de , digamos en y , , entonces no puede contener tanto como , ya que si lo hiciera, entonces debería surgir uno de los siguientes dos casos, cada uno de los cuales conduce a una contradicción:aix>0xaijaijjjSjj

  1. iKjKj : supongamos que wlog es . Pero entonces , contradiciendo el requisito de que .iKjΣmS,mjaimaij=x=aijΣmS,mjaimaij1
  2. iKjKj : Entonces supongamos que . Pero entonces , y dado que es máximo en la fila , el más alto que podría ser claramente , por lo que debemos estar violando la misma desigualdad que antes.iKp,p{j,j}ΣmS,mpaimaij+aij=2xxiaipx

De este modo podemos elegir un valor máximo que es con seguridad mayor que la suma de todos los valores que no son máximas en la fila, y el uso de copias de este valor máximo para hacer cumplir que a lo sumo una de esas columnas se incluye en .S

Podemos convertir esta restricción de "elegir como máximo una" en una restricción de "elegir exactamente una" usando cualquier valor positivo menor que 1 como el valor "no máximo". Esto se debe a que cada fila pertenece a alguna parte de la partición de la fila, y si , el RHS de la desigualdad se vuelve negativo para la fila , por lo que no hay forma de satisfacerlo: por lo tanto, al menos un debe ser forzado a modo que .iKjaij<1ijSaij1

Por lo tanto, para asegurarse de que exactamente una de las columnas en algún conjunto sea ​​forzada a , cree una fila siguiente manera:TNSai

  • Set para cada .aij=n+1jT
  • Establezca para cada dos .aij=0.5j

Por lo tanto, la reducción de Exact Cover es sencilla: hay una fila para cada elemento, una columna para cada conjunto, con siempre que el conjunto incluya el elemento y contrario. Ambas direcciones ("La instancia EC de entrada es una instancia YES una instancia construida del problema de OP es una instancia YES", y "La instancia construida del problema de OP es una instancia YES una instancia EC de entrada es una instancia YES") están claros.aij=n+1jiaij=0.5

j_random_hacker
fuente
El ejemplo que diste creo que tiene una solución de . 2×2S={2}
drzbir
Tengo y . Entonces mi desigualdad es para . Porque la desigualdad debe ser válida para todo . S={2}K2=K={1,2}0ai21iK2={1,2}iKj
drzbir
Tienes razón, lo siento. Lo arreglaré ahora.
j_random_hacker
He escrito este problema como un programa entero y lo resolví. Ahora, necesito resolverlo con un algoritmo codicioso (mejor, un algoritmo con garantías de rendimiento). Como sugirió, busqué el salto de portada exacto para encontrar ideas sobre cómo diseñar un buen algoritmo para esto. ¿Tienes alguna idea?
drzbir
Es NP-hard, por lo que casi con certeza no existe un algoritmo de poli-tiempo. Intentaría verificar todas las columnas individuales, todos los pares de columnas, todos los triples, etc. hasta que encuentre un conjunto satisfactorio. El subproblema que necesita resolver para cada fila (es decir, decidir qué elemento en elegir para esta fila) es fácil. S
j_random_hacker