2008-09-30 14 views
5

Poszukuję wskaźników do rozwiązania następującego problemu: Mam zestaw prostokątów, których wysokość jest znana, a także pozycje x, i chcę je spakować w bardziej zwartej formie. Z małym rysunkiem (gdzie wszystkie prostokąty mają tę samą szerokość, ale ich szerokość może różnić się w rzeczywistości), chciałbym zamiast tego.Prostokąty pakowania dla reprezentacji kompaktowej

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

coś jak.

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

Wszystkie wskazówki zostaną docenione. Niekoniecznie szukam "najlepszego" rozwiązania.

+0

więc po prostu chcesz określić pierwszą dostępną pozycję y, aby narysować prostokąt? – Jasper

+0

Czy chcesz je spakować, czy optymalnie je spakować? –

+0

wygląda jak pozycja x jest niezmienna, ale pozycja y jest? – Mauro

Odpowiedz

1

Coś takiego?

  • Sortuj Twój zbiór prostokątów X-pozycji
  • napisać metodę, która sprawdza, które prostokąty są obecne w pewnym odstępie osi x

    Collection<Rectangle> overlaps (int startx, int endx, Collection<Rectangle> rects){ 
    ... 
    } 
    
  • pętla nad kolekcją prostokąty

    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

Możesz sformatować kod, rozpoczynając każdą linię od 4 spacji. – Roel

+0

Poza tym, tak, myślę, że jest to poprawny algorytm. Uważam, że jest to optymalne, jeśli prostokąty są tej samej wysokości, a współrzędne x (które według mnie są czasami rozpoczęcia w algorytmie planowania?) Są stałe. – Roel

+0

Moje prostokąty nie mają tej samej wysokości, a współrzędne x są naprawdę przestrzenne, nie ma współrzędnych czasowych, ale masz rację, że nic nie zmienia. – stephanea

2

Twój problem jest prostszym wariantem, ale możesz uzyskać wskazówki na temat heurystyki opracowanej dla problemu "binpackingu". Wiele na ten temat napisano, ale dobry początek to this page.

+1

Po raz pierwszy zagłosowałem za tobą, ale ponownie przeczytałem pytanie, jeśli ustawione są jego współrzędne x, nie ma problemu z NP. W zależności od tego, czy wysokość prostokątów jest taka sama, można ją rozwiązać za pomocą algorytmu Jaspera. – Roel

+0

Masz całkowitą rację - odpowiednio zredagowałem swoją odpowiedź. – twk

1

Umieść na swojej stronie podobną do tetris grę. Wygeneruj bloki, które spadną, i rozmiar obszaru gry na podstawie parametrów. Punkty przyznawane są graczom w oparciu o zwartość (mniej wolnego miejsca = więcej punktów) ich projektu. Poproś odwiedzających witrynę, aby wykonali pracę za Ciebie.

+0

Rozproszone przetwarzanie w najlepszym wydaniu :) Nazwijmy to "chmurą ludzkiego mózgu" :) – Roel

+0

To może być dobre rozwiązanie, ale wątpię, że znajdę wystarczającą ilość pracowników, z wystarczającą ilością czasu. Dzięki. – stephanea

1

Czy prostokąty mają tę samą wysokość? Jeśli tak, a problem polega tylko na tym, który rząd wstawiać do każdego prostokąta, problem sprowadza się do szeregu ograniczeń dotyczących wszystkich par prostokątów (X, Y) w postaci "prostokąt X nie może być w tym samym wierszu co prostokąt Y ", gdy prostokąt X zachodzi w kierunku x z prostokątem Y.

" Chciwy "algorytm do sortowania prostokątów od lewej do prawej, a następnie przypisuje każdy prostokąt z kolei do wiersza o najniższym numerze, w którym pasuje. Ponieważ prostokąty są przetwarzane od lewej do prawej, należy się tylko obawiać, czy lewy brzeg bieżącego prostokąta pokryje się z pozostałymi prostokątami, co upraszcza nieco algorytm wykrywania nakładki.

Nie mogę udowodnić, że daje to optymalne rozwiązanie, ale z drugiej strony nie można wymyślić żadnych kontrprzykładów. Ktoś?

+0

W szczególności podczas sortowania prostokątów "od lewej do prawej" należy sortować według swoich * skrajnych * punktów końcowych. Nie jestem również pewien, czy daje to optymalne rozwiązanie dla problemu o tej samej wysokości, ale daje optymalne rozwiązanie dla ściśle powiązanego problemu planowania, maksymalizującego liczbę zadań, które można wykonać. –

2

Topcoder miał konkurs na rozwiązanie wersji 3D tego problemu. Zwycięzca omówił jego podejście: here, może to być dla ciebie interesująca lektura.

0

Już wcześniej pracowałem nad takim problemem. Najbardziej intuicyjny obraz to prawdopodobnie taki, w którym duże prostokąty znajdują się na dole, a mniejsze są na górze, trochę jak umieszczanie ich w pojemniku i potrząsanie tak, aby ciężkie spadały na dno. Aby to osiągnąć, najpierw posortuj swoją tablicę według malejącej powierzchni (lub szerokości) - najpierw przetworzymy duże elementy i zintegrujemy obraz.

Teraz problem polega na przypisaniu współrzędnych y do zestawu prostokątów, dla których podane są współrzędne x, jeśli dobrze cię rozumiem.

Powtórz swoje szeregi prostokątów. Dla każdego prostokąta zainicjuj współrzędną y prostokąta na 0. Następnie wykonaj pętlę, zwiększając współrzędną y tego prostokąta, aż nie skrzyżuje się z żadnym z wcześniej umieszczonych prostokątów (musisz śledzić, które prostokąty zostały wcześniej umieszczone). Zatwierdź znalezioną współrzędną y i kontynuuj przetwarzanie następnego prostokąta.

Powiązane problemy