2008-10-30 17 views
12

Tengo un programa que calculará el área mínima tomada ajustando rectángulos.Apilamiento de rectángulos para ocupar el menor espacio posible

Entrada: Rectángulos de diferentes alturas y ancho.
Salida: Un rectángulo que contiene todos estos rectángulos.
Reglas: No se puede girar ni hacer rodar los rectángulos y no se pueden superponer.

Entiendo que esto está relacionado o posiblemente se define como un problema de embalaje de la tolva (NP-hard). Sin embargo, los algoritmos que encontré para aquellos a menudo establecen un límite en, por ejemplo, el ancho. No tengo tales límites, el único objetivo es conseguir que el área resultante sea lo más pequeña posible.

¿Alguna sugerencia sobre qué algoritmo es apropiado para obtener una solución decente?

+0

¿Alguien más huele un problema de tarea? –

+0

Nah, esto es bastante común en los juegos, se llama embalaje de textura. –

+0

En realidad estoy automatizando una conversión de íconos e imágenes a un sprite css y quiero que el resultado sea lo mejor posible. –

Respuesta

5

http://www-rcf.usc.edu/~skoenig/icaps/icaps04/icapspapers/ICAPS04KorfR.pdf

Al parecer, este problema es más difícil de lo que parece en un principio. Es un algoritmo interesante, ya que primero adivina una solución y luego la mejora, por lo que si no quiere esperar a la solución óptima, puede ejecutarla por un número determinado de iteraciones para obtener una solución aproximada (cuanto más tiempo lo ejecutas, mejor es la aproximación).

+0

Gracias por el enlace. Yo había marcado eso hace algún tiempo para apartar para leer. Ahora finalmente tengo que leerlo. – Tim

1

Comenzaría por hojear http://mathworld.wolfram.com - son geniales para cosas como esta.

En segundo lugar, podría imaginar un algoritmo tonto que pondría el cuadro más largo (en la dimensión X) en la parte inferior, luego el más alto (en la dimensión Y) en la parte superior de uno u otro lado. Luego continúe apilándolos de esta manera "escalonada" yendo hacia la derecha y hacia arriba (por ejemplo, vaya hacia la derecha hasta que no pueda, luego suba, etc., etc.).

Probablemente no sea ideal, y puede darte malos resultados, pero es lo primero que se te viene a la mente.

3

Recomiendo comenzar con un enfoque simple y codicioso, y ver si eso es lo suficientemente bueno para sus necesidades. Si su entrada es educada o pequeña, eso puede ser todo lo que necesita, y la complejidad aumentará rápidamente cuando intente hacer algo más sofisticado.

Por ejemplo: clasifique los rectángulos por tamaño, el más grande primero. Agregue los rectángulos uno a la vez, probando cada posición posible para el nuevo rectángulo. Elija la posición que dé como resultado el cuadro delimitador más pequeño.

Otro enfoque codicioso sería elegir un rectángulo de inicio, luego agregar repetidamente el rectángulo que resulta en la disposición más densa (donde la densidad se define como el porcentaje del área del cuadro delimitador que se llena).

+0

Iba a sugerir esos dos también, pero habiendo trabajado en diferentes problemas de NP con una suposición inicial de heurística "buena", me llevó a experimentar con lo que pensé sería una heurística "mala". Los resultados fueron sorprendentes. Se producen situaciones locales mínimas y máximas. Pero me gusta tu sugerencia. – Tim

Cuestiones relacionadas