Wyszukiwanie struktur danych

Algorytmy wyszukiwania wymagają struktury danych do śledzenia drzewa wyszukiwania. Węzeł w drzewie jest reprezentowany przez strukturę danych z czterema komponentami:

* node.STATE: stan, któremu odpowiada węzeł;

* node.PARENT: węzeł w drzewie, który wygenerował ten węzeł;

* node.ACTION: akcja, która została zastosowana do stanu rodzica w celu wygenerowania tego węzła;

* node.PATH-COST: całkowity koszt ścieżki od stanu początkowego do tego węzła. We wzorach matematycznych używamy g(węzeł) jako synonimu PATH-COST.

Podążanie za wskaźnikami PARENT z powrotem z węzła pozwala nam odzyskać stany i działania na ścieżce do tego węzła. Robienie tego z węzła celu daje nam rozwiązanie. Potrzebujemy struktury danych do przechowywania granicy. Właściwym wyborem jest jakaś kolejka, ponieważ operacje na granicy to:

* IS-EMPTY(frontier) zwraca wartość true tylko wtedy, gdy na granicy nie ma żadnych węzłów.

* POP(frontier) usuwa górny węzeł z granicy i zwraca go.

* TOP(granica) zwraca (ale nie usuwa) górny węzeł granicy.

* ADD(node, frontier) wstawia węzeł we właściwe miejsce w kolejce.

W algorytmach wyszukiwania wykorzystywane są trzy rodzaje kolejek:

* Kolejka priorytetowa najpierw wyskakuje węzeł z minimalnym kosztem zgodnie z funkcją oceny f. Jest używany w wyszukiwaniu „najlepszy-pierwszy”.

* Kolejka FIFO lub kolejka pierwszy-w-pierwszy-wyjściowy najpierw wyskakuje węzeł, który został dodany do kolejki jako pierwszy; zobaczymy, że jest używany w przeszukiwaniu wszerz.

* Kolejka LIFO lub kolejka ostatnia-pierwsza-pierwsza (znana również jako stos) wyskakuje jako pierwszy ostatnio dodany węzeł; zobaczymy, że jest używany w poszukiwaniach dogłębnych.

Osiągnięte stany mogą być przechowywane jako tablica przeglądowa (np. tablica mieszająca), w której każdy klucz jest stanem, a każda wartość jest węzłem dla tego stanu.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *