Mrówki, czyli piękno metaheurystyk
Jakie jest idealne rozwiązanie problemu algorytmicznego? Wydajne, proste, łatwe do przystosowania do innych zastosowań – i oczywiście dokładne. Często jednak nie potrzebujemy (lub nie możemy w rozsądnym czasie uzyskać) tej ostatniej cechy i jesteśmy skłonni zadowolić się dobrym oszacowaniem wyniku. W takich sytuacjach warto sięgnąć po metaheurystykę, czyli uniwersalny schemat przybliżonego rozwiązywania problemów optymalizacyjnych.
Co ciekawe, twórcy metaheurystyk w wielu przypadkach (algorytmy ewolucyjne, sieci neuronowe, systemy mrówkowe) czerpali inspirację z natury, gdyż to dla niej właśnie wydajność i łatwość dostosowania są sprawą kluczową, a prostota – częstą cechą zaproponowanych przez nią rozwiązań.
Niekiedy są to rozwiązania naprawdę niebanalnych problemów. Na przykład – jak prawie ślepe mrówki, niepotrafiące się komunikować i dysponujące mocno ograniczoną pamięcią i intelektem, mają znajdować źródła pokarmu? Przez długi czas fakt, że jednak to robią i to bardzo sprawnie (w większości przypadków znajdują nawet najkrótszą drogę pomiędzy gniazdem a pokarmem), stanowił zagadkę dla myrmekologów. Odpowiedź może być zaskakująca – zachowaniem mrówek kierują jedynie trzy proste zasady. Pierwsza – każda mrówka znaczy swoje ślady feromonem, druga – owad wybiera ścieżkę z prawdopodobieństwem proporcjonalnym do ilości feromonu na niej, trzecia – feromon z czasem stopniowo odparowuje. Dlaczego to działa? Mrówka, która znajdzie krótką drogę do pokarmu, wróci do gniazda (prawdopodobnie po własnych śladach) szybciej niż inne. Trasa, którą podążyła, będzie więc pokryta podwójną warstwą feromonu, podczas gdy inne ścieżki w okolicy gniazda otrzymały tylko pojedynczą dawkę. Spowoduje to, że wychodzące z gniazda mrówki chętniej wybiorą tę właśnie ścieżkę, co zwiększy ilość feromonu na niej, co zachęci inne owady... Odparowywanie feromonu z kolei sprawia, że mrówki nie poprzestają na znalezieniu lokalnego maksimum i umożliwia im dostosowanie się do zmian środowiska (przykład na rysunku).
Spróbujmy teraz zamienić ten sprytny pomysł Matki Natury na metaheurystykę z prawdziwego zdarzenia. Chcielibyśmy uzyskać ogólny schemat rozwiązywania szerokiej klasy problemów, zacznijmy jednak nieco skromniej – od próby rozwiązania trudnego obliczeniowo problemu komiwojażera (wybieramy akurat ten problem, gdyż wydaje się on zbliżony do oryginalnego zadania mrówek – również sprowadza się do znalezienia pewnego rodzaju najkrótszej drogi w grafie). Przedstawmy teraz schemat algorytmu znanego pod nazwą Ant Colony Optimization (ACO).
Niech będzie liczbą miast, a – liczbą mrówek, którymi dysponujemy. Utwórzmy tablicę o wymiarach reprezentującą ilość feromonu na ścieżkach pomiędzy dwoma miastami – oznaczać będzie ilość feromonu na ścieżce z miasta do miasta (symetryczność ścieżek nie będzie nam potrzebna – równie dobrze możemy rozwiązywać asymetryczny problem komiwojażera) i zainicjujmy ją losowymi, małymi ilościami feromonu. Dalsza część algorytmu będzie się odbywała w turach, których liczbę zadajemy z góry w zależności od tego, jak bardzo zależy nam na szybkości uzyskania odpowiedzi. W każdej turze tworzymy podobną do tablicy tablicę , na początku tury wypełnioną zerami, reprezentującą zmiany ilości feromonu na ścieżkach zachodzące w danej turze, a następnie zaczynamy po kolei wypuszczać mrówki z miasta startowego. Każda mrówka zakreśla w grafie jakiś cykl Hamiltona, postępując następująco: będąc w -tym mieście, przechodzi bezpośrednio do miasta -tego z prawdopodobieństwem wprost proporcjonalnym do ilości feromonu w komórce i z zachowaniem warunku, że nie wolno jej powrócić do miasta, które już zdążyła odwiedzić w tej turze. Gdy mrówka kończy wędrówkę, obliczana jest długość (suma wag krawędzi) przebytego przez nią cyklu, a ilość feromonu na każdej ścieżce, którą przeszła mrówka, zwiększana jest o wartość (zmiany te są na razie zapisywane w tablicy ).
Jednocześnie sprawdzamy, czy przebyty przez mrówkę cykl Hamiltona jest najlepszym z dotychczas znalezionych – w tym przypadku zapamiętujemy go. Po tym, jak wszystkie mrówki wrócą już do gniazda, do tablicy dodajemy tablicę , a następnie ilość feromonu w każdej komórce tablicy jest zmniejszana o procent, co reprezentuje parowanie feromonu.
Takie postępowanie promuje ścieżki wchodzące w skład wielu dość dobrych cykli Hamiltona, lecz pozwala się też wyróżnić ścieżce używanej rzadko, ale za to w wyjątkowo krótkich cyklach, co wydaje się rozsądne i zbliżone do rzeczywistego zachowania mrówek. Nie oznacza to jednak, że tego algorytmu nie można już udoskonalić – nasze elektroniczne mrówki nie muszą wszakże podlegać ograniczeniom nałożonym przez naturę na ich biologiczne krewniaczki. W szczególności nie muszą być ślepe – w praktycznych zastosowaniach ACO mrówki w wyborze ścieżek kierują się nie tylko ilością feromonu na nich, ale też ich długością. Najczęściej używanym wzorem na prawdopodobieństwo wyboru ścieżki. z miasta do nieodwiedzonego wcześniej miasta jest
gdzie jest zbiorem miast jeszcze nieodwiedzonych, i są pewnymi parametrami, a jest odległością miasta od miasta (badania empiryczne wykazały, że algorytm osiąga najlepsze wyniki z , , współczynnikiem parowania i liczbą mrówek ). Dodatkowo nasze mrówki mogą się komunikować i zapamiętywać najlepsze do tej pory znalezione cykle – częstym udoskonaleniem algorytmu jest zwiększanie w każdej turze ilości feromonu na najlepszym cyklu, nawet jeśli w danej turze wybrało go niewiele mrówek. Poza tym elektronicznym owadom niepotrzebne jest gniazdo – mrówki nie muszą startować wszystkie z jednego miasta, mogą być rozmieszczone losowo, co daje lepsze wyniki. Tak udoskonalony algorytm może już śmiało konkurować z innymi metaheurystykami. Testy wykazały, że dla dużych ACO średnio osiąga lepsze wyniki niż najczęściej stosowane heurystyki – tzw. symulowane wyżarzanie i algorytm ewolucyjny, a poza tym szybciej (mimo dość dużej złożoności ) znajduje dość dobre rozwiązania. Dużą zaletą jest też łatwość implementacji (w języku C++ ten algorytm można zakodować w kilkunastu linijkach). Jednym z nielicznych minusów tego podejścia jest dość duże wykorzystanie dodatkowej pamięci (potrzebujemy jej ).
ACO, jako prawdziwa metaheurystyka, może być stosowana do bardzo różnorodnych zadań. Wydaje się, że można ją przystosować do rozwiązywania bardzo wielu problemów optymalizacyjnych – wystarczy, by każde rozwiązanie naszego problemu dało się podzielić na fragmenty, lokalne „atomowe” decyzje, które razem wyznaczają rozwiązanie i które są od siebie możliwie niezależne (oczywiście, zależy nam na tym, by przestrzeń tych decyzji była możliwie mała). Potem już tylko na przestrzeni rozwiązań ustalamy funkcję celu, określającą jakość rozwiązania i ewentualnie opracowujemy jakąś pomocniczą heurystykę ułatwiającą podejmowanie lokalnych decyzji (w przypadku problemu komiwojażera była to odwrotność odległości pomiędzy miastami) – i dalszym rozwiązywaniem zadania możemy obarczyć mrówki w dobrze już nam znany sposób (wszystkie opcje, które mrówka będzie mogła wybrać w poszczególnych decyzjach, otrzymają własne zbiorniczki z feromonem, który będzie do nich dolewany po zakończeniu tury proporcjonalnie do jakości rozwiązań, w których uczestniczyły; pełniejsze zbiorniczki będą bardziej kuszące dla mrówek; feromon będzie z czasem odparowywał ze zbiorniczków). W praktyce mrówki są wykorzystywane w sterowaniu ruchem w sieciach komputerowych, w kolorowaniu grafów i znajdowaniu skojarzeń.