Sztuczna inteligencja/SI Moduł 7

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Złożoność obliczeniowa metod przeszukiwania

Dotychczas zadanie przeszukiwania rozwiązywaliśmy dotychczas w taki sposób, aby zagwarantować znalezienie maksimum bądź minimum globalnego funkcji. Przestrzeń przeszukiwań będąca drzewem, była przeszukiwana zgodnie z pewnym porządkiem. Określenie kolejności przeglądanych węzłów było elementem różnicującym odmiany algorytmu przeszukiwania. W efekcie prowadzi to do pełnego przeglądu przestrzeni. W tej lekcji zajmiemy się technikami, które wykorzystują elementy losowości. Prowadziło to do algorytmów przeszukiwania, które nie gwarantują pełnego przeglądu przestrzeni w skończonej liczbie kroków, za to są mniej kosztowne obliczeniowo.

Motywacją wykorzystania elementów losowości w procesie przeszukiwania przestrzeni jest teoria złożoności obliczeniowej. Zajmuje się ona określaniem ilości operacji, potrzebnych do rozwiązania problemu, przy czym ta ilość operacji jest wyrażana jako funkcja ilości danych (parametrów) opisujących problem.

Załóżmy, że problem przeszukiwania, który rozwiązujemy, jest wynikiem rozwiązywania zadania scharakteryzowanego parametrami (na przykład liczbą przedmiotów, które można spakować do plecaka). Liczba węzłów przestrzeń przeszukiwań, wynikająca z tej liczby parametrów, da się oszacować jako , gdzie jest współczynnikiem rozgałęziania (dla problemu plecakowego równym 2), zaś jest stałą proporcjonalności. Pełny przegląd przestrzeni wymaga zatem rzędu operacji – mówimy, że złożoność obliczeniowa zadania przeszukiwania wynosi . Z punktu widzenia znajdowania węzła o najlepszej wartości funkcji oceny, oszacowanie powyższe ma pesymistyczny charakter – oznacza, że jeśli dane ułożą się niekorzystnie, metoda przeglądająca przestrzeń w sposób systematyczny natrafi na optymalny węzeł na końcu (co nie znaczy, że dla „korzystnych” danych nie natrafimy na węzeł optymalny nieco wcześniej niż po przejrzeniu wszystkich węzłów).

Zauważmy jednak, że jeśli rozwiązanie problemu wymaga określenia wartości parametrów, a przejście od jednego do drugiego węzła jest związane z określeniem wartości jednego parametru, wówczas węzeł optymalny od początkowego będzie dzielić krawędzi. Oznacza to, że gdybyśmy dysponowali „wyrocznią” wiedzącą z góry, na jakie wartości ustalać kolejne parametry, pesymistyczne oszacowanie liczby operacji wystarczających do wyznaczenia węzła optymalnego wynosiłoby . (W teorii złożoności obliczeniowej taki algorytm „z wyrocznią” ma swój odpowiednik w niedeterministycznej maszynie Turinga). Substytutem takiego algorytmu „z wyrocznią” jest algorytm, w którym wyrocznia jest zastąpiona sekwencją losowych decyzji. Siłą rzeczy, losowe decyzje jedynie z pewnym prawdopodobieństwem są zgodne z wyrocznią. Z tego względu należy powtarzać proces losowania aby zwiększyć prawdopodobieństwo, że choć raz uda się tę zgodność uzyskać.

Niniejsza lekcja jest poświęcona właśnie takim algorytmom z elementami losowości.

Algorytm losowego próbkowania

Przegląd metod zaczniemy od algorytmu losowego próbkowania. Algorytm ten tworzy zbiór węzłów używając poniższego schematu.

   ~~ Algorytm losowego próbkowania  ~~

powtarzaj  razy
  generuj losowo 
  

Algorytm można kończyć albo po ustalonej liczbie kroków, albo po osiągnięciu zadowalającego poziomu wartości przez funkcję oceny węzła bieżącego.

Wraz z kolejnymi iteracjami algorytmu, zbiór odwiedzonych węzłów będzie coraz większy, a prawdopodobieństwo, że pokryje się on ze zbiorem wszystkich węzłów , wzrasta do jedności.

W przestrzeni jesteśmy w stanie stosunkowo łatwo generować punkty rozkładem jednostajnym w kostce, czyli zbiorze spełniającym dla każdego warunek: .

Generacja punktu z rozkładem jednostajnym w takiej kostce odbywa się poprzez -krotną realizację zmiennej losowej o rozkładzie jednostajnym na odcinku (można użyć wbudowanego generatora liczb losowych), co prowadzi do uzyskania zbioru wartości . Aby uzyskać wartość z dowolnego przedziału, np. na podstawie tak uzyskanych liczb losowych należy wyznaczyć wartości jako .

W przestrzeni wektorów bitowych, w których węzły terminalne są osiągalne poprzez podanie ich numeru, generacja węzła terminalnego może być wykonana poprzez losowanie z rozkładem jednostajnym wartości z zakresu (gdzie jest liczbą węzłów terminalnych) i odczytanie węzła o wylosowanym numerze.

Pewien kłopot może natomiast sprawić wygenerowanie węzłów terminalnych w przestrzeniach przeszukiwań takich jak rozważane wcześniej przy okazji heurystycznych metod przeszukiwania. Wzmiankowany kłopot wynika z faktu, że dla każdego węzła umiemy jedynie wygenerować jego najbliższych sąsiadów. A zatem wygenerowanie węzła terminalnego musi być wieloetapowe poprzez generowanie kolejnych nieterminalnych węzłów pośrednich, poczynając od węzła według poniższej metody.

   ~~ Metoda generowania losowego węzła terminalnego  ~~



powtarzaj
  wybierz losowo 
  
  
  
dopóki  nie jest węzłem terminalnym

Gdzie jest zbiorem węzłów, zaś - sąsiedztwem węzła .

Zauważmy, że jeśli:

  • do każdego węzła terminalnego prowadzi dokładnie jedna ścieżka,
  • współczynnik rozgałęzień jest jednakowy dla wszystkich węzłów o tej samej wysokości,
  • wszystkie węzły terminalne mają tę samą wysokość,

to rozkład prawdopodobieństwa osiągnięcia dowolnego węzła terminalnego jest rozkładem jednostajnym. W przeciwnym przypadku może się okazać, że rozkład ten jest niejednostajny .

Niejednostajność rozkładu osiągalności węzłów terminalnych oznacza, że realizując algorytm generowania losowej ścieżki, będziemy osiągać te węzły niejednakowo często – niektóre z nich będą „preferowane”, a niektóre „pokrzywdzone” przez proces przeszukiwania.

Algorytm losowego próbkowania nie generuje ścieżek w sposób systematyczny. Dlatego może się zdarzyć, że w kolejnych iteracjach będą wielokrotnie generowane te same ścieżki. Jednak wraz ze wzrostem liczby iteracji zbiór będzie coraz lepiej „wypełniać” zbiór , a prawdopodobieństwo, że dowolny podzbiór zawiera choć jeden element zawarty w zbiorze , wzrasta do jedności.

Algorytm błądzenia przypadkowego

Innym sposobem losowego przeglądu przestrzeni jest wykonanie błądzenia przypadkowego. Metoda ta, w porównaniu z metodą losowego próbkowania charakteryzuje się tym, że kolejne odwiedzane węzły skupiają się w swoich sąsiedztwach. Algorytm metody jest następujący:

   ~~ Algorytm losowego próbkowania ~~ 
wyznacz 

powtarzaj k razy
  generuj losowo 
  

Gdzie jest sąsiedztwem węzła .

Algorytm można kończyć albo po ustalonej liczbie kroków, albo po osiągnięciu zadowalającego poziomu wartości przez funkcję oceny węzła bieżącego.

W przestrzeni sąsiedztwem punktu są punkty odległe o nie więcej niż promień sąsiedztwa . Generowanie losowego punktu (np. z rozkładem jednostajnym) z sąsiedztwa jest pewnym problemem technicznym, którego rozwiązanie pozostawiamy Czytelnikowi.

Łatwiej jeszcze metodę błądzenia przypadkowego zrealizować w przestrzeniach dyskretnych o zdefiniowanej relacji sąsiedztwa między węzłami. Wystarczy przyjąć jednakowe wartości prawdopodobieństwa wyboru każdego węzła z sąsiedztwa , a następnie dokonać losowego wyboru.

Algorytm błądzenia przypadkowego jest, jak mogliśmy się przekonać, nieco prostszy w realizacji od losowego próbkowania. Algorytm ten, podobnie jak metodzie losowego próbkowania, generuje węzły niesystematycznie, możliwe są więc wielokrotne odwiedziny tego samego węzła. W kolejnych iteracjach można się jednak spodziewać, że zbiór odwiedzonych węzłów coraz lepiej będzie wypełniając .

Algorytm wspinaczkowy

Algorytm wspinaczkowy (algorytm wzrostu) jest „ulepszoną” metodą błądzenia przypadkowego. Zmiana polega na tym, że losowo wybrany węzeł z otoczenia węzła bieżącego staje się bieżącym jedynie wówczas, gdy jego wartość funkcji oceny jest lepsza niż węzła bieżącego: wyższa w przypadku maksymalizacji albo niższa przy minimalizacji. Można by powiedzieć, że algorytm ten realizuje „poinformowaną.” wersję metody błądzenia przypadkowego. Algorytm można kończyć albo po ustalonej liczbie kroków, albo po osiągnięciu zadowalającego poziomu wartości przez funkcję oceny węzła bieżącego. Obowiązują uwagi, poczynione przy algorytmie błądzenia przypadkowego, dotyczące sposobu realizacji etapu losowej generacji węzła z sąsiedztwa węzła bieżącego.

 ~~ Algorytm wspinaczkowy ~~ 
