Grupowa eksploracja
Wyobraźmy sobie sytuację, w której grupa speleologów chce wyeksplorować nieznaną jaskinię. Przy każdym rozgałęzieniu muszą podejmować decyzję, ilu z nich pójdzie każdym z nowych tuneli.

Być może czasami będzie się opłacało zostawić część z nich przy rozgałęzieniu. Niektóre z tuneli będą się, być może, kończyły ślepo, a niektóre będą się dalej rozgałęziały. Speleolodzy mają telefony i mogą się ze sobą komunikować, więc gdy jeden z nich odkryje tunel z dużą liczbą rozgałęzień, może wezwać posiłki. Intuicyjnie rozsądne wydaje się wysyłanie większej liczby speleologów w te rejony jaskini, w których jest więcej tuneli. Chcielibyśmy jakoś sformalizować (i nieco uprościć) ten problem i przeanalizować takie naturalne podejście. Uproszczenia będą dwa: jaskinia będzie przedstawiona jako drzewo, czyli spójny graf bez cykli, a zespół speleologów będzie dość liczny...
Problem definiujemy następująco: mamy danych agentów, początkowo umieszczonych w korzeniu
nieznanego drzewa

o znanej liczbie wierzchołków

Drzewo jest nieznane, to znaczy, że nasza początkowa wiedza to tylko liczba krawędzi wychodzących z korzenia. W pierwszym kroku nasz algorytm musi wybrać, ilu agentów przetrawersuje krawędzie wychodzące z a ilu zostanie w
do następnej rundy. Jeżeli agentowi przydzielimy trawersowanie krawędzi z
do pewnego sąsiada
to przejście krawędzi zajmie agentowi całą rundę i pojawi się on w wierzchołku
na początku następnej rundy. W następnej rundzie będzie on mógł przetrawersować dowolną krawędź wychodzącą z
Wszyscy agenci, którzy w danej rundzie przechodzą krawędzie, robią to równocześnie.

Przez będziemy oznaczać odległość od korzenia
do najdalszego liścia
w drzewie
Odległość jest liczona jako liczba krawędzi na ścieżce łączącej
z
Oczywiście, nie jesteśmy w stanie wyeksplorować w czasie mniejszym niż
ponieważ przejście ścieżki z
do
zajmuje
rund.
Gdy wierzchołek jest odwiedzony przez pewnego agenta po raz pierwszy, to otrzymujemy informację o jego stopniu (liczbie wychodzących krawędzi). Ponadto dostajemy też informację o tym, która krawędź prowadzi do korzenia. Po pewnej liczbie kroków eksploracji już coś wiemy o wyglądzie drzewa Oznaczmy przez
poddrzewo drzewa
składające się z wierzchołków, które zostały poznane do chwili
Na przykład
to korzeń razem z dziećmi korzenia, ponieważ już na początku pierwszej rundy wiemy, ile dzieci ma korzeń. Drzewo
zatem zawiera pewne wierzchołki, które nie są jeszcze odwiedzone, ale są już znane. Dla
oznaczmy przez
poddrzewo drzewa
zawierające tylko te wierzchołki, dla których
jest przodkiem (ucinamy krawędź łączącą
z jego rodzicem i dostajemy
). Przez
oznaczamy liczbę wierzchołków znanych, ale nieodwiedzonych w drzewie
Czasami na wierzchołki znane, ale nieodwiedzone będziemy mówili "nieukończone ścieżki", ponieważ każdy taki wierzchołek jest korzeniem, być może dużego, nieznanego drzewa.
Dostajemy do dyspozycji pokaźnych rozmiarów zespół agentów

