AI - popularne algorytmy wyszukiwania
Wyszukiwanie to uniwersalna technika rozwiązywania problemów w AI. Istnieje kilka gier dla jednego gracza, takich jak gry kaflowe, Sudoku, krzyżówka itp. Algorytmy wyszukiwania pomagają w wyszukiwaniu określonej pozycji w takich grach.
Problemy z odnajdywaniem ścieżki jednego agenta
Gry takie jak 3X3 z ośmioma kafelkami, 4X4 z piętnastoma kafelkami i 5X5 z dwudziestoma czterema kafelkami są wyzwaniami polegającymi na znajdowaniu ścieżki dla jednego agenta. Składają się z matrycy płytek z pustą płytką. Gracz musi ułożyć płytki, przesuwając je pionowo lub poziomo w puste miejsce w celu osiągnięcia jakiegoś celu.
Inne przykłady problemów ze znajdowaniem ścieżki pojedynczego agenta to Problem komiwojażera, Kostka Rubika i Dowodzenie twierdzeń.
Wyszukaj terminologię
Problem Space- To środowisko, w którym odbywa się poszukiwanie. (Zbiór stanów i zestaw operatorów do zmiany tych stanów)
Problem Instance - To jest stan początkowy + stan celu.
Problem Space Graph- Stanowi problem. Stany są wyświetlane przez węzły, a operatory przez krawędzie.
Depth of a problem - Długość najkrótszej ścieżki lub najkrótszej sekwencji operatorów od stanu początkowego do stanu docelowego.
Space Complexity - Maksymalna liczba węzłów przechowywanych w pamięci.
Time Complexity - Maksymalna liczba tworzonych węzłów.
Admissibility - właściwość algorytmu, który zawsze znajduje optymalne rozwiązanie.
Branching Factor - Średnia liczba węzłów potomnych na wykresie przestrzeni problemu.
Depth - Długość najkrótszej ścieżki od stanu początkowego do stanu docelowego.
Strategie wyszukiwania typu Brute-Force
Są najprostsze, ponieważ nie wymagają żadnej wiedzy dziedzinowej. Działają dobrze z niewielką liczbą możliwych stanów.
Wymagania -
- Opis stanu
- Zestaw prawidłowych operatorów
- Stan początkowy
- Opis stanu celu
Przeszukiwanie wszerz
Rozpoczyna się od węzła głównego, najpierw bada sąsiednie węzły i przesuwa się w kierunku sąsiadów następnego poziomu. Generuje jedno drzewo na raz, aż do znalezienia rozwiązania. Można to zaimplementować za pomocą struktury danych kolejki FIFO. Ta metoda zapewnia najkrótszą ścieżkę do rozwiązania.
Gdyby branching factor(średnia liczba węzłów potomnych dla danego węzła) = b i głębokość = d, a następnie liczba węzłów na poziomie d = b d .
Całkowita liczba węzłów utworzonych w najgorszym przypadku to b + b 2 + b 3 +… + b d .
Disadvantage- Ponieważ każdy poziom węzłów jest zapisywany w celu utworzenia następnego, zajmuje dużo miejsca w pamięci. Wymagana przestrzeń do przechowywania węzłów jest wykładnicza.
Jego złożoność zależy od liczby węzłów. Może sprawdzić zduplikowane węzły.
Przeszukiwanie w głąb
Jest implementowany rekurencyjnie ze strukturą danych stosu LIFO. Tworzy ten sam zestaw węzłów, co metoda Breadth-First, tylko w innej kolejności.
Ponieważ węzły na pojedynczej ścieżce są przechowywane w każdej iteracji od węzła głównego do węzła-liścia, zapotrzebowanie na miejsce do przechowywania węzłów jest liniowe. Przy współczynniku rozgałęzienia b i głębokości m , przestrzeń magazynowa wynosi bm.
Disadvantage- Ten algorytm nie może kończyć się i działać w nieskończoność na jednej ścieżce. Rozwiązaniem tego problemu jest wybranie głębokości odcięcia. Jeśli idealnym punktem odcięcia jest d , a wybrana wartość odcięcia jest mniejsza niż d , to algorytm może się nie powieść. Jeśli wybrana wartość odcięcia jest większa niż d , to czas wykonania wydłuża się.
Jego złożoność zależy od liczby ścieżek. Nie może sprawdzić zduplikowanych węzłów.
Wyszukiwanie dwukierunkowe
Przeszukuje do przodu od stanu początkowego i wstecz od stanu docelowego, aż oba spotkają się, aby zidentyfikować wspólny stan.
Ścieżka ze stanu początkowego jest łączona z odwrotną ścieżką ze stanu docelowego. Każde wyszukiwanie jest wykonywane tylko do połowy całkowitej ścieżki.
Jednolite wyszukiwanie kosztów
Sortowanie odbywa się w rosnącym koszcie ścieżki do węzła. Zawsze rozwija najmniej kosztowny węzeł. Jest to identyczne z wyszukiwaniem według szerokości, jeśli każde przejście ma ten sam koszt.
Bada ścieżki w kolejności rosnących kosztów.
Disadvantage- Może istnieć wiele długich ścieżek o koszcie ≤ C *. Jednolite wyszukiwanie kosztów musi zbadać je wszystkie.
Iteracyjne pogłębianie wyszukiwania w głąb
Wykonuje przeszukiwanie wgłębne do poziomu 1, rozpoczyna od nowa, wykonuje pełne przeszukiwanie w głąb w pierwszej kolejności do poziomu 2 i kontynuuje w taki sposób, aż zostanie znalezione rozwiązanie.
Nigdy nie tworzy węzła, dopóki nie zostaną wygenerowane wszystkie niższe węzły. Oszczędza tylko stos węzłów. Algorytm kończy się, gdy znajdzie rozwiązanie na głębokości d . Liczba węzłów utworzonych na głębokości d wynosi b d, a na głębokości d-1 wynosi b d-1.
Porównanie różnych złożoności algorytmów
Zobaczmy działanie algorytmów opartych na różnych kryteriach -
Kryterium | Szerokość pierwsza | Najpierw głębokość | Dwukierunkowy | Jednolity koszt | Interaktywne pogłębianie |
---|---|---|---|---|---|
Czas | b d | b m | b d / 2 | b d | b d |
Przestrzeń | b d | b m | b d / 2 | b d | b d |
Optymalność | tak | Nie | tak | tak | tak |
Kompletność | tak | Nie | tak | tak | tak |
Świadome (heurystyczne) strategie wyszukiwania
Aby rozwiązać duże problemy z dużą liczbą możliwych stanów, należy dodać wiedzę specyficzną dla problemu, aby zwiększyć wydajność algorytmów wyszukiwania.
Funkcje oceny heurystycznej
Obliczają koszt optymalnej ścieżki między dwoma stanami. Funkcja heurystyczna dla gier z przesuwanymi kafelkami jest obliczana poprzez zliczanie liczby ruchów wykonywanych przez każdą płytkę ze stanu celu i dodanie tej liczby ruchów dla wszystkich płytek.
Czyste wyszukiwanie heurystyczne
Rozwija węzły w kolejności ich wartości heurystycznych. Tworzy dwie listy, zamkniętą listę dla już rozwiniętych węzłów i otwartą listę dla utworzonych, ale nierozwiniętych węzłów.
W każdej iteracji węzeł z minimalną wartością heurystyczną jest rozwijany, wszystkie jego węzły potomne są tworzone i umieszczane na zamkniętej liście. Następnie do węzłów potomnych jest stosowana funkcja heurystyczna i są one umieszczane na liście otwartej zgodnie z ich wartością heurystyczną. Krótsze ścieżki są zapisywane, a dłuższe usuwane.
Wyszukiwanie
Jest to najbardziej znana forma wyszukiwania Best First. Unika rozwijania ścieżek, które już są drogie, ale najpierw rozwija najbardziej obiecujące ścieżki.
f (n) = g (n) + h (n), gdzie
- g (n) koszt (dotychczas) dotarcia do węzła
- h (n) szacowany koszt dotarcia z węzła do celu
- f (n) szacunkowy całkowity koszt ścieżki przez n do celu. Jest realizowany przy użyciu kolejki priorytetów poprzez zwiększenie f (n).
Chciwy Najlepsze pierwsze wyszukiwanie
Rozszerza węzeł, który jest szacowany jako najbliższy celu. Rozwija węzły na podstawie f (n) = h (n). Jest realizowany za pomocą kolejki priorytetów.
Disadvantage- Może utknąć w pętli. To nie jest optymalne.
Lokalne algorytmy wyszukiwania
Rozpoczynają od przyszłego rozwiązania, a następnie przechodzą do rozwiązania sąsiedniego. Mogą zwrócić prawidłowe rozwiązanie, nawet jeśli zostanie przerwane w dowolnym momencie przed zakończeniem.
Wyszukiwanie wspinaczkowe
Jest to algorytm iteracyjny, który rozpoczyna się od dowolnego rozwiązania problemu i próbuje znaleźć lepsze rozwiązanie poprzez stopniową zmianę pojedynczego elementu rozwiązania. Jeśli zmiana daje lepsze rozwiązanie, jako nowe rozwiązanie przyjmuje się stopniową zmianę. Ten proces jest powtarzany, dopóki nie będzie żadnych dalszych ulepszeń.
function Hill-Climbing (problem), zwraca stan będący lokalnym maksimum.
inputs: problem, a problem
local variables: current, a node
neighbor, a node
current <-Make_Node(Initial-State[problem])
loop
do neighbor <- a highest_valued successor of current
if Value[neighbor] ≤ Value[current] then
return State[current]
current <- neighbor
end
Disadvantage - Ten algorytm nie jest ani kompletny, ani optymalny.
Wyszukiwanie wiązki lokalnej
W tym algorytmie przechowuje liczbę stanów w dowolnym momencie. Na początku stany te są generowane losowo. Następcy tych k stanów oblicza się za pomocą funkcji celu. Jeśli którykolwiek z tych następców jest maksymalną wartością funkcji celu, algorytm zatrzymuje się.
W przeciwnym razie (początkowe k stanów ik liczba następców stanów = 2k) stanów umieszcza się w puli. Pula jest następnie sortowana numerycznie. Najwyższe k stanów jest wybieranych jako nowe stany początkowe. Ten proces trwa aż do osiągnięcia maksymalnej wartości.
function BeamSearch ( problem, k ), zwraca stan rozwiązania.
start with k randomly generated states
loop
generate all successors of all k states
if any of the states = solution, then return the state
else select the k best successors
end
Symulowanego wyżarzania
Wyżarzanie to proces ogrzewania i chłodzenia metalu w celu zmiany jego wewnętrznej struktury i modyfikacji jego właściwości fizycznych. Gdy metal stygnie, jego nowa struktura zostaje zatarta, a metal zachowuje nowo uzyskane właściwości. W symulowanym procesie wyżarzania utrzymuje się zmienną temperaturę.
Początkowo ustawiamy wysoką temperaturę, a następnie pozwalamy jej powoli „ostygnąć” w miarę postępów algorytmu. Przy wysokiej temperaturze algorytm dopuszcza gorsze rozwiązania o wysokiej częstotliwości.
Początek
- Inicjalizuj k = 0; L = całkowita liczba zmiennych;
- Z i → j, wyszukaj różnicę wydajności Δ.
- Jeśli Δ <= 0 to zaakceptuj else if exp (-Δ / T (k))> random (0,1) to zaakceptuj;
- Powtórz kroki 1 i 2 dla kroków L (k).
- k = k + 1;
Powtarzaj kroki od 1 do 4, aż kryteria zostaną spełnione.
Koniec
Problem komiwojażera
W tym algorytmie celem jest znalezienie taniej wycieczki rozpoczynającej się w mieście, odwiedzającej wszystkie miasta na trasie dokładnie raz i kończącej się w tym samym mieście początkowym.
Start
Find out all (n -1)! Possible solutions, where n is the total number of cities.
Determine the minimum cost by finding out the cost of each of these (n -1)! solutions.
Finally, keep the one with the minimum cost.
end