2008-09-30 18 views
5

Estoy buscando punteros a la solución del siguiente problema: Tengo un conjunto de rectángulos, cuya altura es conocida y también las posiciones xy quiero empacarlas en la forma más compacta. Con un pequeño dibujo (donde todos los rectángulos son del mismo ancho, pero el ancho puede variar en la vida real), me gustaría, en lugar de.Rectángulos de embalaje para la representación compacta

-r1- 
    -r2-- 
    -r3-- 
     -r4- 
     -r5-- 

algo así como.

-r1- -r3-- 
    -r2-- -r4- 
     -r5-- 

Todas las pistas serán apreciadas. No necesariamente estoy buscando "la" mejor solución.

+0

por lo que, básicamente, desea determinar la primera posición y disponible para dibujar un rectángulo? – Jasper

+0

¿Está buscando empacarlos o empacarlos de manera óptima? –

+0

parece que la posición x no se puede cambiar pero la posición y es? – Mauro

Respuesta

1

¿Algo como esto?

  • Ordenar su colección de rectángulos por x-posición
  • escribir un método que comprueba que rectángulos están presentes en un cierto intervalo del eje x

    Collection<Rectangle> overlaps (int startx, int endx, Collection<Rectangle> rects){ 
    ... 
    } 
    
  • bucle sobre la colección de rectángulos

    Collection<Rectangle> toDraw; 
    Collection<Rectangle> drawn; 
    foreach (Rectangle r in toDraw){ 
    Collection<Rectangle> overlapping = overlaps (r.x, r.x+r.width, drawn); 
    int y = 0; 
    foreach(Rectangle overlapRect in overlapping){ 
    y += overlapRect.height; 
    } 
    drawRectangle(y, Rectangle); 
    drawn.add(r); 
    } 
    
+0

Puede formatear el código comenzando cada línea con 4 espacios. – Roel

+0

Aparte de eso, sí, creo que este es un algoritmo correcto. Creo que es lo óptimo, si los rectángulos son todos de la misma altura y las coordenadas x (que creo que son horas de inicio en un algoritmo de programación?) Son fijos. – Roel

+0

Mis rectángulos no son todos de la misma altura, y las coordenadas x son realmente espaciales, sin coordenadas temporales, pero tiene razón en que no cambian nada el problema. – stephanea

2

Su problema es una variante más simple, pero es posible que obtenga algunos consejos sobre la heurística desarrollada para el problema del "binpacking". Se ha escrito mucho sobre esto, pero this page es un buen comienzo.

+1

La voté por primera vez, pero volviendo a leer la pregunta, si sus coordenadas x están establecidas, no tiene un problema NP-difícil. Dependiendo de si la altura de los rectángulos es la misma, se puede resolver con algo como el algoritmo de Jasper. – Roel

+0

Tiene toda la razón: he editado mi respuesta en consecuencia. – twk

1

Ponga un juego tipo tetris en su sitio web. Genere los bloques que caen y el tamaño del área de juego según sus parámetros. Los puntos de premio a los jugadores se basan en la compacidad (menos espacio libre = más puntos) de su diseño. Haga que los visitantes de su sitio web realicen el trabajo por usted.

+0

Computación distribuida en su mejor forma :) Vamos a llamarla la 'nube del cerebro humano' :) – Roel

+0

Puede ser una buena solución, pero dudo que encuentre suficientes trabajadores, con tiempo suficiente. Gracias. – stephanea

1

¿Los rectángulos son todos de la misma altura? Si lo son, y el problema es en qué fila colocar cada rectángulo, entonces el problema se reduce a una serie de restricciones sobre todos los pares de rectángulos (X, Y) de la forma "rectángulo X no puede estar en la misma fila que rectángulo Y "cuando el rectángulo X se superpone en la dirección x con el rectángulo Y.

Un algoritmo 'codicioso' para esto ordena los rectángulos de izquierda a derecha, luego asigna cada rectángulo a la fila más baja en la que encaja. Debido a que los rectángulos se están procesando de izquierda a derecha, solo hay que preocuparse de si el borde izquierdo del rectángulo actual se superpondrá con otros rectángulos, lo que simplifica un poco el algoritmo de detección de superposición.

No puedo probar que esto ofrezca la solución óptima, pero por otro lado tampoco puedo pensar en ningún contraejemplo. ¿Nadie?

+0

Específicamente, al ordenar rectángulos "de izquierda a derecha" debe ordenar por sus puntos finales * más a la derecha *. Tampoco estoy seguro de si esto proporciona una solución óptima para el problema de la misma altura, pero ofrece una solución óptima para el problema de programación estrechamente relacionado de maximizar el número de tareas que se pueden completar. –

2

Topcoder tuvo un concurso para resolver la versión 3D de este problema. El ganador discutió su enfoque here, podría ser una lectura interesante para usted.

0

Había trabajado en un problema como este antes. La imagen más intuitiva es probablemente una donde los rectángulos grandes están en la parte inferior, y los más pequeños están en la parte superior, como colocarlos en un contenedor y sacudirlos para que los más pesados ​​caigan al fondo. Entonces, para lograr esto, primero clasifique su matriz en orden de área decreciente (o ancho) - primero procesaremos los elementos grandes y construiremos la imagen.

Ahora el problema es asignar coordenadas y a un conjunto de rectángulos cuyas coordenadas x se dan, si te entiendo correctamente.

Itere sobre su matriz de rectángulos. Para cada rectángulo, inicialice la coordenada y del rectángulo a 0. Luego realice un ciclo aumentando la coordenada y de este rectángulo hasta que no se intersecte con ninguno de los rectángulos colocados previamente (debe hacer un seguimiento de los rectángulos que se han colocado previamente). Comprométete con la coordenada y que acabas de encontrar, y continúa procesando el siguiente rectángulo.