Dziś jest poniedziałek, 8 września 2008 roku (z kalendarza...)

Gdyby oni mieli komputery

Jestem akurat w trakcie lektury "Imienia róży" Umberto Eco. Jeśli ktoś nie wie, jej akcja osadzona jest w średniowiecznym klasztorze, do którego przybywa brat Wilhelm i znajdujący się pod jego opieką nowicjusz Adso. Muszą oni rozwiązać zagadkę tajemniczych morderstw, a tropy prowadzą do zamkniętej dla świata biblioteki, która okazuje się być ogromnym labiryntem sal.

W książce umieszczona jest świetna scena, gdy obaj bohaterowie zakradli się nocą do biblioteki i zgubili się w jej wnętrzu. Wilhelm, który zdawać by się mogło, wszelką wiedzę posiadł, prezentuje wtedy pewien sposób na wydostanie się z labiryntu, w którym błądzenie bez celu jest ograniczone do minimum. Przeczytałem sobie jego opis kilka razy i doszedłem do wniosku, że jest to całkiem fajny algorytm (wreszcie - to dla tych, co się zastanawiali, czemu w kategorii "Programowanie" o literaturze nawijam :)). Paręnaście minut temu skończyłem pisać odpowiedni program. Gdyby Wilhelm i Adso mieli wtedy komputery, z pewnością byliby mi za niego wdzięczni :).

W omawianym przeze mnie algorytmie labirynt zostaje odwzorowany jako graf nieskierowany. Poszczególne węzły reprezentują sale, a ścieżki - połączenia między nimi. Przyjąłem, że węzeł o indeksie 1 to wyjście z labiryntu. Do losowego węzła wpuszczamy nieszczęśnika. Ma on przy sobie rysik i podczas wędrówki umownymi znakami zaznacza przejścia. System jest następujący:

  • Wchodząc do węzła nieodwiedzonego, ścieżkę przybycia znaczy trzema znakami.
  • Wchodząc do węzła odwiedzonego, ścieżkę przybycia znaczy jednym znakiem.
  • Wychodząc z węzła, znaczy je dwoma znakami.
  • Wychodząc z węzła przez przejście z jednym znakiem, dodaje jeszcze dwa.

Teraz: przy wyborze ścieżki, wybieramy zawsze tę o najmniejszej liczbie znaków (czyli jak mamy 0 i 1, to idziemy tą pierwszą). Pod żadnym pozorem nie wolno nam wejść do ścieżki z dwoma znakami. Jeżeli wszystkie ścieżki są oznaczone dwoma lub trzema znakami, idziemy tą z trzema. W ten sposób po pewnym czasie wrócimy się z powrotem do miejsca, gdzie zaczęliśmy ślepy zaułek.

Takie oznaczanie stopniowo będzie eliminowało nam kolejne partie labiryntu tak, że podczas naszej wędrówki w końcu trafimy do wyjścia. Wiadomo, że komputerowi, który w pamięci trzyma jednocześnie mapę labiryntu, na $#%#$% taki algorytm, ale przecież od czego jest wyobraźnia? Osobiście znalazłem już jedno interesujące zastosowanie, a mianowicie sztuczną inteligencję. Mamy strażnika, który patroluje jakiś gmach, odwiedzając wszystkie sale. Usuwamy ograniczenie "wyjścia z labiryntu" i w ten sposób strażnik będzie robić regularne obchody po budynku bez dziwnego krążenia w kółko. Co jakiś czas resetujemy mu dla zabawy :) ilości znaków w węzłach i zabawa zaczyna się od nowa :).

Nie sprawdzałem jeszcze ani dokładnej złożoności obliczeniowej, ani tego, czy algorytm ten nie nosi już przypadkiem jakiejś uczonej nazwy. Zrobię to w najbliższym czasie, przy okazji publikując kody źródłowe. Zaś jeśli chodzi o złożoność, wstępnie podejrzewam, że może to być O(mn), gdzie n - il. węzłów; m - maks. ilość ścieżek w węźle. W praktyce jednak często bywa dużo niższa. Np. na testowym labiryncie złożonym z 22 węzłów udawało się komputerowi wydostać już po 6 ruchach po wsadzeniu go w najbardziej oddalone zadupie :). Wszystko zależy od kolejności wprowadzenia ścieżek i samego algorytmu wyboru ścieżki.

Powrót

Komentarze

Napisał radziel w środę, 22 marca 2006 o 19:22

Tu się objawia fascynacja algorytmika... Mimo że czytałem tą książkę to w życiu nie przyszłoby mi do głowy doszukiwać się algorytmów w tejże scenie...

Swoją drogą przedstawione przez Ciebie rozwiązanie jest interesujące. Chciałbym zobaczyć kod :)

Napisał darkspirit w sobotę, 25 marca 2006 o 15:10

A ja zawsze myśałem, że ta książka to jakiś romans, pewnie przez telewizję. ;) Gratuluję spostrzegawczości ;)

pozdrawiam

Napisał Zyx w sobotę, 25 marca 2006 o 16:41

Jeszcze dodam, że aby szybciej wyjść z labiryntu, najlepiej jest posortować sobie wierzchołki tak, aby te o najmniejszych indeksach były bliżej wyjścia. Kiedy puściłem komputer po raz pierwszy na takim właśnie labiryncie, okazało się, że nie tylko się on wydostał, ale też zrobił to najkrótszą drogą :).

Napisał Czikulina w niedzielę, 26 marca 2006 o 18:32

Wiesz co ta lektura jest bardzo ciekawa i dlatego cię podziwiam że znalazłeś w niej dodatkowe minuty na rozpatrzenie sytuacji bohaterów która była dosyć mało fascynująca gdyż nie mieli oni zaawansowanej techniki jaką mamy dzisiaj. Ale lektura jest świetna i przeczytaj ją całą a zapewne dojdziesz do wniosku, że nawet my byśmy mogli przeżyć bez internetu czyż choć bez komputera. P.S.:Świetna strona LOKEN i twojej klasy masz talent i trzymaj się tego;)

Strona 1 z 1 :: 1

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia