Eliminar superposición de círculos manteniendo sólo el más grande
Dado un conjunto de círculos con centros y radios aleatorios, me gustaría poder eliminar estos círculos para que, en caso de solapamiento entre ellos, solo se retenga el círculo más grande. Esta es una pregunta similar a la que se responde aquí, pero el problema mencionado allí busca retener el número máximo de círculos no solapados, según entiendo. Me gustaría poder adaptar la solución de Procesamiento de Lenguaje Integral (ILP, por sus siglas en inglés) dada allí a mis necesidades, si es posible, aunque un enfoque de “búsqueda y eliminación” de fuerza bruta también estaría bien. Esto último es lo que he intentado hasta ahora, pero no he logrado hacerlo.
davy.ai
Solución para podar círculos superpuestos
El problema en cuestión consiste en podar un conjunto de círculos y retener solo aquellos que no se superponen. El enfoque que sugiero es similar al sugerido en esta respuesta, pero con algunas modificaciones en la PLI.
Formulación de la PLI
Podemos modelar el problema como una PLI con una variable de decisión binaria xi para cada círculo i en el conjunto. La variable toma el valor 1 si se retiene el círculo i y 0 en caso contrario.
Función Objetivo
La función objetivo de la PLI es maximizar el área total de los círculos que se retienen. Esto se puede expresar como:
donde r[i] es el radio del círculo i.
Restricciones
El problema tiene dos tipos de restricciones: restricciones de superposición y restricciones binarias.
Restricciones de Superposición
Para cada par de círculos (i, j), debemos asegurarnos de que no se superpongan. Esto se puede expresar como:
donde d[i,j] es la distancia entre los centros de los círculos i y j.
Restricciones Binarias
Las restricciones binarias garantizan que la variable de decisión tome solo valores binarios (0 o 1). Esto se puede expresar como:
Implementación de la PLI
Podemos utilizar la biblioteca
PuLP
en Python para implementar la PLI. Aquí está el código modificado:El código primero define las variables de decisión, que son variables binarias xi para cada círculo i. Luego, establece la función objetivo, que es maximizar el área total de los círculos que se retienen. A continuación, se agregan las restricciones: recorremos cada par de círculos y agregamos una restricción de superposición si se intersectan. Finalmente, resolvemos el problema usando
prob.solve()
y graficamos la solución.La salida debería lucir como el resultado deseado: