Przeskocz do treści

Delta mi!

Krowa, las i eksploracja terenu

Marcin Bieńkowski

o artykule ...

  • Publikacja w Delcie: październik 2011
  • Publikacja elektroniczna: 02-10-2011
  • Autor: Marcin Bieńkowski
    Afiliacja: Instytut Informatyki Uniwersytetu Wrocławskiego
  • Ten artykuł został zapożyczony z Wrocławskiego Portalu Informatycznego http://informatyka.wroc.pl.

Kilkanaście lat temu zgubiłem się w lesie. Nie na tyle, żeby sytuacja była beznadziejna...

obrazek

Rys. 1

Rys. 1

obrazek

Rys. 2

Rys. 2

Wiedziałem, że zostawiłem auto przy drodze, wszedłem do lasu, gdzie spędziłem jakiś czas, chodząc, a następnie wróciłem do tej samej drogi. Dodatkowo, podczas spaceru po lesie przeciąłem swoją drogę dostatecznie dużo razy, żeby nie mieć zielonego pojęcia, czy samochodu należy szukać, idąc w lewą stronę czy w prawą. Ot, mniej więcej tak jak na rysunku 1.

To znaczy, drzewa na tyle skutecznie zasłaniały drogę, że widoczność była praktycznie zerowa. Nie miałem szans zobaczyć samochodu z odległości, musiałem się na niego natknąć.

Parę lat później (pomińmy chwilowo milczeniem to, ile się nachodziłem w drodze do samochodu) dowiedziałem się, że ktoś już wcześniej miał taki sam problem i zostało to dokładnie opisane w literaturze. A mianowicie, ten sam problem miała pewna krowa.

Krowa jaka jest, każdy widzi

obrazek

Rys. 3

Rys. 3

Krowa stoi przy prostym płocie, w którym jest wejście na pastwisko. Wejście (które jest oddalone od krowy o co najmniej jeden metr) krowa zobaczy dopiero, gdy do niego dotrze. Co powinna zrobić, żeby jak najszybciej rozpocząć zjadanie trawy? Problem ten jest jednym z najprostszych wariantów zagadnienia eksploracji terenu. Jak okaże się poniżej, prostym, lecz nie trywialnym.

Postarajmy się wyrobić sobie podstawowe intuicje. W całym artykule przez math  będziemy oznaczać początkową odległość, w metrach, dzielącą krowę od wejścia na pastwisko. Oczywiście, absolutnie genialna krowa, znająca mapę terenu, potrafi dojść na pastwisko, przeszedłszy math  metrów. Co się dzieje, jeśli krowa jest trochę głupsza, czyli nie zna mapy, nie zna math ale wie, że wejście na pastwisko jest z prawej strony? Oczywiście, idąc uparcie w tym kierunku, przejdzie też dokładnie math metrów.

A co ma zrobić krowa, jeśli w jakiś sposób poznała wartość math  (przykładowo, wie, że od wymarzonego celu dzieli ją 10 metrów), ale nie wie, czy wejście jest z lewej, czy z prawej? Może wtedy zastosować następujący algorytm z parametrem math

Algorytm Go-and-Eat(y)

1.
Idź math metrów w lewo
2.
Jeśli nie znajdziesz wejścia, zawróć do punktu startowego
3.
Idź math metrów w prawo

Łatwo obliczyć, że w najgorszym przypadku (a tylko takie przypadki interesują biedne, pechowe krowy) krowa przejdzie math  metrów (czyli w naszym przykładzie trzydzieści). Uważny Czytelnik zauważy, że to, czy krowa idzie na początku w lewo czy w prawo, w pewnym sensie nie ma znaczenia: jeśli krowa ma pecha, to wejście będzie i tak z drugiej strony niż ta, którą wybierze.

Krowa głodna to krowa zła

Prawdziwy problem krowy (który jest identyczny z moim poszukiwaniem samochodu) zaczyna się jednak wtedy, kiedy krowa nie zna ani wartości math  ani nie wie, z której strony jest wejście. Zamiast wyciągnąć gotowe rozwiązanie z kapelusza, zastanówmy się, co mogłoby pomóc krowie w tym zadaniu.

A gdyby krowa znała jakieś oszacowanie na math  na przykład znała pewną liczbę math ? Mogłaby uruchomić procedurę Go-and-Eat(D) tj. iść math  metrów w lewo, wrócić do punktu wyjścia, a następnie iść w prawo. Przebyta droga w najgorszym przypadku wynosiłaby math  Czyli jeśli math  byłoby „tylko trochę” większe od math  to otrzymalibyśmy rozwiązanie niedużo gorsze niż w przypadku, kiedy znamy math  No dobrze, ale jak znaleźć takie math ? Pomoże nam w tym często stosowana w algorytmice metoda podwajania: uruchamiamy algorytm Go-and-Eat kolejno z wartościami math Cieszą nas dwie własności.

  • Jeśli w końcu uruchomimy Go-and-Eat z potęgą liczby 2 większą od math  to krowa znajdzie pastwisko.
  • Sumaryczna droga przebyta podczas uruchamiania Go-and-Eat ze zbyt małymi wartościami parametru jest niezbyt długa. (To dopiero wykażemy.)

Ale moment! – powinien krzyknąć Uważny Czytelnik. Przecież po uruchomieniu algorytmu Go-and-Eat(1) krowa znajdzie się o 1 metr od punktu wyjścia, a algorytm Go-and-Eat(2) ma szansę zadziałać pod warunkiem, że krowa znajduje się początkowo w punkcie startowym. Możemy „załatać” algorytm, dodając do niego dodatkowy krok:

4.
Zawróć do punktu startowego

Łata na łacie

Tu mała dygresja – informatycy, jak i wszystkie umysły ścisłe, uwielbiają: a) łatanie złych rozwiązań zamiast pisania ich od nowa, b) redukcje. Do tego stopnia uwielbiają, że często wpadają w pułapki jak w opisanej niżej historii (z długaśną brodą) o czajniku:

Mamy pusty czajnik, chcemy zagotować wodę. Co zrobić? Należy oczywiście: 1. nalać wody, 2. włączyć czajnik, 3. czekać. A co zrobić, jeśli mamy pełny czajnik i chcemy zagotować wodę? To proste – odpowie prawdziwy (i leniwy) informatyk – wylewamy z niego wodę i w ten sposób doprowadzamy sytuację do przypadku, który potrafimy rozwiązać.

obrazek

Rys. 4

Rys. 4

Zastanówmy się zatem, czy przez „łatanie” algorytmu Go-and-Eat i dodanie punktu 4. nie postąpiliśmy przypadkiem jak prawdziwi informatycy (a nie chcielibyśmy tego robić, bo po co męczyć steraną życiem i mocno już wygłodniałą krowę). Zobaczmy, jak wygląda droga, po której teraz chodzi krowa.

obrazek

Rys. 5

Rys. 5

Może nie jest oczywiste, co można tutaj poprawić. Ale math pamiętacie, że to, w którą stronę krowa zaczyna wykonywanie algorytmu Go-and-Eat, nie ma znaczenia? W takim razie narysujmy drogę krowy, która nieparzyste wykonania algorytmu Go-and-Eat zaczyna w stronę lewą, a parzyste w prawą.

Bez sensu, prawda? Krowa idzie w jedną stronę math metrów tylko po to, żeby wrócić do punktu wyjścia i pójść w tę samą stronę math metrów! Wyrzućmy zatem nadmiarowe spacery (zaznaczone kolorem na poprzednim rysunku). Zmodyfikowany algorytm prezentuje się następująco:

Algorytm Smart-Cow

1.
Kierunek zwiedzania := lewo
2.
math
3.
Dopóki nie znalazłeś wejścia na pastwisko, powtarzaj:
a)
Przejdź math  metrów w kierunku zwiedzania i wróć do punktu startowego
b)
math
c)
Odwróć kierunek zwiedzania
obrazek

Rys. 6

Rys. 6

Spróbujmy teraz przeanalizować, jaki dystans pokona krowa w najgorszym przypadku. Weźmy takie naturalne math że zachodzi math  Oznacza to, że pierwsze math wykonań pętli w punkcie 3. powyższego algorytmu (z wartościami math ) nie spowoduje znalezienia pastwiska. Droga przebyta przez krowę do tego punktu wynosi

pict

Nazwijmy ten punkt krytycznym, przyda się on w dalszej części artykułu. Następnie krowa chce iść math metrów w jakimś kierunku. Oczywiście, ma pecha i idzie w kierunku przeciwnym do wejścia na pastwisko. Ten skok w niewłaściwy bok (wraz z powrotem) kosztuje ją kolejne math metrów. Następnie krowa zamierza iść math metrów, ale już po math  metrach napotyka pastwisko. Jej całkowita droga to co najwyżej

display-math

Czy naprawdę trzeba tyle chodzić?

Krótka odpowiedź brzmi: tak, każdy algorytm dla krowy wymaga w najgorszym przypadku przejścia odległości dziewięciokrotnie przekraczającej początkową odległość krowy od pastwiska. Niestety, wykazanie tego jest dość trudne i wykracza poza ramy tego artykułu. Spróbujmy jednak uspokoić swoje sumienie i sprawdzić, że krowa zawsze musi przejść co najmniej dystans math  W tym celu zauważmy, że jeśli krowa nie robi głupich wycieczek (takich jak na dwóch wcześniejszych rysunkach), to wędruje, oddalając się od punktu startowego na przemian w lewo i w prawo.