wyznacz 

powtarzaj k razy
  generuj losowo 
  jeśli  to
    
    
  w przeciwnym przypadku 

Zauważmy, że poczynione w porównaniu z metodą błądzenia przypadkowego „ulepszenie” wprawdzie gwarantuje, że funkcja oceny węzła bieżącego nie będzie maleć w kolejnych iteracjach, jednak sprawia, że metoda wspinaczkowa nie ma możliwości osiągnięcia dowolnego węzła terminalnego przy ustalonym węźle początkowym. Aby to wykazać, wystarczy rozważyć następujący przykład. Jeśli maksymalizujemy funkcję oceny, a węzłem roboczym stanie się węzeł o ocenie 13, wówczas osiągalne są wyłącznie węzły o wartości oceny 14 i 15.

Zauważmy, że jeśli funkcja oceny jest monotoniczna, wówczas kolejne węzły robocze algorytmu wspinaczkowego utworzą losowo wybraną jedną ze ścieżek od węzła początkowego do terminalnego; w tym przypadku więc wynik działania algorytmu wspinaczkowego będzie identyczny z wynikiem algorytmu generowania dowolnego węzła terminalnego. Natomiast przy niemonotonicznej funkcji oceny, algorytm wspinaczkowy osiągnie wyłącznie ścieżkę, wzdłuż której funkcja oceny jest monotoniczna (przy czym nie sposób zagwarantować, że ta ścieżka zakończy się w węźle terminalnym) .

Załóżmy, że w fazie wyznaczania początkowego węzła roboczego wyznaczono węzeł o wartości funkcji oceny równej 9. W kolejnych etapach algorytmu wspinaczkowego, generowane są kolejne węzły z drzewa. Jednak z uwagi na sposób generowania węzłów, węzeł o wartości 8 nie stanie się nigdy węzłem bieżącym, a tylko wtedy mogłyby się stać osiągalne węzły o wartościach 4 i 16.

Algorytm symulowanego wyżarzania

Algorytm wspinaczkowy i błądzenia przypadkowego stoją na „przeciwstawnych biegunach” – wadą pierwszego jest niemożność znalezienia węzła o najlepszej wartości funkcji oceny, wadą drugiego jest bardzo mała efektywność. Pośredni wariant postępowania polega na tym, aby wybór kolejnego węzła roboczego następował w sposób nieco bardziej „liberalny” niż w algorytmie wzrostu, ale nie tak dowolny jak w algorytmie błądzenia przypadkowego. Jedną z możliwych realizacji takiego kompromisu stanowi algorytm symulowanego wyżarzania, działający według poniższego schematu

 ~~ Algorytm symulowanego wyżarzania ~~ 
wyznacz 

powtarzaj k razy
  generuj losowo 
  jeśli  to
    
    
  w przeciwnym przypadku
    jeśli  to
      
      
    w przeciwnym przypadku
      

Algorytm można kończyć albo po ustalonej liczbie kroków, albo po osiągnięciu zadowalającego poziomu wartości przez funkcję oceny węzła bieżącego.

Wartości są parametrem algorytmu, natomiast są wartościami zmiennej losowej o rozkładzie jednostajnym na odcinku .

Tak więc algorytm symulowanego wyżarzania akceptuje węzeł jako nowy węzeł roboczy zarówno wtedy, gdy ma on wyższą ocenę niż jak i niekiedy wówczas, gdy jego ocena jest niższa. W tym drugim przypadku jednak, prawdopodobieństwo tego zdarzenia ma tym mniejszą wartość, im większy jest stopień pogorszenia – różnica . Stopień „liberalności” algorytmu – skłonności do akceptacji gorszego węzła roboczego – jest parametryzowany wartościami . Im większa wartość , tym wyższe prawdopodobieństwo akceptacji gorszego węzła jako węzła bieżącego. W skrajnym przypadku, gdy ma wartość bliską nieskończonej, prawdopodobieństwo akceptacji gorszego węzła jest bliskie jedności, a algorytm staje się algorytmem błądzenia przypadkowego. W drugim skrajnym przypadku, gdy , otrzymujemy algorytm wspinaczkowy.

Algorytm symulowanego wyżarzania będzie błądzić w przestrzeni węzłów . Jednak częściej niż w algorytmie błądzenia przypadkowego (i tym częściej, im niższa temperatura) stan będzie miał wysoką wartość funkcji oceny.