Przeskocz do treści

Delta mi!

Jak złapać terrorystę?

Marian Kędzierski

o artykule ...

  • Publikacja w Delcie: grudzień 2011
  • Publikacja elektroniczna: 01-12-2011
  • Autor: Marian M. Kędzierski
    Afiliacja: student, Wydział Matematyki, Informatyki i Mechaniki, Uniwersytet Warszawski
  • Wersja do druku [application/pdf]: (145 KB)

Któż z nas nie bawił się jako dziecko w chowanego? Zabawa ta sprawia dzieciom wiele radości, mimo że z algorytmicznego punktu widzenia jest bardzo prosta. Jeżeli bowiem wszyscy ukrywający się czekają uczciwie w swoich kryjówkach, to zawsze uda się ich znaleźć – wystarczy, jeżeli szukający przejrzy wszystkie miejsca.

Sytuacja jednak komplikuje się, kiedy ukryte osoby mogą zmieniać swoje kryjówki w czasie poszukiwań. Okazuje się, że wtedy szala trudności przechyla się w drugą stronę. O ile w oryginalnym sformułowaniu wiele osób ukrywało się i wystarczyła jedna, aby je znaleźć, o tyle teraz do znalezienia nawet jednej osoby zwykle potrzeba wielu szukających.

Poszukiwania stają się jeszcze trudniejsze, jeżeli nie znamy ograniczenia na prędkość uciekiniera. Zapewne sytuacja ta jest dobrze znana rodzicom próbującym znaleźć swoje pociechy – dobrze wiedzą, że dzieci potrafią się poruszać z dowolną prędkością, niekoniecznie ograniczoną przez prędkość światła.

Problem. Spróbujmy sformalizować nasze zadanie. Zastanawiamy się nad kwestią przeszukiwania spójnego grafu nieskierowanego, np. reprezentującego budynek, w którym ukrywa się terrorysta. Nie wiemy, gdzie on jest, jak się będzie poruszał ani nawet jak szybko będzie w stanie to robić. Interesuje nas minimalna liczba policjantów potrzebnych do przeszukania grafu i złapania terrorysty bez względu na jego sposób poruszania się.

To zadanie ma wiele wersji, więc potrzebujemy uściślić pewne założenia. W naszym przypadku zakładamy, że terrorysta zostanie złapany, jeżeli w danym momencie spotka policjanta w tym samym wierzchołku bądź w tym samym punkcie krawędzi. Innymi słowy, stojąc w dowolnym wierzchołku, policjant widzi jedynie ten wierzchołek (bez krawędzi z niego wychodzących) i podobnie, stojąc w krawędzi, widzi tylko ten jej punkt, w którym sam się znajduje, a nie całą krawędź.

Szukana liczba policjantów jest parametrem grafu. Nazwijmy ją liczbą policyjną grafu.

obrazek

Rys. 1 Wyznaczanie liczby policyjnej a) ścieżki, b) cyklu, c) gwiazdy. Kolorowy punkt z literą math oznacza terrorystę, pozostałe punkty oznaczają policjantów. Kolorowe strzałki pokazują strategię policjantów.

Rys. 1 Wyznaczanie liczby policyjnej a) ścieżki, b) cyklu, c) gwiazdy. Kolorowy punkt z literą math oznacza terrorystę, pozostałe punkty oznaczają policjantów. Kolorowe strzałki pokazują strategię policjantów.

Rozpatrzmy kilka przykładów (patrz Rys. 1):

  • Dla grafu będącego ścieżką liczba policyjna wynosi 1, bo wystarczy, że jedna osoba przejdzie graf od początku do końca.
  • Dla cyklu potrzebne są już dwie osoby, bo jeżeli jeden policjant porusza się po cyklu, to terrorysta może np. zawsze ukrywać się w wierzchołku sąsiednim do tego, w którym jest policjant, i poruszać się tak samo, jak on. Dwóch policjantów już może przeszukać cykl – wystarczy, jeżeli jeden poczeka w pewnym wierzchołku, a drugi przejdzie cały cykl.
  • Dla gwiazdy (czyli grafu, w którym pewien wierzchołek math jest połączony ze wszystkimi pozostałymi, a każda krawędź jest incydentna z math) potrzeba dwóch przeszukujących, bo w czasie, kiedy jeden odwiedza pewien wierzchołek różny od math terrorysta może przemieszczać się dowolnie po pozostałych wierzchołkach (pod warunkiem, że wszystkich wierzchołków jest co najmniej 4). Dwóch policjantów wystarczy, bo jeden może stanąć w wierzchołku math a drugi w tym czasie może przejrzeć cały graf.

