Informatyczny kącik olimpijski
Optymalna trasa łazika
Tym razem na warsztat weźmiemy zadanie Remote Rover, które pojawiło się na jednym z konkursów TopCoder w roku 2005. Naszym zadaniem jest znalezienie najszybszej trasy dla marsjańskiego łazika poruszającego się po zróżnicowanym terenie.
Teren ten możemy przedstawić jako prostokąt, w którym początkowe położenie łazika i punkt docelowy są jego przeciwległymi wierzchołkami. Prostokąt jest podzielony na poziomych pasów o różnej szerokości; każdy z pasów charakteryzuje się inną prędkością maksymalną, którą może osiągać na nim łazik. A konkretnie: -ty pas jest ograniczony prostymi oraz a łazik może na nim jechać z prędkością
Na rysunku obok przedstawiono przykładowy teren, w którym szukamy najszybszej drogi między punktami i Podzielony jest na pasy, o kolejnych szerokościach 1, 3 i 2 (wyznaczone przez proste i ) i prędkościach przejazdu i Czas przejazdu drogą w linii prostej wynosi najkrótszy zaś czas przejazdu równy uzyskamy, jadąc dłużej pasem dopuszczającym większą prędkość łazika, a konkretnie przejeżdżając przez zaznaczone kolorem punkty i
Jest jasne, że najszybsza droga między dwoma punktami na płaszczyźnie przebiega po linii prostej, ale tylko w przypadku terenu o jednakowej charakterystyce. Tak więc jeśli wyznaczymy punkty przez które łazik będzie przejeżdżał, zmieniając pasy, to droga będzie prowadzić odcinkami łączącymi te punkty.
Czas potrzebny na pokonanie tej drogi wyraża się wzorem
Naszym zadaniem jest znalezienie zmiennych minimalizujących wartość funkcji Odpowiada to znalezieniu punktu, w którym zerują się wszystkie pochodne cząstkowe funkcji Pochodna po zmiennej jest następująca:
Jeśli przez oznaczymy kąt pomiędzy linią pionową a odcinkiem łączącym punkty i to dostaniemy
zatem pochodna po upraszcza się do
Jeśli więc pochodne cząstkowe względem wszystkich zmiennych mają być równe zero, to musi być spełniony następujący układ równań:
(*) |
Zauważmy, że ustalenie wartości powoduje jednoznaczne wyznaczenie pozostałych wartości kątów, a to z kolei wyznacza nam wartości zmiennych oraz pewną wartość zmiennej przy czym niekoniecznie równą długości prostokąta. Innymi słowy, przy ustalonym układ (*) określa, jakie warunki musi spełniać najszybsza droga do górnego boku prostokąta, a uzyskana wartość oznacza położenie ostatniego punktu na tej drodze. Widać, że jest monotoniczną funkcją zmiennej (zwiększenie powoduje zwiększenie wszystkich pozostałych kątów), więc możemy zastosować wyszukiwanie binarne, aby znaleźć taką wartość że Należy jednak pamiętać o przypadku, gdy dla dużych kątów przy rozwiązywaniu układu (*) rozwiązanie nie będzie istnieć (gdy prawa strona jednego z równań będzie większa niż 1).
Na koniec wspomnijmy, że wzór (*) może być znany Czytelnikom z lekcji fizyki, gdzie pod nazwą prawa Snella opisywał zmianę kierunku biegu promienia światła przy przejściu przez granicę między dwoma ośrodkami o różnych współczynnikach załamania (zależnych od prędkości światła w tych ośrodkach). Jaki jest związek między naszym zadaniem, a zachowaniem się światła w różnych ośrodkach, pozostawiamy Czytelnikom do samodzielnego zbadania.