Encontré este problema y estoy luchando por encontrar una manera de abordarlo. Cualquier idea sería muy apreciada!
Supongamos que se nos da una matriz , por ejemplo,
Sin probar cada permutación, encuentre un orden de las columnas que maximice el número de filas para las cuales el primer elemento distinto de cero es .
Para el ejemplo anterior, uno de esos ordenamientos (¡no es único!) Es , es decir,
Aquí, para de filas, el primer elemento distinto de cero es .
Respuestas:
Este problema, que llamaré CO para ordenar columnas, es NP-hard . Aquí hay una reducción del problema NP-hard Vertex Cover (VC):
Formas de decisión de problemas de VC y CO
Deje que la instancia de VC de entrada sea(V,E,k) . Representa la pregunta: "Dada la gráfica (V,E) , ¿es posible elegir un conjunto de a lo sumo k vértices de V modo que cada borde en E incida en al menos un vértice elegido?" Construiremos una instancia (A,k′) de CO que represente la pregunta: "Dada la matriz A con elementos en {−1,0,1} , ¿es posible permutar las columnas de A modo que un 1 aparezca antes de un -1 en al menos k′ filas? "Estos dos problemas se expresan en forma de problema de decisión , por lo que la respuesta a cada uno es SÍ o NO: hablando formalmente , esta forma de problema es NP-complete (o no). No es demasiado difícil ver que la forma de problema de optimización más natural establecida en la pregunta del OP es más o menos equivalente en términos de complejidad: búsqueda binaria en el umbral El parámetro se puede utilizar para resolver el problema de optimización utilizando un solucionador de problemas de decisión, mientras que una sola invocación de un solucionador de problemas de optimización, seguida de una única comparación, es suficiente para resolver el problema de decisión.
Construir una instancia de CO a partir de una instancia de VC
Dejen=|V| y m=|E| . Construiremos una matriz A con (n+1)m+n filas y n+1 columnas. Las filas superiores (n+1)m estarán formadas por m bloques de n+1 filas cada una, con cada bloque representando un borde que necesita ser cubierto . El fondo n las filas contienen "indicadores" de vértice, lo que hará que una columna (correspondiente a un vértice) incurra en un costo fijo si se incluye en el lado izquierdo de la solución de CO (correspondiente a un vértice que se incluye en la cubierta del vértice de la Solución de VC).
Para cada vérticevi , cree una columna en la que:
Cree una columna "cerca" más que consista en(n+1)m copias de -1, seguido de n copias de +1.
Finalmente, establezca el umbralk′ para la instancia de CO construida: (n+1)m+n−k . En otras palabras, permitimos a lo sumo k filas en las que aparece un -1 antes de un +1. Llamemos a este número de filas infractoras el "costo" de una solución de CO.
Prueba
La correspondencia entre una solución para la instancia de CO y un conjunto de vértices en la instancia de VC original es: cada columna a la izquierda de la cerca corresponde a un vértice que está en el conjunto, y cada columna a la derecha de la cerca corresponde a un vértice que no lo es.
Finalmente, está claro que la instancia de CO puede construirse en tiempo polinómico a partir de la instancia de VC, lo que significa que si existiera un algoritmo de tiempo polinomial para resolver CO, cualquier instancia de VC también podría resolverse en tiempo polinomial construyendo primero una instancia de CO como se describe arriba y luego resolverlo. Como VC es NP-hard, CO también lo es.
fuente
Luego tienes que hacer una exploración completa de la combinatoria usando iterativamente la función pick:
Después de cada selección, puede hacer una simplificación para posiblemente reducir el número de posibilidades para explorar. Sugiero explorar con avidez comenzando con la columna que tiene menos -1, por lo que puede llegar a un límite inferior haciendo un criterio de detención.
En el ejemplo dado, la primera simplificación da (como explicó Pål GD en el comentario)
Sin embargo, la simplificación aún ahorra aproximadamente la mitad de los pasos de exploración. Y este tipo de matriz se puede dividir en varias submatrices independientes.
fuente