dla pewnej stałej ale chcemy eksplorować szybko, czyli w czasie jak najbliższym
Propozycja algorytmu
Na początku wszyscy agenci w korzeniu są nieaktywni. W każdej rundzie aktywujemy agentów w korzeniu (
wyznaczymy później). Wszyscy aktywni agenci w każdej rundzie idą w dół drzewa. Agentów dzielimy proporcjonalnie do liczby nieukończonych ścieżek w poddrzewach. Drobnym niuansem są zaokrąglenia; w pseudokodzie zapiszemy wszystko dokładnie:
Analiza
Algorytm nie robi niczego odkrywczego, po prostu wysyła więcej agentów tam, gdzie jest więcej ścieżek do odkrycia. Ale jego analiza nie jest oczywista. Algorytm, odkrywając kolejne wierzchołki drzewa, na bieżąco zmienia wartości liczby nieukończonych ścieżek w poddrzewach (funkcja
), co ma wpływ na proporcje podziału liczby agentów. Wydaje się, że jest to kluczowa własność algorytmu, więc w naszej analizie musimy ją zbadać. Oczywiście, musimy też wyznaczyć odpowiednią wartość parametru
Na razie ustalmy tylko, że
Weźmy dowolny liść z drzewa
i ścieżkę długości
łączącą
z korzeniem
Oznaczmy tę ścieżkę przez
gdzie
i
Chcemy się przyjrzeć, jak liczne grupy agentów będą wędrowały po ścieżce
Liczba agentów wysyłana wzdłuż ścieżki zależy od liczby nieukończonych ścieżek w odpowiednich poddrzewach. Jeżeli oznaczymy
to
-tym w kroku z wierzchołka
wyślemy do
mniej więcej (z dokładnością do zaokrągleń)
-tą część agentów znajdujących się w
na początku rundy
Zapomnijmy na chwilę o zaokrągleniach i pójdźmy dalej tym tropem. Do liścia
dotrze

agentów wysłanych w rundzie z korzenia. Zauważmy, jak wyglądają pierwsze dwie wartości:

Jeżeli wymnożymy to dość dużo się uprości. Wymnóżmy zatem
kolejnych wartości
Biorąc pod uwagę, że z definicji funkcji
mamy
to dostaniemy
Czyli jeżeli ustalimy
to dostaniemy
czyli dla pewnego
mamy
Gdyby nie było zaokrągleń i każde dziecko dostawałoby należny przydział agentów, to
agentów spośród grupy, która wyrusza w rundzie
dotarłoby do liścia
W rzeczywistości liczby agentów są czasem zaokrąglane w dół, zgodnie z regułą (i) z algorytmu, ale można pokazać, że te zaokrąglenia zbyt dużo nie psują.
Przyjrzyjmy się liczbie agentów, podążających ścieżką spośród grupy, która wyrusza w rundzie
Zauważmy, że w przypadku, gdy
to wtedy drzewo
zawiera co najmniej połowę wszystkich otwartych ścieżek drzewa
W takim przypadku wierzchołek
będzie tym wyróżnionym dzieckiem wierzchołka
i dostanie swój należny przydział agentów (reguła (ii)). Zauważmy, że
jest iloczynem
i pewnej liczby czynników nie większych od
Skoro
to co najwyżej
z tych czynników może być nie większych niż
Agenci, którzy wyruszyli z korzenia w rundzie
i podążali ścieżką
zostali "zaokrągleni w dół" co najwyżej
razy. Stąd da się już łatwo wykazać, że z grupy, która wyruszyła w rundzie
co najmniej jeden agent dotrze do liścia
Jeżeli wypuścimy z korzenia co najmniej
grup agentów, to jedna z nich wyeksploruje dowolnie wybrany liść
czyli
grup wyeksploruje całe drzewo. Całkowity czas eksploracji to
ponieważ tyle rund potrzeba, żeby
-ta grupa dotarła do liści. Łączna liczba użytych agentów to co najwyżej
Ustalając
dla odpowiednio dobranej stałej
dostajemy:
Twierdzenie. Dla dowolnego ustalonego i znanego
problem eksploracji drzew może być rozwiązany w czasie
przy użyciu
agentów.
Notacja oznacza funkcję, która dąży do 0 dla
dążącego do nieskończoności. Zauważmy, że znajomość
jest potrzebna algorytmowi jedynie do podziału zespołu wszystkich
agentów na grupy po
Da się skonstruować algorytm, który eksploruje w czasie
bez znajomości
używając
agentów.
Uwagi końcowe
- Można wykazać, że nie da się eksplorować szybciej niż w czasie
czyli jesteśmy już dość blisko optymalnego algorytmu.
- Algorytm można uogólnić na dwa sposoby. Można przerobić na wersję rozproszoną, gdzie agenci podejmują suwerenne decyzje, bazując na swojej wiedzy, i mogą się komunikować z innymi agentami będącymi w tym samym wierzchołku. Można też w ten sposób eksplorować dowolne grafy. Co ciekawe, oba uogólnienia nie dodają zbyt dużo do czasu eksploracji, czyli cała trudność problemu leżała w "centralnie sterowanej" eksploracji drzew.
- Czytelników, którzy zastanawiają się, czy to podejście da się zastosować dla mniejszej grupy agentów, gorąco zachęcam do próbowania.