Elementy sztucznej inteligencji. Materiał udostępniony na prawach rękopisu

Podobne dokumenty
Heurystyczne metody przeszukiwania

Heurystyki. Strategie poszukiwań

Metody przeszukiwania

Marcel Stankowski Wrocław, 23 czerwca 2009 INFORMATYKA SYSTEMÓW AUTONOMICZNYCH

Sztuczna Inteligencja i Systemy Doradcze

Znajdowanie wyjścia z labiryntu

Rozwiązywanie problemów metodą przeszukiwania

SZTUCZNA INTELIGENCJA

Ćwiczenie 1 Planowanie trasy robota mobilnego w siatce kwadratów pól - Algorytm A

1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb.

Działanie algorytmu oparte jest na minimalizacji funkcji celu jako suma funkcji kosztu ( ) oraz funkcji heurystycznej ( ).

Uniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Sterowania i Systemów Informatycznych

Sztuczna Inteligencja i Systemy Doradcze

ĆWICZENIE 1: Przeszukiwanie grafów cz. 1 strategie ślepe

LABORATORIUM 2: Przeszukiwanie grafów cz. 2 strategie heurystyczne

Podstawy sztucznej inteligencji

Elementy kognitywistyki II:

AiSD zadanie trzecie

Wykład2,24II2010,str.1 Przeszukiwanie przestrzeni stanów powtórka

Wstęp do Sztucznej Inteligencji

a) 7 b) 19 c) 21 d) 34

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

WPROWADZENIE DO SZTUCZNEJ INTELIGENCJI

Podstawy Sztucznej Inteligencji (PSZT)

Reprezentacje grafów nieskierowanych Reprezentacje grafów skierowanych. Wykład 2. Reprezentacja komputerowa grafów

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

Złożoność obliczeniowa zadania, zestaw 2

Struktury danych i złożoność obliczeniowa Wykład 5. Prof. dr hab. inż. Jan Magott

Badania operacyjne: Wykład Zastosowanie kolorowania grafów w planowaniu produkcji typu no-idle

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

ANALIZA ALGORYTMÓW. Analiza algorytmów polega między innymi na odpowiedzi na pytania:

Planowanie drogi robota, algorytm A*

Algorytm Dijkstry znajdowania najkrótszej ścieżki w grafie

Elementy kognitywistyki II: Sztuczna inteligencja. WYKŁAD V: Agent wciąż szuka rozwiązania (choć już nie na ślepo)

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Wstęp do programowania

ĆWICZENIE 1: Przeszukiwanie grafów strategie heurystyczne

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

Instrukcje dla zawodników

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

9.9 Algorytmy przeglądu

Zadanie 1: Piętnastka

Spacery losowe generowanie realizacji procesu losowego

Sortowanie topologiczne skierowanych grafów acyklicznych

3. MINIMAX. Rysunek 1: Drzewo obrazujące przebieg gry.

Przykłady grafów. Graf prosty, to graf bez pętli i bez krawędzi wielokrotnych.

Porównanie algorytmów wyszukiwania najkrótszych ścieżek międz. grafu. Daniel Golubiewski. 22 listopada Instytut Informatyki

Matematyczne Podstawy Informatyki

Materiały dla finalistów

Wykład 10 Grafy, algorytmy grafowe

1. Synteza automatów Moore a i Mealy realizujących zadane przekształcenie 2. Transformacja automatu Moore a w automat Mealy i odwrotnie

Algorytmiczna teoria grafów

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

3. Macierze i Układy Równań Liniowych

Algorytmy decyzyjne będące alternatywą dla sieci neuronowych

Metody Optymalizacji: Przeszukiwanie z listą tabu

Programowanie dynamiczne i algorytmy zachłanne

Metody numeryczne w przykładach

Porządek symetryczny: right(x)

1 Automaty niedeterministyczne

Elementy kognitywistyki II: Sztuczna inteligencja. WYKŁAD III: Problemy agenta

ROZWIĄZYWANIE RÓWNAŃ NIELINIOWYCH

Drzewa spinające MST dla grafów ważonych Maksymalne drzewo spinające Drzewo Steinera. Wykład 6. Drzewa cz. II

Ogólne wiadomości o grafach

Jednym z najprostszych sposobów porządkowania jest technika stosowana przy sortowaniu listów:

Struktury danych i złożoność obliczeniowa Wykład 7. Prof. dr hab. inż. Jan Magott

Algorytmy mrówkowe (optymalizacja kolonii mrówek, Ant Colony optimisation)

Programowanie celowe #1

Wyznaczanie strategii w grach

Programowanie dynamiczne cz. 2

Sortowanie Shella Shell Sort