obrazek

Rys. 7

Rys. 7

Wyznacza to podział trasy krowy na kolejne fazy. Bez straty ogólności załóżmy, że na początku krowa idzie w lewo. Wtedy jej trasę można opisać liczbami math gdzie math jest oddaleniem w fazie math (W opisanym wcześniej algorytmie Smart-Cow mamy  math)

Zauważmy teraz, że krowa wybiera taką samą trasę niezależnie od tego, jakie jest math  Powyższe zdanie wydaje się oczywiste (jak trasa mogłaby od tego zależeć, skoro math  poznajemy dopiero w momencie odnalezienia pastwiska, a wtedy już nigdzie nie chodzimy?), ale warto je przeczytać więcej niż raz. Oznacza to, że dla danego wyboru trasy krowy (tj. liczb math) wystarczy postawić bramkę na pastwisko w jakimś bardzo złośliwym miejscu.

Przypatrzmy się bliżej ciągowi math Musi w nim istnieć jakaś taka kolejna para math i math że math Na powyższym rysunku jest to, na przykład, para math i math W przeciwnym przypadku ciąg math byłby ściśle malejący (a jest to dość kiepski pomysł, jeśli krowa zamierza znaleźć odległe pastwisko). Załóżmy, że odległość math krowa przechodzi w prawą stronę. Postawmy zatem bramkę kawałeczek dalej niż w odległości math po prawej stronie od punktu startowego, tj.  math

obrazek

Rys. 8

Rys. 8

Wtedy krowa przechodzi co najmniej math w prawo, potem math w lewo, a następnie (pod warunkiem, że nie jest bezdennie głupia i  math) krowa dochodzi do pastwiska, przeszedłszy odległość math  Całkowita droga przebyta przez krowę to

display-math

Ponieważ math możemy wybrać dowolnie małe i zaniedbywalne, krowa przechodzi praktycznie pięciokrotnie więcej niż math

Po co krowie pieniądze?

Jak można ułatwić życie naszej krowie? Na początku poprzedniego rozdziału powiedzieliśmy, że nie da się poprawić wyniku osiąganego przez algorytm Smart-Cow. Cóż, jest to tylko częściowa prawda. Nie można go poprawić, jeśli krowa chodzi deterministycznie. Możemy natomiast podarować jej monetę, którą może wspomóc się w trudnych chwilach (i nie chodzi nam o to, żeby kupiła sobie za to mapę czy coś do jedzenia)

Wróćmy do algorytmu Smart-Cow. Załóżmy, że w momencie, który nazwaliśmy krytycznym, krowa rzuca monetą. Jeśli wypadnie orzeł, idzie następne math metrów w prawo, w przeciwnym przypadku w lewo. Dla ustalonej pozycji bramki na pastwisko krowa ma math szansy na to, że pójdzie w jej stronę. W takim przypadku części spaceru krowy (kolorowy fragment rysunku) o długości math w ogóle nie ma! Wtedy krowa przechodzi nie math  a math  W średnim przypadku przechodzi zatem math

obrazek

Rys. 9

Rys. 9

To obniża średnią liczbę metrów przebytą przez krowę, pod warunkiem że math krowa wymyśli, iż dany moment jest krytyczny! Okazuje się jednak, że wcale nie musi tego robić. Wystarczy, żeby rzuciła monetą, wybierając kierunek na samym początku. Wtedy analiza jest dokładnie taka sama, a dodatkowo, w momencie kiedy krowa znajdzie się już w punkcie krytycznym, z prawdopodobieństwem math będzie szła w lewo, a z prawdopodobieństwem math – w prawo.

Quo vadis, droga krowo?

Powyższe rozważania to tylko czubek góry lodowej tematyki eksploracji terenu. Oprócz „prawdziwych” zastosowań, istnieje jeszcze parę lepiej lub gorzej zbadanych podstawowych problemów. Przykładowo, Czytelnik Dociekliwy może zastanowić się, jaką strategię należy obrać, jeśli jest się kapitanem, który odpłynął od brzegu i stracił orientację. Zakładamy, że linia brzegowa jest linią prostą i chcemy dopłynąć do jej dowolnego miejsca. Możemy wyobrazić sobie następujące warianty tego problemu:

  • Wiadomo, że linia brzegowa jest oddalona o 1 km, ale nie wiadomo, w którym kierunku.
  • Mamy kompas i wiemy, że linia brzegowa przebiega albo z północy na południe, albo z zachodu na wschód, nie znamy natomiast odległości od linii brzegowej. (Warto zauważyć, że jeśli wiedzielibyśmy np., że linia brzegowa przebiega z północy na południe, to jest to taki sam problem, jaki miała nasza krowa.)
  • Nic nie wiemy.

Temperować ołówki, siodłać krowy i do dzieła!