2013-02-22 12 views
10

Poszukuję pomocy w ulepszeniu algorytmu umieszczania bloków o dziwnych kształtach. Moja domena problemowa jest dziwna, ale najlepszą analogią do moich bloków są kawałki Tetrisa, z tym, że mogą mieć więcej niż cztery kawałki. Bloki wciąż składają się tylko z kątów prostych, ale mogą być długie i kręte, mogą rozgałęziać się itp.Algorytm układu bloków

Próbuję rozmieścić wiele dużych, dowolnie ukształtowanych klocków w minimalnej przestrzeni (wiem, że to opakowanie problem), ale moje obecne rozwiązanie wygląda paskudnie. Zasadniczo umieszczam jeden, a potem brutalnie wymuszam resztę, próbując umieścić je u źródła mojej siatki, a następnie powoli popychając je w różnych kierunkach, dopóki nie będą już kolidować. Nie jest powolna, ale nie próbuje ładnie dopasować elementów, aby nie marnowały całej przestrzeni.

Jedyne, co mogę wymyślić, to zamówienie klocków według rozmiaru, umieszczenie największego jako pierwszego, a następnie dopasowanie najmniejszego na końcu do pozostałych otworów. Ale są na pewno sposoby, które mogą się przydać.

Czy są tutaj jakieś algorytmy heurystyczne lub aproksymacyjne, które mogą mi w tym pomóc?

Wyniki będzie wyglądał tak:

enter image description here

także, być może mój gravatar zdradza, że ​​jest to związane z Mega Man ...

+1

Proszę dodać zdjęcie – Navin

+1

Twój obraz wydaje się sugerować, że chcesz mieć przestrzeń między blokami. Czy to prawda? –

+0

@Andrew Tak, zrobię to, ale mam przeczucie, że nie wpłynie to na algorytm. Mogłem tylko udawać, że bloki są grubsze o 1 jednostkę ze wszystkich stron. – Tesserex

Odpowiedz

7

To (Polyomino kształt opakowania) ogólnie wydaje się być nietrywialnym problemem matematycznym, a ja wskażę ci wiedzę innych, którzy nad tym pracowali. Ten facet ma na swojej stronie internetowej kilka przykładów polyomino, gdzie inni mogą zgłaszać rozwiązania. Ma również oprogramowanie do rozwiązywania problemów w Javie:

http://gp.home.xs4all.nl/Site/Polyomino_Solver.html.

http://gp.home.xs4all.nl/PolyominoSolver/downloadsolver.htm

Istnieją również pewne algorytmy napisane dla tego Stephen Montgomery-Smith, który wydaje się być bardziej wszechstronne niż wymienione powyżej (to rozwiązać pewne problemy, które nie były rozwiązywalne z tego) w końcu się go w produkt xscreensaver (rozwiązuje się w czasie rzeczywistym i fajnie jest oglądać!). Poniższy zrzut ekranu z wygaszacza ekranu pokazuje tylko kształty do pentomino, ale działa na ogólnych kształtach z ogólnymi pojemnikami.

http://www.math.missouri.edu/~stephen/software/

jestem pewien, czy którykolwiek z tych programów jest zbliżona najlepsze dopasowanie polyominoes pozwalających na otwory. Ale to zdecydowanie "rozstrzygalne" w ten sposób, w tym sensie, że z pewnością można wstawić dodatkowe polyomino 1x1 do rozwiązania i sprawdzić, czy może znaleźć konkretny wynik, który pasuje, a następnie usunąć kawałki 1x1, aby uzyskać wynik.

enter image description here

dla danego zastosowania, może być bardziej wydajny do pracy wstecz. Wszystkie te algorytmy mają złożoność liczby komórek elementarnych w każdym bloku. Dobrym sposobem na rozłożenie bloków byłoby myślenie o nich jako o "poddziałach" w większych komórkach, tak aby kwadrat 3x3 w twoim bloku odpowiadał kwadratowi 1x1 w wersji z przeskalowaną skalą. Następnie opuść klocki pustą przestrzenią, aby wszystkie składały się z większych bloków, uruchom algorytm i usuń dodatkową przestrzeń. Nie tylko będzie to znacznie szybsze do wykonania, ale także wygeneruje przestrzeń między blokami, które potrzebujesz.