Metoda Tablic Semantycznych

Struktury danych: stos, kolejka, lista, drzewo

Zagadnienie najkrótszej drogi w sieci

SID Wykład 2 Przeszukiwanie

Zad. 1 Zad. 2 Zad. 3 Zad. 4 Zad. 5 SUMA

Znaleźć wzór ogólny i zbadać istnienie granicy ciągu określonego rekurencyjnie:

5. Rozwiązywanie układów równań liniowych

Wykład z Technologii Informacyjnych. Piotr Mika

METODY HEURYSTYCZNE wykład 1

7. Pętle for. Przykłady

5c. Sieci i przepływy

WYRAŻENIA ALGEBRAICZNE

Podstawowe struktury danych

Optymalizacja ciągła

Wybrane podstawowe rodzaje algorytmów

Struktury Danych i Złożoność Obliczeniowa

Przykładowe rozwiązania

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Złożoność obliczeniowa klasycznych problemów grafowych

Optymalizacja. Wybrane algorytmy

Wstęp do sieci neuronowych, wykład 11 Łańcuchy Markova

Przekształcanie wykresów.

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Techniki optymalizacji

Modele i narzędzia optymalizacji w systemach informatycznych zarządzania

Aproksymacja funkcji a regresja symboliczna

Imię, nazwisko, nr indeksu

Transkrypt:

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 5 1.1 Krótka historia SI................................ 7 1.1.1 Nieśmiałe próby (1943 1956)..................... 7 1.1.2 Wczesny entuzjazm (1952 1969)................... 8 1.1.3 Doza realizmu (1966-1974)....................... 9 1.1.4 Systemy oparte na wiedzy (1969 1979)............... 10 1.1.5 SI wkracza do przemysłu (1980-1988)................. 11 1.1.6 Współczesność (1987 )........................ 11 1.2 Podsumowanie................................. 11 2 Rozwiązywanie problemów 13 2.1 Systemy sztucznej inteligencji......................... 13 2.2 Przestrzeń stanów................................ 14 2.3 Klasyfikacja problemów............................. 16 2.4 Rozwiązywanie problemów w przestrzeni stanów............... 17 2.5 Ślepe strategie przeszukiwania......................... 19 2.5.1 Przeszukiwanie wszerz i w głąb.................... 19 2.5.2 Strategia równomiernego kosztu.................... 20 2.5.3 Ograniczone przeszukiwanie w głąb.................. 22 2.5.4 Strategia iterowanego pogłębiania................... 23 2.5.5 Przeszukiwanie dwukierunkowe.................... 23 2.5.6 Porównanie ślepych strategii przeszukiwania............. 23 2.6 Przeszukiwanie heurystyczne.......................... 24 2.6.1 Algorytm zachłanny.......................... 24 2.6.2 Algorytm A.............................. 27 2.6.3 Algorytm IDA............................. 28 2.6.4 Algorytm SM A............................ 29 2.6.5 Algorytmy iteracyjnego poprawiania................. 29 2.6.5.1 Algorytm wspinaczkowy................... 29 2.6.5.2 Symulowane wyżarzanie................... 29 2.6.5.3 Algorytmy ewolucyjne.................... 29 3 Elementy logiki formalnej 25 3.1 Języki formalne................................. 25 3.1.1 Formuły................................. 25 3.1.2 Teoria dowodu a teoria modeli..................... 26 3

4 SPIS TREŚCI 3.1.3 Niesprzeczność, zupełność i rozstrzygalność.............. 27 3.2 Logika zdań................................... 28 3.2.1 Język formalny dla logiki zdań..................... 28 3.2.2 Interpretacja formuł logiki zdań.................... 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 agentem 1 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 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 s są swoimi sąsiadami jeżeli istnieje taki operator o, który przeprowadza stan s w stan s. 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 2 3 1 8 4 8 4 7 6 5 7 6 5 Rysunek 2.1: Stan początkowy i docelowy w zadaniu 8-ka. 2 1 3 8 4 7 6 5 L P D 2 3 2 3 2 8 3 1 8 4 1 8 4 1 4 7 6 5 7 6 5 7 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 trzy 2 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 s = 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 s 0 ; wie jedynie, że s 0 S 0, gdzie S 0 jest pewnym podzbiorem zbioru stanów. W takim wypadku działanie operatorem o przeprowadza podzbiór S t w inny podzbiór S t+1 gdzie t = 0, 1,... jest indeksem

2.4. ROZWIĄZYWANIE PROBLEMÓW W PRZESTRZENI STANÓW 17 8 8 Q 7 7 Q 6 6 Q 5 5 Q 4 4 Q 3 3 Q 2 2 Q 1 1 Q 1 2 3 4 5 6 7 8 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 s 0, ewentualnie zbiór stanów początkowych S 0. 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 G S = (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 G S 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 w 0 węzeł początkowy w g węzeł końcowy WY: p ścieżka łącząca węzeł początkowy z węzłem końcowym begin W := {w 0 } R := N(w 0 ) 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ł w 0 z węzłem w g 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 G S można łatwo skonstruować funkcję N : V 2 V, która każdemu węzłowi w G S 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 w 0 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) Kompletność: czy strategia pozwala zawsze znaleźć rozwiązanie, o ile ono istnieje? (b) Złożoność czasowa: ile czasu zajmie znalezienie rozwiązania? (c) Złożoność pamięciowa: jak dużej pamięci potrzeba, aby uzyskać rozwiązanie? (d) 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 G S 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 LIFO 3. 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 FIFO 4 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 G S na głębokości d. W przypadku metody wszerz należy w najgorszym razie rozwinąć 1 + b + b 2 + + b d 3 Skrót od Last In, First Out, tzn. ostatni przyszedł, pierwszy obsłużony. 4 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(b m ) 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 w 0 z węzłem w. Zatem g(w 0 ) = 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; Node ojciec; int g; } //informacja o aktualnym stanie //informacja o bezpośrednim poprzedniku aktualnego węzła //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 w 0 węzeł początkowy w g 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 w 0 do aktualnego węzła WY: p ścieżka łącząca węzeł początkowy z węzłem końcowym begin w 0.g = 0; W := {w 0 }; oceń sąsiadów węzła w 0, tzn. dla każdego węzła w N(w 0 ) wyznacz w.g = κ(w 0, w); zapamiętaj ocenionych sąsiadów, R := N(w 0 ); 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 = w g to wypisz komunikat Sukces, zwróć ścieżkę p łączącą węzeł w 0 z węzłem w g 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), 4], t = 13, stwierdzamy, że: (a) długość trasy łączącej interesujące nas miasta jest równa 4 km. Znając zawartość listy W : [Ara, 0], [Zer(Ara), 75], [Tim(Ara), 118], [Sib(Ara), 1], [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 71 Oradea Zerind 75 Arad 1 118 Timisoara 111 70 75 Dobreta Neamt 87 151 Iasi 92 Sibiu 99 Fagaras Vaslui 80 Rimnicu Vilcea 142 Lugoj Pitesti 211 97 98 Hirsova Mehadia 146 101 85 Urziceni 138 86 Bucharest 120 90 Craiova Eforie Giurgiu Rysunek 2.6: Uproszczona mapa drogowa Rumunii. (Źródło: [10].) t w N(w) R W 0 {Ara} 1 Ara [Zer, 75], [Sib, 1], [Zer(Ara), 75], [Sib(Ara), 1], [Ara, 0] [Tim, 118] [Tim(Ara), 118] 2 Zer [Ara, 75], [Ora, 71], [Sib(Ara), 1], [Tim(Ara), 118] W [Zer(Ara), 75] [Ora(Zer), 146] 3 Tim [Ara, 118], [Lug, 111], [Sib(Ara), 1], [Ora(Zer), 146], W [Tim(Ara), 118] [Lug(Tim) 229] 4 Sib [Ara, 1], [Far, 99], [Ora(Zer), 146], [Lug(Tim) 229], W [Sib(Ara), 1] [Rim, 80] [Fag(Sib), 239], [Rim(Sib), 220] [Tim(Ara), 118], 5 Ora [Zer, 71], [Sib, 151], [Lug(Tim) 229], [Fag(Sib), 239], W [Ora(Zer), 146] [Rim, 80] [Rim(Sib), 220] 6 Rim [Zer, 71], [Sib, 80], [Lug(Tim) 229], [Fag(Sib), 239], W [Rim(Sib), 220] [Pit, 97], [Cra, 146] [Cra(Rim), 366], [Pit(Rim), 317] 7 Lug [Tim, 111], [Meh, 70] [Fag(Sib), 239], Cra(Rim), 366], W [Lug(Tim), 229] [Pit(Rim), 317], [Meh(Lug), 299] 8 Fag [Buc, 211], [Sib, 99] [Cra(Rim), 366], [Pit(Rim), 317], W [Fag(Sib), 239] [Meh(Lug), 299], [Buc(Fag), 4] 9 Meh [Lug, 70], [Dob, 75] [Cra(Rim), 366], [Pit(Rim), 317], W [Meh(Lug), 299] [Buc(Fag), 4], [Dob(Meh), 374] 10 Pit [Rim, 97], [Buc, 101] [Cra(Rim), 366], [Buc(Fag), 4], W [Pit(Rim), 317] [Dob(Meh), 374] 11 Cra [Dob, 120], [Pit, 138] [Buc(Fag), 4], [Dob(Meh), 374] W [Cra(Rim), 366] 12 Dob [Meh,75], [Cra, 120] [Buc(Fag), 4] W [Dob(Meh), 374] 12 Buc 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 w o. 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ć d n w = b i i=0 węzłów, natomiast stosując metodę iterowanego pogłębiania przeglądamy d n ip i=0 (d + 1 i)b i węzłów. Przypuśćmy, że d = 10 i każdy węzeł ma b = 5 potomków. Wówczas n w = 12207031, natomiast n ip = 15258786, co oznacza, że n ip = 1.25n w. 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 Kompletność Optymalność Złożoność czasowa pamięciowa Wszerz Tak Tak b d b d W głab Nie Nie b m bm Równomiernego kosztu Tak Tak b d b d Ograniczone przeszukiwanie Tak, Nie b l bl w głąb gdy l d Iteracyjne pogłębianie Tak Tak b d b d Dwukierunkowa (o ile stosowalna) Tak Tak b d/2 b d/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 v g. 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(v g ) = 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 Odległość Miasto Odległość Arad 366 Mehadia 241 Bucharest 0 Neamt 234 Craiova 1 Oradea 380 Dobreta 242 Pitesti 98 Eforie 161 Rimnicu Vilcea 193 Fagaras 178 Sibiu 253 Giurgiu 77 Timisoara 329 Hirsova 151 Urziceni 80 Iasi 226 Vaslui 199 Lugoj 244 Zerind 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 4 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 30 30 30 20 30 30 30 30 20 20 10 20 10 20 30 10 30 10 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 253 329 Zerind Sibiu Timisoara 366 178 380 193 Arad Fagaras Oradea Rimnicu 253 0 Sibiu 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(b m ), 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 w g. 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 w g. 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 w 0 i w g. 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 w g. Niech w g będzie optymalnym węzłem docelowym, któremu odpowiada koszt f, a w n będzie suboptymalnym węzłem celowym, tzn. takim, że g(w n ) > f. Skoro h jest heurystyką dopuszczalną, to f h(w). Ponadto, skoro w nie został wybrany do rozwinięcia w kierunku w n, to musi być spełniony warunek f(w) f(w n ), skąd wynika,

