Digamos que tengo una cuadrícula de rectángulos de diferentes formas y colores y quiero reducir (razonablemente cerca de lo óptimo está bien, lo óptimo no es necesario) el número de rectángulos para representar el mismo diseño de colores.
La imagen de arriba es un caso muy simplificado y el espacio en blanco entre los rectángulos es solo para visualización, en realidad estarían muy apretados.
¿Qué es un enfoque o nombre de algoritmo (feliz de google) que me puede ayudar a hacer esto?
Respuestas:
Primero, podemos convertir sus rectángulos de origen en celdas en su cuadrícula subyacente, para hacer que la entrada sea más uniforme. (Efectivamente rasterizando el problema)
Esto nos permitirá encontrar optimizaciones que pueden no ser obvias cuando se trabaja directamente con los rectángulos de origen, particularmente cuando se trata de dividir múltiples rectángulos de origen para recombinarlos de manera diferente.
A continuación, podemos encontrar regiones conectadas del mismo color, utilizando algoritmos de búsqueda de profundidad o de inundación. Podemos considerar cada región conectada (un poliomino ) de forma aislada; nada de lo que hagamos a una región diferente debe influir en esta.
Efectivamente, queremos encontrar una manera de diseccionar este poliomino en rectángulos (desafortunadamente, la mayor parte de la literatura que puedo encontrar trata sobre el problema opuesto: ¡diseccionar rectángulos en poliominoes! Esto hace que sea difícil buscar pistas ...)
Un método sencillo es combinar tramos horizontales de cuadrados adyacentes en rectángulos largos y delgados. Luego, podemos comparar con la fila de arriba y combinar si nuestra ejecución comienza y finaliza, ya sea cuando terminamos cada ejecución / fila, o cuando consideramos que cada celda se agrega a la ejecución actual.
Todavía no sé qué tan cerca este método llega a ser óptimo Parece que puede tener algunos problemas cuando una fila que aún no ha considerado sugiere una división diferente de las filas que se han visto hasta ahora:
Detectar cuándo una corrida / rectángulo está exactamente cubierta por corridas arriba y abajo, luego dividirla y fusionarlas resolverá este caso particular, pero no he explorado cuán general es el problema.
También he mirado métodos en los que caminamos por el perímetro del poliomino y los atravesamos cada vez que nos encontramos con una esquina cóncava, pero este enfoque me parece más propenso a errores. Obtener resultados óptimos parece requerir priorizar cortes que unen dos esquinas cóncavas, y las formas que contienen huecos necesitan un manejo especial, por lo que el método de escaneo de filas parece tener la ventaja de la simplicidad.
Un método más que estoy viendo es tomar la primera carrera que se encuentra en la fila superior y extenderla hacia abajo todo lo que pueda. Luego tome la primera carrera en la fila superior de lo que queda ... Sin embargo, esto se dispara en formas de T invertidas, por lo que tampoco es óptimo.
Siento que probablemente haya una forma de usar la programación dinámica para encontrar la división óptima, pero aún no la he encontrado.
fuente