Metody rozwiązywania problemów

Transkrypt

Metody rozwiązywania problemów
Elementy sztucznej inteligencji.
Materiał udostępniony na prawach rękopisu
Sławomir T.Wierzchoń
Instytut Podstaw Informatyki PAN
Instytut Informatyki Uniwersytetu Gdańskiego
2 marca 2009
2
Spis treści
1 Wstęp
1.1 Krótka historia SI . . . . . . . . . . . . . . . . .
1.1.1 Nieśmiałe próby (1943 – 1956) . . . . . .
1.1.2 Wczesny entuzjazm (1952 – 1969) . . . .
1.1.3 Doza realizmu (1966-1974) . . . . . . . .
1.1.4 Systemy oparte na wiedzy (1969 – 1979)
1.1.5 SI wkracza do przemysłu (1980-1988) . .
1.1.6 Współczesność (1987 –) . . . . . . . . .
1.2 Podsumowanie . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
5
7
7
8
9
10
11
11
11
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
13
14
16
17
19
19
20
22
23
23
23
24
24
27
28
29
29
29
29
29
3 Elementy logiki formalnej
3.1 Języki formalne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Formuły . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.2 Teoria dowodu a teoria modeli . . . . . . . . . . . . . . . . . . . . .
25
25
25
26
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2 Rozwiązywanie problemów
2.1 Systemy sztucznej inteligencji . . . . . . . . . . . .
2.2 Przestrzeń stanów . . . . . . . . . . . . . . . . . . .
2.3 Klasyfikacja problemów . . . . . . . . . . . . . . . .
2.4 Rozwiązywanie problemów w przestrzeni stanów . .
2.5 Ślepe strategie przeszukiwania . . . . . . . . . . . .
2.5.1 Przeszukiwanie wszerz i w głąb . . . . . . .
2.5.2 Strategia równomiernego kosztu . . . . . . .
2.5.3 Ograniczone przeszukiwanie w głąb . . . . .
2.5.4 Strategia iterowanego pogłębiania . . . . . .
2.5.5 Przeszukiwanie dwukierunkowe . . . . . . .
2.5.6 Porównanie ślepych strategii przeszukiwania
2.6 Przeszukiwanie heurystyczne . . . . . . . . . . . . .
2.6.1 Algorytm zachłanny . . . . . . . . . . . . .
2.6.2 Algorytm A∗ . . . . . . . . . . . . . . . . .
2.6.3 Algorytm IDA∗ . . . . . . . . . . . . . . . .
2.6.4 Algorytm SM A∗ . . . . . . . . . . . . . . .
2.6.5 Algorytmy iteracyjnego poprawiania . . . .
2.6.5.1 Algorytm wspinaczkowy . . . . . .
2.6.5.2 Symulowane wyżarzanie . . . . . .
2.6.5.3 Algorytmy ewolucyjne . . . . . . .
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
SPIS TREŚCI
3.2
3.1.3
Logika
3.2.1
3.2.2
Niesprzeczność, zupełność i rozstrzygalność
zdań . . . . . . . . . . . . . . . . . . . . .
Język formalny dla logiki zdań . . . . . . .
Interpretacja formuł logiki zdań . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
28
28
29
Rozdział 2
Rozwiązywanie problemów
Zdolność rozwiązywania problemów to jedna z cech inteligencji. Dlatego badacze zajmujący
się sztuczną inteligencja poświęcają temu problemowi tak wiele uwagi. Chodzi przy tym
o rozwiązywanie nie tylko dobrze sformułowanych i specyficznych zadań, ale o umiejętność i gotowość systemu do rozwiązywania dowolnych problemów. Takim problemem może
więc być zarówno znalezienie funkcji pierwotnej, wyznaczenie wzoru strukturalnego pewnej
substancji przy zadanym jej wzorze sumarycznym i pewnych dodatkowych informacjach,
czy też rekomendacja diagnozy wraz ze stosownym uzasadnieniem, ale także rozwiązanie
łamigłówki, rozegranie partii szachów, czy znalezienie najkrótszej drogi w grafie.
W dalszym ciągu przez „problem” będziemy rozumieli cel postawiony przed agentem1
wraz z zestawem środków zapewniających osiągnięcie owego celu. Specyfikację sposobu wykorzystania dostępnych środków, która zapewnia osiągnięcie celu nazwiemy rozwiązaniem
problemu, natomiast proces tworzenia takiej specyfikacji – przeszukiwaniem.
Obecny rozdział poświęcamy przeglądowi zagadnień związanych z tak rozumianym rozwiązywaniem problemów.
2.1
Systemy sztucznej inteligencji
Efektem rozważań dotyczących rozwiązywania problemów są inteligentne systemy zdolne
do rozwiązywania stawianych im zadań. Nazywane są one przez Nilssona [8] systemami
produkcji, a przez Russela i Norviga [10] – agentami działającymi w oparciu o cele.
Naszkicowane wyżej spojrzenie na rozwiązywanie problemów pozwala wyróżnić trzy
zasadnicze elementy: dane, które charakteryzują zarówno postawiony cel jak też i kolejne
etapy rozwiązania, operacje utożsamiane ze wspomnianym wcześniej zestawem środków,
oraz strategię sterowania odpowiedzialną za wybór kolejnych operacji.
Oddzielne traktowanie owych elementów jest charakterystyczną cechą systemów produkcji. Pozwala to z jednej strony zachować uniwersalność tworzonych systemów, a z drugiej – skoncentrować uwagę na strategiach tworzenia rozwiązania z elementów zawartych
w zbiorze operacji. Takie statyczne spojrzenie na inteligentne systemy jest typowe dla fazy
konstrukcji systemów opartych na wiedzy.
Jednakże rozwiązując problemy działamy nie w izolacji, lecz w określonym środowisku. Ponadto stawiane cele mogą ulegać pewnym modyfikacjom, może się zmieniać także
1
coś o agencie
14
ROZDZIAŁ 2. ROZWIĄZYWANIE PROBLEMÓW
wachlarz dostępnych środków. Dlatego wspomniane wyżej pojęcie agenta, który reaguje
na bodźce płynące ze środowiska i aktywnie wpływa na owo środowisko może okazać się
bardziej praktyczne i realistyczne. Agent traktowany jest zazwyczaj jako pewna funkcja
odwzorowująca bodźce na akcje, przy czym owa funkcja może być implementowana na różne sposoby: jako system produkcji, jako sieć neuronowa, sieć bayesowska, itp. Podstawową
cechą agenta powinna być racjonalność przejawiająca się między innymi podejmowaniem
najlepszych (zgodnie z pewnym ustanowionym kryterium) decyzji w każdej sytuacji i konsekwentnym zmierzaniem do celu.
Typowy sposób rozwiązywania problemów przedstawiono w postaci algorytmu 2.1.
Algorytm 2.1 System produkcji przeznaczony do rozwiązywanie problemów
WE: g – zadany cel
O – zbiór operacji
S – etapy rozwiązania (stany)
WY: r – rozwiązanie problemu
s := stan-początkowy;
r := nil
dopóki (s 6= g) {
wybierz najlepszą operację o ∈ O
dodaj o do r, tzn. r := r + o
zastosuj operację o do stanu s przekształcając go w nowy stan, tzn. s := o(s)
}
zwróć r
Jest to właściwie typowe przeszukiwanie metodą generuj-i-testuj polegające na poszukiwaniu rozwiązania poprzez serię rozwiązań cząstkowych, przekształcających kolejne fazy
procesu poszukiwania rozwiązywania za pomocą odpowiednio dobieranych operatorów. Za
wybór konkretnego operatora odpowiada zastosowana strategia wynikająca z przyjętej metody przeszukiwania.
2.2
Przestrzeń stanów
Strategia przeszukiwania przyjmuje szczególnie prostą i elegancką postać jeżeli założymy,
że przeszukiwanie odbywa się w tzw. przestrzeni stanów reprezentującej wszystkie możliwe
stany między etapem początkowym, a etapem końcowym rozwiązywanego problemu.
Pojęcie stanu jest szeroko stosowane w naukach fizycznych oraz w automatyce, która
ma ścisły związek z cybernetyką – dyscypliną związaną z początkowym okresem rozwoju
sztucznej inteligencji. Także rozwiązując problemy wygodnie jest mówić o stanach. Przestrzeń stanów można traktować jako pewien graf. Węzłami tego grafu są właśnie stany,
natomiast operatory pozwalają wskazać sąsiednie stany, tzn. stany s i s0 są swoimi sąsiadami jeżeli istnieje taki operator o, który przeprowadza stan s w stan s0 . W zależności od tego
czy skutki wykonywanych operacji są odwracalne, czy nie, graf będzie algo nieskierowany,
albo skierowany.
Pojęcia stanu i przestrzeni stanów ilustrujemy dwoma przykładami.
2.2. PRZESTRZEŃ STANÓW
15
Przykład 2.2.1. (8-ka, lub 8 puzzle) Jest to znana układanka złożona z 9 ruchomych pól.
Osiem z nich ponumerowanych jest kolejnymi liczbami naturalnymi, a jedno (przesuwne)
pole jest puste. Owo pole należy przesuwać w taki sposób, aby uzyskać zadaną konfigurację
pozostałych pól – por. rysunek 2.1. Konkretna konfiguracja reprezentuje tu aktualny stan,
natomiast zestaw ruchów jest równoważny zestawowi dostępnych operacji. Na rysunku 2.2
pokazano trzy możliwe do uzyskania stany po zastosowaniu do aktualnego stanu dostępnych
operatorów.
¤
2
3
1
1
8
4
8
7
6
5
7
2
3
4
6
5
Rysunek 2.1: Stan początkowy i docelowy w zadaniu 8-ka.
2
3
1
8
4
7
6
5
L
P
D
2
3
2
3
2
1
8
4
1
8
4
1
7
6
5
7
6
5
7
8
3
4
6
5
Rysunek 2.2: Fragment drzewa poszukiwań w problemie 8-ka. Kolejność przesuwania pustej płytki: w lewo (L), w prawo (P ), w górę (G), w dół (D). Jeżeli pewien ruch jest
niedopuszczalny w danym stanie, pomija się go.
Przykład 2.2.2. (Wieża Hanoi) Jest to kolejna, równie popularna, łamigłówka – por.
rysunek 2.3 . Dane sa trzy słupki, a na jednym z nich ulokowano trzy2 dyski o różnych
średnicach. Zadanie polega na przeniesieniu wszystkich dysków na inny słupek, przy czym:
(a) jednorazowo można przenieść tylko jeden dysk, (b) pojedynczy dysk można nałożyć
albo na pusty słupek, albo na słupek, na którym znajduje się już dysk o większej średnicy.
Jeżeli stany będziemy reprezentować jako trójki s m l gdzie poszczególne pozycje określają
numer słupka, na którym znajduje się mały (s), średni (m) i duży (l) dysk, to przestrzeń
stanów ma postać jak na rysunku 2.3.
¤
2
Jest to najprostszy wariant łamigłówki. W ogólnym przypadku można rozważać wieżę zbudowaną z
k ­ 3 dysków.
16
ROZDZIAŁ 2. ROZWIĄZYWANIE PROBLEMÓW
Rysunek 2.3: Wieża Hanoi. Przedstawionej tu sytuacji odpowiada stan (1 1 1).
Rysunek 2.4: Przestrzeń stanów dla zadania wieża Hanoi. Stanem początkowym jest stan
(1 1 1), a stanem końcowym (3 3 3).
Inne, o bardziej praktycznym zabarwieniu, problemy to: zadanie komiwojażera, poszukiwanie najkrótszej drogi łączącej wybrane punkty (np. miasta na mapie), harmonogramowanie, planowanie ruchów robota, itp.
Należy podkreślić, że na efektywność rozwiązywania problemów wpływa przyjęta reprezentacja zadania. Przede wszystkim powinno wybierać się takie reprezentacje, które
gwarantują minimalny rozmiar przestrzeni stanów. Wybór odpowiedniej reprezentacji jest
sztuką. Przykładowo, w zadaniu 8-królowych polegającym na takim rozmieszczeniu figur na
szachownicy o wymiarach 8 × 8, aby żadna z nich nie zagrażała pozostałym – por. rysunek
2.5. Z warunków zadania wynika, że każda figura powinna być ulokowana w innym wierszu
i innej kolumnie niż pozostałe figury. Zatem konkretny stan wystarczy reprezentować przez
8-wymiarowy wektor, którego i-ta pozycja wskazuje numer wiersza, w którym występuje
figura zajmująca pole należące do i-tej kolumny.
2.3
Klasyfikacja problemów
Russel i Norvig [10] wyróżniają, w zależności od tego jaka wiedzą o środowisku dysponuje
agent, cztery klasy problemów.
Jeżeli jego wiedza jest doskonała, mamy do czynienia z problemami jednostanowymi,
w których zastosowanie operatora o do stanu s pozwala uzyskać kolejny, jednoznacznie
wyznaczony, stan s0 = o(s). Oba wcześniejsze przykłady są ilustracją takich właśnie problemów.
Jeżeli wiedza o świecie jest niedoskonała – mamy do czynienia z problemami wielostanowymi. Np. agent nie ma pewności jaki jest stan początkowy s0 ; wie jedynie, że s0 ∈ S0 ,
gdzie S0 jest pewnym podzbiorem zbioru stanów. W takim wypadku działanie operatorem o przeprowadza podzbiór St w inny podzbiór St+1 gdzie t = 0, 1, . . . jest indeksem
2.4. ROZWIĄZYWANIE PROBLEMÓW W PRZESTRZENI STANÓW
8
8
7
7
6
6
5
5
4
4
3
3
2
2
1
1
1
2
3
4
5
6
7
8
17
Q
Q
Q
Q
Q
Q
Q
Q
1
2
3
4
5
6
7
8
Rysunek 2.5: Problem 8-królowych. (a) Pola blokowane przez figurę ustawioną w zaznaczonym czarnym kolorem polu (4, 5). (b) Konfiguracja (3 1 4 7 6 8 5 2) wraz z zaznaczonymi pogrubioną linią trzema niewłaściwymi położeniami figur.
oznaczającym kolejny etap. Z podobnym efektem mamy do czynienia wówczas, gdy efekt
zastosowania operatora o prowadzi do różnych skutków (np. na skutek niedoskonałości
sprzętu realizującego dana operację).
Jeżeli przejścia do kolejnych stanów są obarczone ryzykiem błędu mamy do czynienia z trzecią grupą problemów, problemów awaryjnych, które wymagają bardzo ostrożnego
rozwiązywania. Po niemal każdej operacji należy sprawdzać, czy doprowadziła ona do oczekiwanego stanu, czy też należy wykonać dodatkowe czynności „naprawcze”. Z taką sytuacją
stykamy się np. w zadaniach planowania.
Wreszcie do czwartej, najtrudniejszej, grupy należą te problemy, w których agent nie
posiada informacji o skutkach podejmowanych działań. Wyobraźmy sobie, że musimy wyznaczyć trasę z miasta A do miasta B w nieznanym kraju i bez korzystania z mapy. Są
to problemy eksploracyjne, do rozwiązywania których stosuje się zaawansowane techniki
uczenia maszynowego (np. tzw. uczenie ze wzmocnieniem).
2.4
Rozwiązywanie problemów w przestrzeni stanów
Podstawowymi elementami definicji problemu, w ramach rozważanego obecnie formalizmu,
są stany i operacje. Bardziej precyzyjnie, aby stosować formalizm przestrzeni stanów,
musimy wyróżnić:
– Stan początkowy s0 , ewentualnie zbiór stanów początkowych S0 .
– Stan docelowy g, ewentualnie zbiór stanów docelowych G.
– Zbiór dostępnych operacji, które mogą być stosowane w określonym stanie. Często
operacje nazywane są ruchami, szczególnie gdy agent rozwiązuje gry lub łamigłówki
logiczne.
18
ROZDZIAŁ 2. ROZWIĄZYWANIE PROBLEMÓW
W takim kontekście przestrzeń stanów to nic innego jak zbiór stanów osiągalnych ze
stanu początkowego po wykonaniu skończonej sekwencji ruchów.
Formalnie należałoby określić jeszcze procedurę testującą, czy aktualny stan jest stanem
końcowym, lub też czy należy do zbioru stanów końcowych.
Dowolną ścieżkę łączącą stan początkowy ze stanem spełniającym warunek zatrzymania, a więc takim stanem, dla którego powyższa procedura zwraca wartość true nazywamy
rozwiązaniem. Aby wybierać między alternatywnymi rozwiązaniami, należy przypisać im
określony koszt. Ten koszt, nazywany też kosztem ścieżki, jest zazwyczaj sumą kosztów
związanych ze stosowaniem operacji generujących kolejne węzły leżące na ścieżce łączącej
stan początkowy z końcowym.
Podstawowy algorytm przeszukiwania przestrzeni stanów zapisano w postaci pseudokodu 2.2. Przestrzeń stanów wygodnie jest wyobrażać sobie jako graf GS = (V, E), którego
zbiór węzłów V reprezentuje wszystkie możliwe stany rozwiązywanego problemu, zaś E to
zbiór krawędzi, przy czym para (v, w) ∈ E tylko wtedy, gdy istnieje operacja przeprowadzająca stan v w nowy stan w. Jeżeli dozwolone jest cofanie ruchów, mamy do czynienia z
procesem odwracanym i GS jest grafem nieskierowanym. W przypadku przeciwnym mamy
do czynienia z grafem skierowanym.
Algorytm 2.2 Podstawowy algorytm przeszukiwania przestrzeni stanów
WE: R – lista węzłów do rozwinięcia
W – lista zbadanych węzłów
N – operator zwracający listę sąsiadów danego węzła
w0 – węzeł początkowy
wg – węzeł końcowy
WY: p – ścieżka łącząca węzeł początkowy z węzłem końcowym
begin
W := {w0 }
R := N (w0 )
dopóki nie osiągnięto węzła końcowego {
wybierz węzeł w z listy R
dodaj ten węzeł do listy odwiedzonych węzłów, W := W ∪ {w}
dodaj nieodwiedzonych sąsiadów węzła w do listy R, tzn. R := R ∪ (N (w)\W
}
zwróć ścieżkę p łączącą węzeł w0 z węzłem wg
end
Należy zauważyć, że nie jest konieczne (a czasami wręcz niemożliwe) przechowywanie
w pamięci komputera całej przestrzeni stanów. Dysponując grafem GS można łatwo
skonstruować funkcję N : V → 2V , która każdemu węzłowi w ∈ GS przypisuje zbiór jego
sąsiadów. W istocie N (w) to nic innego, jak zbiór stanów, w jakie można przekształcić
aktualny stan reprezentowany przez węzeł w za pomocą dostępnych operacji (ruchów).
Wówczas, wychodząc z pewnego węzła w0 i odwiedzając jego sąsiadów, a następnie
sąsiadów tych sąsiadów itd., można wędrować po całym grafie. Taką filozofię reprezentuje
algorytm 2.2. Lista R zawiera węzły, które można odwiedzić w kolejnych krokach,
natomiast lista W zawiera węzły już zbadane. Analizując zawartość tej listy rekonstruuje
się następnie ścieżkę łączącą węzeł początkowy z węzłem końcowym. W takim formalizmie
2.5. ŚLEPE STRATEGIE PRZESZUKIWANIA
19
problem poszukiwania rozwiązania sprowadza się do wyboru strategii odpowiedzialnej za
pobieranie kolejnych węzłów z listy R. Strategie przeszukiwania oceniane są ze względu na
cztery aspekty:
(a)
(b)
(c)
(d)
Kompletność: czy strategia pozwala zawsze znaleźć rozwiązanie, o ile ono istnieje?
Złożoność czasowa: ile czasu zajmie znalezienie rozwiązania?
Złożoność pamięciowa: jak dużej pamięci potrzeba, aby uzyskać rozwiązanie?
Optymalność: Czy strategia gwarantuje znalezienie najlepszego spośród wszystkich
możliwych rozwiązań?
Ogólnie, strategie dzieli się na:
(i) ślepe strategie przeszukiwania, a więc takie, w których wybór kolejnego węzła zależy
od porządku, w jakim kolejne węzły są dodawane do listy R, oraz
(ii) strategie heurystyczne (poinformowane), w których wybór węzła zależy od pewnych
priorytetów nadawanych węzłom z listy R poprzez odwołanie się do wiedzy heurystycznej.
Poniżej omawiamy szczegółowo reprezentantów obu typów strategii.
2.5
Ślepe strategie przeszukiwania
Wyróżnia się sześć strategii ślepego przeszukiwania. Różnią sie one nie tylko porządkiem,
w jakim rozwijane są kolejne węzły, ale także i jakością zwracanych rozwiązań.
2.5.1
Przeszukiwanie wszerz i w głąb
Zarówno przeszukiwanie grafu GS metodą w głąb jak i wszerz to podstawowe algorytmy
grafowe. Posiadają one szerokie zastosowanie jako składowe bardziej złożonych algorytmów.
Np. przeszukiwanie wszerz wykorzystywane jest w algorytmie badania spójności grafu, a
przeszukiwanie w głąb stosowane jest w takich algorytmach, jak: sortowanie topologiczne,
algorytm Kruskala czy Prima.
W pierwszym przypadku R implementowane jest jako stos, albo kolejka LIFO3 . Innymi
słowy, sąsiedzi aktualnego węzła w wstawiani są na początek listy, z której pobiera się
pierwszy element. Z kolei w przypadku strategii wszerz elementy zbioru N (w) dodawane
są na koniec listy R; mamy tu więc do czynienia z kolejką typu FIFO4
Aby porównać obie te strategie załóżmy, że każdy węzeł posiada dokładnie b następników
i załóżmy, że węzeł celowy znajduje się w grafie GS na głębokości d. W przypadku metody
wszerz należy w najgorszym razie rozwinąć
1 + b + b2 + · · · + bd
3
4
Skrót od Last In, First Out, tzn. „ostatni przyszedł, pierwszy obsłużony”.
Skrót od FIFO, tzn. „pierwszy przyszedł, pierwszy obsłużony”.
20
ROZDZIAŁ 2. ROZWIĄZYWANIE PROBLEMÓW
węzłów. Zatem przeszukiwanie to charakteryzuje się wykładniczą złożonością czasową i
pamięciową. Jednak gwarantuje ono znalezienie rozwiązania, a ponadto jest to rozwiązanie
optymalne.
Przeszukiwanie metodą w głąb charakteryzuje się wykładniczą złożonością czasową
O(bm ) gdzie m jest głębokością drzewa poszukiwań oraz liniową złożonością pamięciową
O(bm). Nie gwarantuje jednak znalezienia rozwiązania, ani jego optymalności.
Mówi się, że jeżeli celem przeszukiwania jest odnalezienie docelowego węzła o pożądanych własnościach, to strategia w głąb ma szanse znaleźć ten węzeł szybciej niż strategia
wszerz. Jeżeli w przestrzeni przeszukiwań istnieją ścieżki nieskończonej długości, nie można
zagwarantować, że strategia w głąb nie wybierze takiej właśnie ścieżki. Natomiast jeżeli celem przeszukiwania jest znalezienie najkrótszej ścieżki łączącej węzeł początkowy z węzłem
celowym, to stosując strategię wszerz mamy gwarancję jej wyznaczenia, nawet w przypadku
występowania nieskończonych ścieżek.
2.5.2
Strategia równomiernego kosztu
Chociaż przeszukiwanie wszerz gwarantuje znalezienie „najpłytszego” rozwiązania, w ogólnym przypadku nie musi to być rozwiązanie najtańsze. Aby znaleźć takowe, stosuje się
strategię równomiernego kosztu, w której rozwija się zawsze węzeł w o najniższym koszcie
ścieżki, g(w). Ów koszt jest sumą kosztów przypisanych krawędziom należącym do ścieżki
łączącej węzeł początkowy w0 z węzłem w. Zatem g(w0 ) = 0 oraz g(v) = g(w) + κ(w, v)
dla każdego sąsiada v węzła w, natomiast κ(w, v) ­ 0 jest kosztem przejścia z w do v.
Taka definicja zapewnia, że dla dowolnej pary (w, v) węzłów, w której v ∈ N (w) koszt
ścieżki nigdy nie maleje, tzn. g(v) ­ g(w). Jest to warunek konieczny na to, aby strategia
równomiernego kosztu generowała ścieżkę o najniższym koszcie. Tutaj niewizytowany węzeł
v ∈ N (w) dodawany jest do listy R tylko wówczas, gdy albo nie ma go na liście R, albo też
w R istnieje węzeł v ale przypisano mu większy koszt.
Aby rozróżniać między identycznymi węzłami, którym przypisuje się różny koszt potrzebujemy bardziej wyrafinowanej struktury do reprezentacji pojedynczego węzła v ∈ V .
Powinna ona zawierać nie tylko informacje o koszcie dojścia do tego węzła, ale także informację o jego poprzedniku, czyli tym węźle w, którego aktualnym sąsiadem jest badany
właśnie węzeł w. Poniższy fragment kodu przedstawia przykładową strukturę węzła zapisaną w języku Java:
public class Node {
State stan;
//informacja o aktualnym stanie
Node ojciec;
//informacja o bezpośrednim poprzedniku aktualnego węzła
int g;
//koszt przejścia ze stanu początkowego do aktualnego stanu
}
Algorytm przeszukiwania przestrzeni rozwiązań metodą równomiernego kosztu przedstawiono w postaci pseudokodu 2.3. Ostatni krok wewnętrznej pętli w tym algorytmie jest
równoważny dodawaniu do listy R tylko tych nieodwiedzonych węzłów v, które albo nie
występują na niej, albo też już tam się pojawiły, ale przypisany im koszt g(v) jest większy
od aktualnie obliczonego. Rezygnując z takiego sprawdzania oszczędzamy czas konieczny
na przejrzenie listy R.
2.5. ŚLEPE STRATEGIE PRZESZUKIWANIA
21
Algorytm 2.3 Algorytm przeszukiwania metodą równomiernego kosztu
WE: R – lista węzłów do rozwinięcia
W – lista zbadanych węzłów
N – operator zwracający listę sąsiadów danego węzła
w0 – węzeł początkowy
wg – węzeł końcowy
κ : V × V → R – koszt przejścia od węzła w do jego sąsiada
g : V → R – koszt ścieżki od w0 do aktualnego węzła
WY: p – ścieżka łącząca węzeł początkowy z węzłem końcowym
begin
w0 .g = 0;
W := {w0 };
oceń sąsiadów węzła w0 , tzn. dla każdego węzła w ∈ N (w0 ) wyznacz w.g = κ(w0 , w);
zapamiętaj ocenionych sąsiadów, R := N (w0 );
dopóki nie osiągnięto węzła końcowego {
jeżeli R = nil to wypisz komunikat Porażka i zakończ przeszukiwanie;
z listy R wybierz węzeł w o najniższym koszcie g(w);
jeżeli w = wg to wypisz komunikat Sukces, zwróć ścieżkę p łączącą węzeł w0 z
węzłem wg i zakończ przeszukiwanie;
usuń węzeł w z listy R i dodaj go do listy W odwiedzonych węzłów;
oceń sąsiadów węzła w, tzn. wyznacz g(v) = g(w) + κ(w, v) dla v ∈ N (w);
dodaj do listy R wszystkich nieodwiedzonych sąsiadów węzła w;
}
end
Jednym z typowych zastosowań algorytmu jest poszukiwanie najkrótszej trasy, co ilustruje poniższy przykład.
Przykład 2.5.1. Rozważmy uproszczoną mapę komunikacyjną Rumunii przedstawioną na
rysunku 2.6 pochodzącym z [10]. Interesuje nas znalezienie najkrótszej drogi łączącej dwa
miasta: Arad i Bucharest. Kolejne etapy przeszukiwania prze3dstawiono w tablicy 2.1. Dla
zwiększenia czytelności stosujemy tam 3-literowe symbole odpowiadające trzem pierwszym
literom w nazwie odpowiedniego miasta. Dla przykładu zapis [Tim(Ara), 118] oznacza
węzeł, którego pole stan = Tim, pole ojciec = Ara, natomiast koszt ścieżki dodarcia do
Timisoary przez Arad jest równy 118. W przypadku węzłów wymienianych w kolumnie
oznaczonej N (w) podajemy tylko nazwę miasta i koszt κ(w, v) dotarcia do niego z aktualnie
badanego miasta w.
Pobierając węzeł [Buc(Pit), 450], t = 13, stwierdzamy, że: (a) długość trasy łączącej
interesujące nas miasta jest równa 450 km. Znając zawartość listy W :
[Ara, 0], [Zer(Ara), 75], [Tim(Ara), 118], [Sib(Ara), 140], [Ora(Zer), 146],
[Rim(Sib), 220], [Lug(Tim), 229], [Fag(Sib), 239], [Meh(Lug), 299], [Pit(Rim),
317], [Cra(Rim), 366], [Dob(Meh), 374]
z łatwością rekonstruujemy właściwą trasę: Buc - Pit - Rim - Sib - Ara.
¤
Powyższy przykład ilustruje zasadniczą wadę strategii równomiernego kosztu: błądzi
ona badając nieistotne węzły, a tym samym jest ona czasowo złożona.
22
ROZDZIAŁ 2. ROZWIĄZYWANIE PROBLEMÓW
Oradea
71
75
Neamt
Zerind
87
151
Iasi
Arad
140
Sibiu
92
99
Fagaras
118
Timisoara
111
Vaslui
80
Rimnicu Vilcea
Lugoj
Pitesti
97
142
211
70
98
Mehadia
75
Dobreta
146
85
101
86
138
Bucharest
120
Craiova
Hirsova
Urziceni
90
Giurgiu
Eforie
Rysunek 2.6: Uproszczona mapa drogowa Rumunii. (Źródło: [10].)
t
0
1
w
N (w)
Ara
2
Zer
[Zer, 75], [Sib, 140],
[Tim, 118]
[Ara, 75], [Ora, 71],
3
Tim
[Ara, 118], [Lug, 111],
4
Sib
5
Ora
6
Rim
7
Lug
[Ara, 140], [Far, 99],
[Rim, 80]
[Zer, 71], [Sib, 151],
[Rim, 80]
[Zer, 71], [Sib, 80],
[Pit, 97], [Cra, 146]
[Tim, 111], [Meh, 70]
8
Fag
[Buc, 211], [Sib, 99]
9
Meh
[Lug, 70], [Dob, 75]
10
Pit
[Rim, 97], [Buc, 101]
11
12
12
Cra
Dob
Buc
[Dob, 120], [Pit, 138]
[Meh,75], [Cra, 120]
R
{Ara}
[Zer(Ara), 75], [Sib(Ara), 140],
[Tim(Ara), 118]
[Sib(Ara), 140], [Tim(Ara), 118]
[Ora(Zer), 146]
[Sib(Ara), 140], [Ora(Zer), 146],
[Lug(Tim) 229]
[Ora(Zer), 146], [Lug(Tim) 229],
[Fag(Sib), 239], [Rim(Sib), 220]
[Lug(Tim) 229], [Fag(Sib), 239],
[Rim(Sib), 220]
[Lug(Tim) 229], [Fag(Sib), 239],
[Cra(Rim), 366], [Pit(Rim), 317]
[Fag(Sib), 239], Cra(Rim), 366],
[Pit(Rim), 317], [Meh(Lug), 299]
[Cra(Rim), 366], [Pit(Rim), 317],
[Meh(Lug), 299], [Buc(Fag), 450]
[Cra(Rim), 366], [Pit(Rim), 317],
[Buc(Fag), 450], [Dob(Meh), 374]
[Cra(Rim), 366], [Buc(Fag), 450],
[Dob(Meh), 374]
[Buc(Fag), 450], [Dob(Meh), 374]
[Buc(Fag), 450]
W
[Ara, 0]
W ∪ [Zer(Ara), 75]
W ∪ [Tim(Ara), 118]
W ∪ [Sib(Ara), 140]
[Tim(Ara), 118],
W ∪ [Ora(Zer), 146]
W ∪ [Rim(Sib), 220]
W ∪ [Lug(Tim), 229]
W ∪ [Fag(Sib), 239]
W ∪ [Meh(Lug), 299]
W ∪ [Pit(Rim), 317]
W ∪ [Cra(Rim), 366]
W ∪ [Dob(Meh), 374]
Tablica 2.1: Etapy znajdowania najkrótszej trasy z Arad do Bucuresti w oparciu o mapę z
rysunku 2.6.
2.5.3
Ograniczone przeszukiwanie w głąb
Przeszukiwanie w głąb z ograniczeniem na głębokość l, tzn. węzły na głębokości l nie
mają następników. Tutaj problemem jest wybór właściwej głębokości l (nazywanej średnicą
2.5. ŚLEPE STRATEGIE PRZESZUKIWANIA
23
przestrzeni poszukiwań)
2.5.4
Strategia iterowanego pogłębiania
W przypadku iterowanego pogłębiania wykonuje się przeszukiwanie w głąb ograniczone do
pewnej głębokości l. Jeżeli przeszukiwanie nie kończy sie sukcesem, zwiększa się wartość
parametru l, tzn. l = l + 1 i ponownie rozpoczyna ograniczone przeszukiwanie w głąb.
każdorazowo przeszukiwanie rozpoczyna się od początkowego węzła wo .
Będąc zupełną i optymalną, jest to bardzo popularna metoda przeszukiwania. Wadą
przeszukiwania wszerz jest duża złożoność pamięciowa, natomiast wadą metody w głąb
jest jej niezupełność. Iterowane pogłębianie jest efektywnym kompromisem między tymi
dwiema metodami. Z uwagi na ograniczoność przeszukiwania możliwe jest uzyskanie rozwiązania tej samej jakości co w metodzie wszerz, lecz bez zużycia tak dużej pamięci. Pomimo
wielokrotnego rozwijania tych samych węzłów, pesymistyczne zużycie pamięci jest niewiele
większe niż w metodzie wszerz. Istotnie, przypuśćmy, że rozwiązanie znajduje się na głębokości d. W przypadku przeszukiwania metodą wszerz należy w najgorszym przypadku
przejrzeć
nw =
d
X
bi
i=0
węzłów, natomiast stosując metodę iterowanego pogłębiania przeglądamy
nip
d
X
(d + 1 − i)bi
i=0
węzłów. Przypuśćmy, że d = 10 i każdy węzeł ma b = 5 potomków. Wówczas nw = 12207031,
natomiast nip = 15258786, co oznacza, że nip = 1.25nw .
2.5.5
Przeszukiwanie dwukierunkowe
Rozpoczynamy przeszukiwanie w przód rozpoczynając od węzła początkowego i równocześnie przeszukiwanie w tył rozpoczynając od węzła końcowego.
O ile przeszukiwanie w przód jest tożsame, że znanym dotychczas rozwijaniem sąsiadów
badanego węzła, potem sąsiadów tych sąsiadów, itd., o tyle przeszukiwanie w tył wymaga
dysponowania listą poprzedników danego węzła, P (w). Do P (w) zaliczamy te wszystkie
węzły, których sąsiadem (następnikiem) jest w. Oczywiście, jeżeli dopuszczalne w rozwiązaniu danego problemu operacje sa odwracalne, to jeżeli v ∈ N (w) wówczas w ∈ P (v). W
ogólności wyznaczanie poprzedników jest procesem złożonym i kosztownym.
Możliwość stosowania przeszukiwania dwukierunkowego wymaga także sprawdzania,
czy węzeł, który właśnie jest rozwijany w jednym drzewie, nie wystąpił już w drugim
drzewie przeszukiwań.
2.5.6
Porównanie ślepych strategii przeszukiwania
Załóżmy, jak poprzednio, że w grafie reprezentującym przestrzeń poszukiwań każdy węzeł
ma b potomków, d oznacza głębokość, na której występuje rozwiązanie, m jest maksymalną głębokością drzewa, a l jest ograniczeniem na głębokość przeszukiwania. Własności
poszczególnych strategii ilustruje tabela 2.2.
24
ROZDZIAŁ 2. ROZWIĄZYWANIE PROBLEMÓW
Strategia
Wszerz
W głab
Równomiernego
kosztu
Ograniczone
przeszukiwanie
w głąb
Iteracyjne
pogłębianie
Dwukierunkowa
(o ile stosowalna)
Kompletność
Optymalność
Złożoność
czasowa pamięciowa
bd
bd
bm
bm
Tak
Nie
Tak
Nie
Tak
Tak
bd
bd
Tak,
gdy l ­ d
Nie
bl
bl
Tak
Tak
bd
bd
Tak
Tak
bd/2
bd/2
Tablica 2.2: Odpowiedniość między etapami procesu schładzania i etapami procesu wyznaczania optimum
2.6
Przeszukiwanie heurystyczne
Jeżeli w algorytmie ślepego przeszukiwania wiedza o problemie zostanie wykorzystana do
porządkowania listy R, to otrzymamy algorytm przeszukiwania heurystycznego. Do porządkowania węzłów stosuje się tzw. funkcję oceniającą, f : V → R, która każdemu węzłowi
przypisuje jego atrakcyjność, czy też potencjalną korzyść z jego rozwinięcia. Zakładając,
że rozwija się węzeł, któremu odpowiada najbardziej atrakcyjna ocena, otrzymujemy tzw.
strategię pierwszy najlepszy. Algorytm realizujący tę strategię jest identyczny z algorytmem 2.3 z tą różnicą, że rolę występującej tam funkcji g pełni teraz funkcja oceniająca f .
2.6.1
Algorytm zachłanny
Najprostszym wariantem strategii pierwszy najlepszy jest strategia zachłanna, w której
do oceny atrakcyjności węzła korzysta się wyłącznie z funkcji heurystycznej h : V → R.
Każdemu węzłowi przypisuje ona szacowany koszt najkrótszej ścieżki od tegoż węzła do
węzła celowego vg . Za h można przyjąć w zasadzie dowolną funkcję, o ile tylko dla każdego
węzła v ∈ V będzie ona spełniać następujące warunki:
(i) h(v) ­ 0,
(ii) h(v) ¬ h∗ (v),
(iii) h(vg ) = 0
gdzie h∗ (v) jest rzeczywistym kosztem ścieżki od węzła v do węzła docelowego.
Heurystykę spełniającą powyższe warunki nazywamy dopuszczalną. Np. w zadaniu poszukiwania najkrótszej drogi na mapie rolę takiej funkcji może pełnić odległość między
aktualnie rozwijanym węzłem, a węzłem docelowym.
Wersję oryginalnego problemu, dla której koszt rozwiązania nigdy nie przekracza kosztu
rozwiązania oryginalnego problemu nazywamy problemem uproszczonym.
2.6. PRZESZUKIWANIE HEURYSTYCZNE
25
Przykład 2.6.1. Poszukiwanie najkrótszej drogi jest jednym z kluczowych zadań m.in.
w takich problemach jak sterowanie robotem, czy gry komputerowe. Reprezentacją często
stosowaną do znalezienia właściwego rozwiązania jest pokrycie przestrzeni, w jakiej porusza
się agent, regularną (np. kwadratową) siatką. Dzięki temu ciągłą przestrzeń poszukiwań
zastępuje się skończoną liczbą połączonych ze sobą węzłów. Przykład takiego postępowania
przedstawiono w pierwszej kolumnie pierwszego od góry wiersza na rysunku 2.7. Czarny
prostokąt oznacza tu przeszkodę, a zadanie polega na znalezieniu trasy łączącej punkt
startowy, oznaczony literą S z, leżącym po drugiej stronie przeszkody, punktem końcowym
zaznaczonym jako szary kwadrat.
Załóżmy, że agent może poruszać się w jednym z ośmiu kierunków, por. prawy rysunek
w pierwszym rzędzie na rys. 2.7. Jako funkcję heurystyczną przyjmuje się często odległość
Manhattan między aktualnym położeniem agenta, a punktem docelowym. W niniejszym
przykładzie odległość tę mnożono przez 10. Kolejne rysunki przedstawiają analizowana
sekwencję ruchów, a ostateczną trasę przedstawiono w prawej kolumnie w ostatnim wierszu
rysunku 2.7.
¤
Sposób przeszukiwania za pomocą strategii zachłannej przypomina nieco przeszukiwanie
metodą w głąb: algorytm podąża wzdłuż ścieżki wskazującej cel. W przypadku, gdy ścieżka
okazuje sie nieefektywna, następuje powrót do jednego z wcześniej wizytowanych węzłów.
Podobnie jak przeszukiwanie w głąb tak i przeszukiwanie zachłanne nie jest ani zupełne,
ani optymalne. Ponadto, algorytm często „błądzi” wykonując zbędne ruchy.
Przykład 2.6.2. Dla przykładu rozpatrzmy ponownie problem wyznaczenia najkrótszej
trasy z Arad do Bucuresti badany w przykładzie 2.5.1. Wartości funkcji heurystycznej, reprezentujące odległość w linii prostej z danego miasta do miasta docelowego przedstawiono
w poniższej tablicy:
Miasto
Arad
Bucharest
Craiova
Dobreta
Eforie
Fagaras
Giurgiu
Hirsova
Iasi
Lugoj
Odległość
366
0
160
242
161
178
77
151
226
244
Miasto
Mehadia
Neamt
Oradea
Pitesti
Rimnicu Vilcea
Sibiu
Timisoara
Urziceni
Vaslui
Zerind
Odległość
241
234
380
98
193
253
329
80
199
374
Tablica 2.3: Odległość w linii prostej z danego miasta do miasta docelowego
Algorytm wybiera najpierw sąsiada miasta Arad, któremu przypisano najniższą wartość
heurystyki – jest to Sibiu, następnie sąsiada tego miasta, czyli Fagaras, a stąd wybiera się
już miasto docelowe – por. rys. 2.6.1. Długość wygenerowanej w ten sposób trasy jest
równa 450 w porównaniu trasą o długości 412 km uzyskaną przez zastosowanie strategii
równomiernego kosztu.
¤
26
ROZDZIAŁ 2. ROZWIĄZYWANIE PROBLEMÓW
S
G
S
G
50
40
60
50
40
40
30
50
40
30
50
40
60
50
40
60
50
40
50
40
50
40
20
60
50
40
60
50
40
50
40
30
50
40
30
60
50
40
60
50
40
60
50
40
60
50
40
50
40
50
40
30
60
50
40
20
50
40
30
10
60
50
40
60
50
10
60
50
60
40
50
30
30
20
40
20
10
30
10
50
40
60
50
20
40
Rysunek 2.7: Kolejno wizytowane stany w zadaniu poszukiwania najkrótszej drogi w labiryncie. Punkt startowy oznaczono jako szary kwadrat z literą S, a punkt docelowy –
jako szary kwadrat. Czarny prostokąt oznacza przeszkodę. Dopuszczalne kierunki ruchu
zaznaczono w pierwszej kolumnie pierwszego wiersza. Ostateczną trasę zaznaczono szarymi kwadratami w prawej kolumnie ostatniego wiersza. Przekreślone kwadraty reprezentuję
wizytowane węzły. Liczby wewnątrz kwadratów oznaczają wartości funkcji heurystycznej.
W powyższym przykładzie stosunkowo szybko znaleziono rozwiązanie sub-optymalne.
Jednakże próba znalezienia drogi z Iasi do Fagaras na mapie z rysunku 2.6 nie jest już tak
owocna. Algorytm wybiera jako pierwsze miasto Neamt i ponownie (przy braku listy W )
wizytuje Iasi, skąd wraca do Neamt.
Ogólnie, strategia zachłanna jest strategią zupełną jeżeli eliminuje się powtarzające się
stany, a więc jeżeli używa się listy W . Nie jest to jednak strategia optymalna. Ponadto
2.6. PRZESZUKIWANIE HEURYSTYCZNE
27
Arad
374
Zerind
366
Sibiu
178
Arad
Fagaras
253
Sibiu
329
253
Timisoara
380
Oradea
193
Rimnicu
0
Bucharest
Rysunek 2.8: Rozwiązanie problemu znalezienia najkrótszej drogi z przykładu 2.5.1 za
pomocą strategii zachłannej.
charakteryzuje ją duża złożoność czasowa i pamięciowa, O(bm ), gdzie jak poprzednio m
to maksymalna głębokość drzewa, a b to maksymalna liczba sąsiadów węzła. Warto jednak pamiętać, że wybór odpowiedniej heurystyki pozwala znacząco zredukować złożoność
czasową.
2.6.2
Algorytm A∗
W 1968 roku Peter Hart, Nils Nilsson oraz Bertram Raphael zaproponowali niezwykle
efektywny wariant przeszukiwania metodą pierwszy najlepszy – algorytm A∗ . Odnajduje
on najkrótszą ścieżkę pomiędzy dwoma danymi wierzchołkami grafu (lub dokładniej, między wierzchołkiem początkowym a dowolnym z wierzchołków docelowych). wykorzystując
specjalnie skonstruowaną funkcję oceny f , która reprezentuje szacowany koszt rozwiązania
zawierającego węzeł w. Funkcja ta obliczana jest jako
f (w) = g(w) + h(w)
(2.1)
gdzie g(w) jest rzeczywistym kosztem ścieżki od węzła początkowego do aktualnie rozwijanego węzła w, natomiast h(w) to szacowany koszt najtańszej ścieżki z w do wg . Jak w
przypadku strategii zachłannej, h powinna być heurystyką dopuszczalną, tzn. nie może ona
przeszacowywać rzeczywistego kosztu h∗ (v) ścieżki łączącej węzły v i wg .
Wymaga się również, żeby heurystyka h była funkcją monotoniczną w tym sensie, że
jej wartości maleją (bądź rosną) monotonicznie wzdłuż każdej ścieżki łączącej węzły w0 i
wg . W takim przypadku koszt f nie maleje (bądź nie rośnie) wzdłuż każdej ścieżki. Jeżeli
f nie spełnia tego warunku, można tę funkcję „umonotonicznić” przyjmując
f (v) = max[f (w), g(v) + h(v)]
(2.2)
dla każdego potomka v węzła w.
Algorytm A∗ jest nie tylko zupełny (nawet jeżeli nie korzysta się z listy W ), ale również
i optymalny. Aby pokazać optymalność, rozważmy rozwijany węzeł w leżący na ścieżce
wiodącej do wg . Niech wg będzie optymalnym węzłem docelowym, któremu odpowiada
koszt f ∗ , a wn będzie suboptymalnym węzłem celowym, tzn. takim, że g(wn ) > f ∗ . Skoro
h jest heurystyką dopuszczalną, to f ∗ ­ h(w). Ponadto, skoro w nie został wybrany do
rozwinięcia w kierunku wn , to musi być spełniony warunek f (w) ­ f (wn ), skąd wynika,
28
ROZDZIAŁ 2. ROZWIĄZYWANIE PROBLEMÓW
że f ∗ ­ f (wn ). Ponieważ jednak wn jest węzłem docelowym, musi być h(wn ) = 0, czyli
f (wn ) = g(wn ), czyli f ∗ ­ g(wn ), a to przeczy założeniu, że wn jest węzłem suboptymalnym.
Tym samym pokazaliśmy, że A∗ nigdy nie wybiera suboptymalnego celu do rozwijania.
Można też pokazać, że A∗ jest strategią zupełną w przestrzeniach, reprezentowanych
przez lokalnie skończone grafy, tzn. grafy, w których każdy węzeł ma skończoną liczbę
sąsiadów.
Działanie algorytmu A∗ przedstawia pseudokod 2.4. Jeżeli przyjmiemy, że dla każdego
w ∈ V koszt g(w) = 0, otrzymamy algorytm zachłanny, a jeżeli założymy, że h(w) = 0 –
algorytm równomiernego kosztu.
Algorytm 2.4 Algorytm A∗
WE: R – lista węzłów do rozwinięcia
W – lista zbadanych węzłów
N – operator zwracający listę sąsiadów danego węzła
w0 – węzeł początkowy
wg – węzeł końcowy
g : V → R – koszt ścieżki od w0 do aktualnego węzła
h : V → R – oszacowanie kosztu ścieżki od węzła w do wg
f : V → R – funkcja kosztu, f (v) = g(v) + h(v)
κ : V × V → R – funkcja przejścia ze stanu w ∈ V do sąsiedniego stanu v ∈ N (w)
WY: p – ścieżka łącząca węzeł początkowy z węzłem końcowym
begin
w0 .g = 0, w0 .f = w0 .h;
W := {w0 };
oceń węzły z R, tzn. przypisz każdemu węzłowi w ∈ R wartości funkcji g, h oraz f ;
dopóki nie osiągnięto węzła końcowego {
jeżeli R = nil to wypisz komunikat Porażka i zakończ przeszukiwanie;
z listy R wybierz węzeł w o najniższym koszcie f (w);
jeżeli w = wg to wypisz komunikat Sukces, zwróć ścieżkę p łącząca węzeł początkowy z celowym i zakończ przeszukiwanie;
dodaj węzeł w do listy odwiedzonych węzłów, W := W ∪ {w};
oceń sąsiadów węzła w, tzn. dla każdego v ∈ N (w) wyznacz g(v) = g(w) +
κ(w, v), oblicz h(v) oraz f (v) = g(v) + h(v);
dodaj do listy R wszystkich nieodwiedzonych sąsiadów węzła w, którzy albo nie
występują w R, albo są już w R, ale przypisany im koszt jest większy od kosztu
aktualnie wyznaczonego;
}
end
2.6.3
Algorytm IDA∗
Iteracyjne pogłębianie jest użyteczną techniką redukujacą złożoność pamięciową algorytmu
przeszukiwania. Pomysł ów można także zastosować do algorytmu A∗ przyjmując, że węzły
będą rozwijane zgodnie ze strategią w głąb, przy czym ograniczeniem nie jest głębokość,
2.6. PRZESZUKIWANIE HEURYSTYCZNE
29
lecz wartość funkcji kosztu f . Otrzymuje się w ten sposób pogłębiany algorytm A∗ , czyli
IDA∗ . Sformułował go Korf [4].
Istotą algorytmu jest rozwijanie w każdej iteracji tylko tych węzłów, których koszt
nie przekracza zadanej wartości progowej K. Węzły, którym przypisano większy koszt f
umieszczane są na specjalnej liście D zawierającej kandydatów do przeglądania w dalszej
kolejności. Początkowo przyjmuje się, że K = h(w0 ), a w kolejnych iteracjach K jest równe najniższemu kosztowi przypisanemu węzłom z listy D. Istotę algorytmu przedstawia
pseudokod 2.5.
IDA∗ jest, podobnie jak A∗ , algorytmem kompletnym i optymalnym. Dobrym oszacowaniem jego złożoności pamięciowej jest O(bd) – co świadczy o jego przewadze nad algorytmem A∗ . Natomiast złożoność czasowa jest uzależniona od liczby wartości, które przyjmuje
funkcja heurystyczna.
2.6.4
Algorytm SM A∗
Simplified Memory-Bounded A∗ , czyli SM A∗ to kolejny wariant algorytmu A∗ usprawniający jego wymogi pamięciowe. Jest to algorytm kompletny, o ile tylko pozwala zapamiętać
ścieżkę prowadząca do najpłytszego rozwiązania. W przypadku przeciwnym zwraca on najlepsze do uzyskania, w ramach posiadanej pamięci, rozwiązania. Ponadto jest to algorytm
optymalny, jeśli tylko pozwala na to pamięć. Jego istotą jest przechowywanie węzłów na
skończonej liście. Gdy należy rozwinąć kolejny węzeł, a lista jest pełna – usuwa się z niej
węzeł u o najwyższym koszcie jednocześnie zachowując w poprzedniku węzła u informację
o koszcie ścieżki przechodzącej przez u. W takim przypadku powraca się do usuniętego
węzła tylko wtedy, gdy wszystkie inne drogi okazały się gorsze.
2.6.5
Algorytmy iteracyjnego poprawiania
W wielu sytuacjach opis stanu zawiera informację wystarczającą do znalezienia rozwiązania. ak jest np. w zadaniu ośmiu królowych. Jeżeli kompletną konfigurację (reprezentującą
aktualny stan) można przeprowadzić do stanu docelowego drogą drobnych modyfikacji –
warto wówczas stosować algorytmy iteracyjnego poprawiania.
2.6.5.1
Algorytm wspinaczkowy
Przypuśćmy, że w zadaniu 8-ka jako h(w) przyjmuje się poprzedzoną znakiem minus liczbę
pól znajdujących się na niewłaściwej (w stosunku do węzła docelowego) pozycji. Jeżeli np.
stan aktualny przedstawia lewa część rysunku 2.9, a stan docelowy – jego prawa część, to
h(w) = −2. Zauważmy, że stan ten jest lokalnym optimum – dowolne przesunięcie pustego
pola tylko pogarsza wartość funkcji h.
2.6.5.2
Symulowane wyżarzanie
2.6.5.3
Algorytmy ewolucyjne
30
ROZDZIAŁ 2. ROZWIĄZYWANIE PROBLEMÓW
Algorytm 2.5 Algorytm IDA∗
WE: R – lista węzłów do rozwinięcia
W – lista zbadanych węzłów
D – lista odrzuconych węzłów
N – operator zwracający listę sąsiadów danego węzła
w0 – węzeł początkowy
wg – węzeł końcowy
g : V → R – koszt ścieżki od w0 do aktualnego węzła
h : V → R – oszacowanie kosztu ścieżki od węzła w do wg
f : V → R – funkcja kosztu, f (v) = g(v) + h(v)
κ : V × V → R – funkcja przejścia ze stanu w ∈ V do sąsiedniego stanu v ∈ N (w)
WY: p – ścieżka łącząca węzeł początkowy z węzłem końcowym
begin
w0 .g = 0, w0 .f = w0 .h;
K = h(w0 );
W := {w0 };
R := N (w0 );
dopóki nie znaleziono rozwiązania {
dopóki R 6= nil {
wybierz pierwszy węzeł w z listy R i usuń go z tej listy;
jeżeli w.f ­ K to wstaw węzeł na listę D;
w przeciwnym razie {
dodaj w do listy W ;
jeżeli w = wg to wypisz komunikat Sukces, zwróć ścieżkę p łącząca
węzeł początkowy z celowym i zakończ przeszukiwanie;
oceń sąsiadów węzła w, tzn. dla każdego v ∈ N (w) wyznacz g(v) =
g(w) + κ(w, v), oblicz h(v) oraz f (v) = g(v) + h(v);
dodaj do listy R wszystkich nieodwiedzonych sąsiadów węzła w, którzy
albo nie występują w R, albo są już w R, ale przypisany im koszt jest
większy od kosztu aktualnie wyznaczonego;
}
}
jeżeli D = nil to wypisz komunikat Porażka i zakończ przeszukiwanie;
wybierz z D węzeł u o najniższym koszcie;
podstaw k = u.f ;
}
end
1
8
2
5
7
4
6
3
1
8
2
3
7
4
6
5
Rysunek 2.9: Stan aktualny i stan docelowy w zadaniu 8-ka.
2.6. PRZESZUKIWANIE HEURYSTYCZNE
31
Algorytm 2.6 Algorytm symulowanego wyżarzania
WE: f – optymalizowana funkcja,
g(x, T ) – reguła generowania sąsiadów rozwiązania x
PA (x, y, T ) – prawdopodobieństwo akceptacji rozwiązania y
C(x, T, t) – scenariusz schładzania
WY: xend – rozwiązanie, f end = f (xend ).
begin
1. Inicjalizacja: wybrać losowo punkt x0 ∈ A, ustalić temperaturę T0 , t ← 0.
Podstawić f 0 ← f (x0 ), xend ← x0 , f end ← f (xend ).
2. while (not done)
2(a). Wygenerować sąsiada yt+1 rozwiązania xt korzystając z reguły g(xt , T t ).
2(b). Zaakceptować sąsiada z prawdopodobieństwem PA (xt , yt+1 , T t ), tzn.
(
t+1
x
=
yk+1 jeżeli r ¬ PA (xt , yt+1 , T t )
xt
wpp
gdzie r ∈ [0, 1] jest liczbą losową.
2(c). Jeżeli f (yt+1 ) < f end , to f end ← f (yt+1 ), xend ← yt+1 .
2(d). Zmodyfikować temperaturę T t+1 = C(xt , T t , t).
2(e). Jeżeli nie jest spełnione kryterium zatrzymania, to t ← t+1.
3. end while
4. return xend , f end .
end
(2.3)
Skorowidz
średnica przestrzeni poszukiwań, 23
agent, 14
funkcja
heurystyczna, 24
oceniająca, 24
heurystyka
dopuszczalna, 24, 27
koszt ścieżki, 18
problem, 13
problem
uproszczony, 24
przestrzeń stanów, 18
przeszukiwanie, 13
ruchy, 17
strategia
pierwszy najlepszy, 24
system
produkcji, 13
32

Podobne dokumenty