28 ROZDZIAŁ 2. ROZWIĄZYWANIE PROBLEMÓW że f f(w n ). Ponieważ jednak w n jest węzłem docelowym, musi być h(w n ) = 0, czyli f(w n ) = g(w n ), czyli f g(w n ), a to przeczy założeniu, że w n 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 w 0 węzeł początkowy w g węzeł końcowy g : V R koszt ścieżki od w 0 do aktualnego węzła h: V R oszacowanie kosztu ścieżki od węzła w do w g 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 w 0.g = 0, w 0.f = w 0.h; W := {w 0 }; 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 = w g 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(w 0 ), 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 w 0 węzeł początkowy w g węzeł końcowy g : V R koszt ścieżki od w 0 do aktualnego węzła h: V R oszacowanie kosztu ścieżki od węzła w do w g 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 w 0.g = 0, w 0.f = w 0.h; K = h(w 0 ); W := {w 0 }; R := N(w 0 ); dopóki nie znaleziono rozwiązania { dopóki R 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 = w g 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 2 5 1 2 3 7 4 7 4 8 6 3 8 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 P A (x, y, T ) prawdopodobieństwo akceptacji rozwiązania y C(x, T, t) scenariusz schładzania WY: x end rozwiązanie, f end = f(x end ). begin 1. Inicjalizacja: wybrać losowo punkt x 0 A, ustalić temperaturę T 0, t 0. Podstawić f 0 f(x 0 ), x end x 0, f end f(x end ). 2. while (not done) 2(a). Wygenerować sąsiada y t+1 rozwiązania x t korzystając z reguły g(x t, T t ). 2(b). Zaakceptować sąsiada z prawdopodobieństwem P A (x t, y t+1, T t ), tzn. x t+1 = { y k+1 jeżeli r P A (x t, y t+1, T t ) x t wpp (2.3) gdzie r [0, 1] jest liczbą losową. 2(c). Jeżeli f(y t+1 ) < f end, to f end f(y t+1 ), x end y t+1. 2(d). Zmodyfikować temperaturę T t+1 = C(x t, T t, t). 2(e). Jeżeli nie jest spełnione kryterium zatrzymania, to t t+1. 3. end while 4. return x end, f end. end

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