Pierwsze próby rozwiązania

Zastanówmy się nad jakimiś ograniczeniami na liczbę szukających. Oczywiście, zawsze wystarczy math policjantów, gdzie math jest zbiorem wierzchołków grafu, ponieważ możemy w każdym wierzchołku postawić strażnika i jednym dodatkowym policjantem przeszukać wszystkie krawędzie. Jest to jednak bardzo zgrubne ograniczenie, zwykle liczba policyjna będzie znacznie mniejsza. Wiemy jednak dzięki niemu, że rząd rozwiązania to math  Możemy też dla danego grafu math  wykonywać pewne redukcje do mniejszych instancji zadania (choć nie wszystkie zachowają dokładne rozwiązanie):

  • Możemy z grafu usunąć każdy wierzchołek stopnia 2, łącząc przy tym incydentne z nim krawędzie w jedną.
  • Możemy umieścić kilku (powiedzmy math) strażników w pewnym podzbiorze wierzchołków, którego usunięcie spowodowałoby rozspójnienie grafu (możemy np. wybrać do tego punkty artykulacji). Następnie możemy znaleźć rozwiązanie dla każdej z powstałych spójnych składowych oddzielnie. Powiedzmy, że znalezione dla nich liczby policyjne to math; wtedy dostateczną (choć niekoniecznie minimalną) liczbą jest math Odpowiada to strategii, w której zespół math policjantów pilnuje przejścia między otrzymanymi spójnymi składowymi, natomiast zespół pozostałych przeszukuje po kolei wszystkie składowe.
  • Możemy z grafu usunąć wszystkie wierzchołki o stopniu 1 (incydentne z dokładnie jedną krawędzią – nazwijmy je liśćmi), otrzymując graf math  Jeżeli obliczymy liczbę policyjną math dla grafu math  to do przeszukania oryginalnego grafu math  wystarczy nam math policjantów, ponieważ możemy przy pomocy math policjantów przeszukiwać podgraf math  i dla każdego liścia math całego grafu math  zatrzymać tych math policjantów w momencie, kiedy jedyny sąsiad math liścia math zostaje po raz ostatni odwiedzony w strategii przeszukiwania math  W tym momencie może wkroczyć do akcji dodatkowy policjant, który przybiegnie do math i z niego przejdzie do math W ten sposób wierzchołek math oraz incydentna z nim krawędź math zostaną przeszukane i nigdy więcej terrorysta nie będzie mógł się tam znaleźć.

Niestety, powyższe redukcje (oprócz pierwszej) nie są dokładne, tzn. pozwalają jedynie na znalezienie pewnej dostatecznej liczby policjantów, ale niekoniecznie minimalnej.

Okazuje się, że problem wyznaczenia liczby policyjnej grafu jest NP-trudny. Znaczy to, że ludzkość nie zna żadnego rozwiązania o wielomianowej złożoności czasowej. Jednak w przypadku tego problemu nie jest nawet jasne, w jaki sposób rozwiązać go w czasie wykładniczym lub nawet math  co dla większości NP-trudnych problemów jest oczywiste.

Postarajmy się więc znaleźć rozwiązanie działające w czasie wykładniczym.

Algorytm

Znamy już pewne sposoby ograniczania liczby policyjnej z góry. Żeby jednak móc analizować jej ograniczenia z dołu, potrzebujemy jakiegoś opisu wszystkich możliwych rozwiązań. Do skonstruowania tego opisu będzie nam pomocny następujący

Fakt 1. Liczba policyjna grafu nie zmienia się przy przyjęciu ograniczenia, że policjanci poruszają się po kolei, tzn. w każdym kroku jeden z nich przesuwa się do sąsiedniego wierzchołka.

Dzięki temu stwierdzeniu możemy podzielić cały czas przeszukiwania na dyskretne momenty. To pozwala nam w pewien sposób opisać i usystematyzować możliwe strategie jako sekwencje dyskretnych ruchów policjantów.

Jeżeli znalibyśmy jeszcze górne ograniczenia na czas przeszukiwania w takiej strategii, to moglibyśmy już podać pewien „brutalny” algorytm przeszukujący wszystkie możliwe sekwencje ruchów. Złożoność takiego podejścia byłaby trudna do oszacowania, jednak prawdopodobnie istotnie przekraczałaby złożoność wykładniczą.

Zadanie upraszcza się, jeżeli spojrzymy na nie z innej strony. Otóż zamiast zastanawiać się nad różnymi strategiami, przyjrzyjmy się możliwym kolejnościom przeszukiwania krawędzi.

Jeżeli założymy, że w każdym ruchu pewien policjant przechodzi z pewnego wierzchołka do sąsiedniego, to w naturalny sposób pojawią się pojęcia krawędzi skażonejkrawędzi czystej, czyli odpowiednio takiej, w której może być terrorysta, i takiej, w której na pewno terrorysty w danym momencie nie ma.

Teraz będzie nam potrzebny jeszcze jeden, nietrywialny fakt.

Fakt 2. Istnieje optymalna strategia monotoniczna, tzn. taka, w której zbiór krawędzi czystych rośnie (czyli jeśli jakaś krawędź jest czysta w danym momencie, to już do końca przeszukiwania taka będzie).

Tak więc, zamiast badać, czy dana strategia przeszukuje wszystkie krawędzie, pomyślmy nad dowolną sekwencją oczyszczania krawędzi i obliczmy, ilu potrzeba policjantów, aby ją zrealizować. Jeżeli następnie zbadamy to dla wszystkich możliwych kolejności przeszukiwania krawędzi, to minimum z otrzymanych wyników będzie równe liczbie policyjnej grafu.

Jak dla danej kolejności przeszukiwania krawędzi wyznaczyć liczbę potrzebnych policjantów? Rozważmy zbiory czystych krawędzi w kolejnych momentach. Zauważmy, że do blokowania czystego podzbioru krawędzi potrzeba dokładnie tylu policjantów, ile jest w grafie wierzchołków incydentnych zarówno z krawędzią czystą, jak i z krawędzią skażoną. To jednak nie wystarczy. Musimy jeszcze rozważyć sposób przeszukania każdej krawędzi – może się bowiem zdarzyć, że w czasie jej przeszukiwania potrzebnych jest więcej osób niż potrzeba strażników bezpośrednio przed i bezpośrednio po operacji.

obrazek

Rys. 2 Moment przeszukiwania krawędzi math; kolorowe linie oznaczają krawędzie skażone.

Rys. 2 Moment przeszukiwania krawędzi math; kolorowe linie oznaczają krawędzie skażone.

Rozważmy więc samą operację oczyszczenia pewnej krawędzi math Załóżmy, że przed jej oczyszczeniem math jest incydentne z math krawędziami czystymi i math krawędziami skażonymi (nie licząc math), natomiast math z math czystymi i z math skażonymi (również nie licząc math). Sytuację przedstawia Rys. 2.

Niech math będzie liczbą policjantów potrzebnych do pilnowania krawędzi tuż przed oczyszczeniem math natomiast math – tuż po jej oczyszczeniu. Oczyszczenie krawędzi math wymaga math policjantów w sytuacji, gdy spełniony jest następujący warunek:

display-math

We wszystkich innych przypadkach potrzeba dokładnie math policjantów.

Koszt przeszukania grafu przy zadanej kolejności krawędzi jest równy maksimum z zapotrzebowań na policjantów we wszystkich momentach.

Otrzymujemy więc algorytm o złożoności math  czyli działający w czasie math  z dokładnością do czynnika wielomianowego ( math to zbiór krawędzi grafu).

Możemy jednak tę złożoność zmniejszyć do math  jeżeli posłużymy się programowaniem dynamicznym – możemy obliczać dla każdego podzbioru krawędzi minimalną liczbę policjantów potrzebną do uzyskania danego podzbioru krawędzi czystych. Jeżeli będziemy generowali te wyniki dla coraz większych podzbiorów krawędzi, to dla każdego z nich możemy obliczyć wynik w czasie wielomianowym, korzystając z wyników dla mniejszych zbiorów.

Dokładną specyfikację tego algorytmu pozostawiam jako ćwiczenie dla Czytelnika.