El problema es el siguiente:
Tenemos una matriz / cuadrícula bidimensional de números, cada uno representa algún "beneficio" o "beneficio". También tenemos dos enteros fijos y (para "ancho" y "altura"). Y un entero fijo .
Ahora deseamos superponer rectángulos de dimensiones en la cuadrícula de modo que se maximice la suma total de los valores de las celdas en estos rectángulos.
La siguiente imagen es un ejemplo de una rejilla bidimensional con dos de tales rectángulos superpuestos en él (la imagen no demuestra la solución óptima, sólo una posible superposición donde y )
Los rectángulos no pueden cruzarse (de lo contrario, solo tendríamos que encontrar la posición óptima para un rectángulo y luego colocar todos los rectángulos en esa posición).
En el ejemplo anterior, la suma total de valores en las celdas sería
¿Es esto similar a algún problema conocido en la optimización combinatoria? para que pueda comenzar a leer un poco e intentar encontrar formas de resolverlo.
Algunos antecedentes más para los interesados:
Hasta ahora, las únicas ideas que tenía son un algoritmo codicioso (que encontraría la mejor ubicación para el primer rectángulo, luego encontraría la loctaión no superpuesta para el segundo rectángulo, etc.) o algunos metaheurísticos como los algoritmos genéticos.
En realidad, deseo resolver este problema con una cuadrícula que tiene alrededor de un millón de celdas y decenas de miles (o incluso cientos de miles) de rectángulos, aunque no es necesario resolverlo en poco tiempo (es decir, sería aceptable para el algoritmo puede llevar horas o incluso días.) No espero una solución exacta, pero quiero obtener una que sea lo mejor posible, dadas estas limitaciones.
¡Salud!
fuente
Respuestas:
Mi última formulación tenía un defecto fatal que requeriría una cantidad exponencial de nodos de "restricción".
Otra formulación gráfica natural del problema sería crear un gráfico donde cada vértice represente un rectángulo con . Cualquier par de rectángulos superpuestos tiene un borde en este gráfico. Al resolver un conjunto independiente de ponderación máxima de tamaño , tenemos una solución a su problema original. Existen muchos buenos algoritmos de heurística y aproximación para esto.r wr r,r′ k=n
fuente
Puede formular esto como una instancia de programación lineal de enteros gigantes (ILP) y luego aplicar un solucionador ILP estándar (lp_solve, CPLEX, etc.). Le darán la mejor solución que puedan encontrar. Dado el tamaño de la instancia de su problema, no sé si será lo suficientemente eficiente, pero sería fácil intentarlo.
Aquí está la formulación de ILP. Tenemos una variable cero o uno para cada posible rectángulo , con la interpretación prevista de que significa que incluye el rectángulo en su conjunto y significa que no lo incluye. Desea maximizar la función objetivo (donde es el beneficio del rectángulo ), sujeto a la restricción de que que no se superponen dos rectángulos. La última restricción se puede expresar como una desigualdad lineal al requerir para todos los pares de rectángulosxr r xr=1 r xr=0 ∑rcrxr cr r ∑rxr=n xr+xs≤1 r,s Esa superposición. Entonces, de esta manera obtienes un ILP.
fuente