Maski bitowe
03.10.2009 - Damian Rusak
![]() ![]() ![]() Pomocna w rozwiązaniu wielu problemów algorytmicznych z gatunku programowania dynamicznego bywa umiejętność zwięzłego zapisu wszystkich możliwych do osiągnięcia stanów. Spotykamy problemy, w których te stany to pewne podzbiory. Co to oznacza? W jaki sposób reprezentować podzbiory i czy faktycznie jest to dobry i skuteczny sposób rozwiązywania problemów algorytmicznych? Odpowiedzi na te pytania znajdziesz w tym artykule.
Problem KomiwojażeraZa przykład wykorzystania tej idei posłużyć nam może znany Problem Komiwojażera (TSP - Travelling Salesman Problem). Dla ustalenia uwagi, sprecyzujemy tu jeden z wariantów TSP :
Ten problem jest trudny i nie jest znany algorytm, który rozwiązywałby go i działał w czasie wielomianowym. Wobec tego zaatakujemy problem, znajdując w miarę dobre rozwiązanie w czasie wykładniczym. Oczywiście nietrudno znaleźć rozwiązanie w czasie Rozważmy na potrzeby przykładu poniższy graf:
Dobrą praktyką, towarzyszącą wymyśleniu algorytmu programowania dynamicznego, jest próba wyszczególnienia pewnych stanów i konstrukcja rozwiązania dla każdego z nich z wykorzystaniem uprzednio obliczonych rozwiązań dla stanów poprzedzających. Tutaj naturalne jest zasymulowanie „podróży” komiwojażera przez wierzchołki grafu. Naszym stanem może być pewien fragment przebytej drogi. Moglibyśmy przyjąć, że stan to fragment drogi od pierwszego wierzchołka na jej trasie. Jednak taki pomysł nie różni się od brutalnego sprawdzania wszystkich permutacji. Tu pojawia się ważna obserwacja - jeśli rozpatrujemy pewien fragment ścieżki komiwojażera oraz wiemy w jakim miejscu się rozpoczął i w jakim zakończył, to nie jest dla nas istotne, w jakiej kolejności zostały odwiedzone pozostałe wierzchołki na ścieżce - istotne jest jedynie, które wierzchołki zostały już odwiedzone, szukamy wszak najlepszej spośród wszystkich tych możliwości i interesuje nas koszt, a nie kolejność. To odpowiada pomysłowi z wykorzystaniem nieuporządkowanych podzbiorów jako stanów - określmy stan (fragment ścieżki) jako podzbiór zbioru wszystkich wierzchołków, z wyszczególnionym początkiem i końcem. Szybko dochodzimy też do pomysłu na optymalizację tego podejścia - skoro (w naszym wariancie) ścieżka komiwojażera ma być cyklem, i przechodzić przez wszystkie wierzchołki, to bez straty ogólności możemy założyć, że zawsze zaczyna się ona w pewnym wyszczególnionym wierzchołku (nazwijmy go wierzchołkiem początkowym). W ten sposób przestrzeń stanów można ograniczyć do podzbiorów zbioru wierzchołków, wraz z wyszczególnionym wierzchołkiem końcowym. Teraz, szacując złożoność pamięciową, otrzymujemy
Teraz, skoro przebyliśmy drogę jedynie poprzez wierzchołki z podzbioru
Gdy dokonamy tych obliczeń dla wszystkich podzbiorów, otrzymamy najmniejsze wartości ścieżek, przebiegających wszystkie wierzchołki grafu, i kończących się w pewnym jego wierzchołku, różnym od 1. Teraz należy zamknąć cykl komiwojażera, powracając do wierzchołka nr 1. Stąd rozwiązanie to:
Nie możesz wysyłać i oglądać rozwiązań tego zadania ponieważ nie jesteś zalogowany. Zaloguj się lub załóż konto.
(7 ocen) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com