Różne reprezentacje mapy feromonowej w problemie plecakowym



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

Algorytmy mrówkowe. P. Oleksyk. Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny w Szczecinie Inteligentne systemy informatyczne

Zadania laboratoryjne i projektowe - wersja β

Algorytmy mrówkowe. H. Bednarz. Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny w Szczecinie Inteligentne systemy informatyczne

Techniki optymalizacji

Temat: Algorytmy zachłanne

Problem komiwojażera ACO. Zagadnienie optymalizacyjne, polegające na znalezieniu minimalnego cyklu Hamiltona w pełnym grafie ważonym.

Algorytmy mrówkowe (ang. Ant Colony Optimization)

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

Wykorzystanie algorytmów mrówkowych w dynamicznym problem

Algorytm genetyczny (genetic algorithm)-

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

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

Algorytmy Mrówkowe. Daniel Błaszkiewicz. 11 maja Instytut Informatyki Uniwersytetu Wrocławskiego

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

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

Systemy mrówkowe. Opracowali: Dawid Strucker, Konrad Baranowski

Aproksymacja funkcji a regresja symboliczna

Optymalizacja. Wybrane algorytmy

Zadanie 5 - Algorytmy genetyczne (optymalizacja)

Algorytmy sztucznej inteligencji

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

Schemat programowania dynamicznego (ang. dynamic programming)

Instrukcja obsługi programu Do-Exp

Programowanie dynamiczne cz. 2

Obliczenia inspirowane Naturą

Problem Komiwojażera - algorytmy metaheurystyczne

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

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.

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

Data Mining Wykład 9. Analiza skupień (grupowanie) Grupowanie hierarchiczne O-Cluster. Plan wykładu. Sformułowanie problemu

Algorytmy metaheurystyczne Wykład 6. Piotr Syga

Wykład 4. Droga i cykl Eulera i Hamiltona

Wstęp do programowania

Program EWIDENCJA ODZIEŻY ROBOCZEJ INSTRUKCJA UŻYTKOWNIKA Przejdź do strony producenta programu

Obliczenia Naturalne - Algorytmy Mrówkowe

Polcode Code Contest PHP-10.09

Algorytm. a programowanie -

5.2. Pierwsze kroki z bazami danych

Expo Composer Garncarska Szczecin tel.: info@doittechnology.pl. Dokumentacja użytkownika

Programowanie celowe #1

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

Wykorzystanie algorytmów mrówkowych w dynamicznym problem

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

Program EWIDENCJA ODZIEŻY ROBOCZEJ INSTRUKCJA UŻYTKOWNIKA Przejdź do strony producenta programu

Algorytm dyskretnego PSO z przeszukiwaniem lokalnym w problemie dynamicznej wersji TSP

Droga i cykl Eulera Przykłady zastosowania drogi i cyku Eulera Droga i cykl Hamiltona. Wykład 4. Droga i cykl Eulera i Hamiltona

w analizie wyników badań eksperymentalnych, w problemach modelowania zjawisk fizycznych, w analizie obserwacji statystycznych.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

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

Elementy modelowania matematycznego

Algorytmy genetyczne

Laboratorium - Monitorowanie i zarządzanie zasobami systemu Windows 7

SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE

SCHEMAT ROZWIĄZANIA ZADANIA OPTYMALIZACJI PRZY POMOCY ALGORYTMU GENETYCZNEGO

Algorytmika Problemów Trudnych

LABORATORIUM 7: Problem komiwojażera (TSP) cz. 2

PRZEWODNIK PO ETRADER ROZDZIAŁ XII. ALERTY SPIS TREŚCI

1 Automaty niedeterministyczne

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Problemy z ograniczeniami

Kumulowanie się defektów jest możliwe - analiza i potwierdzenie tezy

Algorytmy i struktury danych.

1. Zarządzanie informacją w programie Access

13. Równania różniczkowe - portrety fazowe

1. Umieść kursor w miejscu, w którym ma być wprowadzony ozdobny napis. 2. Na karcie Wstawianie w grupie Tekst kliknij przycisk WordArt.

Wstęp do programowania

0 + 0 = 0, = 1, = 1, = 0.

Rozdział 1 PROGRAMOWANIE LINIOWE

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

Spis treści. 1 Moduł Mapy 2

PROBLEM: SORTOWANIE PRZEZ ODWRÓCENIA METODA: ALGORYTMY ZACHŁANNE

Rozdział 1 PROGRAMOWANIE LINIOWE

Efektywność Procedur Obliczeniowych. wykład 5

Algorytmy zachłanne. dr inż. Urszula Gałązka

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Algorytm Genetyczny. zastosowanie do procesów rozmieszczenia stacji raportujących w sieciach komórkowych

Wyszukiwanie binarne

Priorytetyzacja przypadków testowych za pomocą macierzy

I. Program II. Opis głównych funkcji programu... 19

Heurystyczne metody przeszukiwania

Programowanie dynamiczne

Instrukcja projektowa cz. 2

Maciej Piotr Jankowski

4.2. Ustawienia programu

Układy VLSI Bramki 1.0

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Spacery losowe generowanie realizacji procesu losowego

Algorytmy metaheurystyczne podsumowanie

W. Guzicki Zadanie 41 z Informatora Maturalnego poziom podstawowy 1

Heurystyki. Strategie poszukiwań

Instrukcja wprowadzania graficznych harmonogramów pracy w SZOI Wg stanu na r.

ALHE. prof. Jarosław Arabas semestr 15Z

Przydziały (limity) pojemności dyskowej

Materiały: kartki papieru (5 x 5 kolorów), piłeczki pingpongowe (5 x 5 kolorów), worek (nieprzeźroczysty).

TEORETYCZNE PODSTAWY INFORMATYKI

Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas

S O M SELF-ORGANIZING MAPS. Przemysław Szczepańczyk Łukasz Myszor

Transkrypt:

Wydział Informatyki i Nauki o Materiałach Jarosław Dąbrowski 193207 Praca magisterska Różne reprezentacje mapy feromonowej w problemie plecakowym Promotor: dr inż. Mariusz Boryczka Sosnowiec, 2008

Spis treści Spis treści 2 Wstęp 4 1 Algorytmy mrówkowe i mrowiskowe 6 1.1 Wprowadzenie do wirtualnych mrówek.................. 6 1.2 System mrówkowy (AS - Ant System)................... 9 1.3 System mrówkowy Max-Min (MMAS - Min-Max Ant System)..... 14 1.4 System Mrowiskowy - ACS (Ant Colony System)............ 15 2 Problem plecakowy 18 2.1 Klasyczny problem plecakowy....................... 18 2.2 Odmiany problemu plecakowego...................... 20 2.3 Przykład problemu plecakowego...................... 23 2.4 Techniki rozwiązywania problemów plecakowych............. 24 3 Reprezentacje mapy feromonowej w problemie plecakowym 28 3.1 Adaptacja systemu mrowiskowego do MKP................ 28 3.2 Ślad feromonowy odkładany w węzłach.................. 29 3.3 Ślad feromonowy odkładany na krawędziach............... 32 4 Aplikacja do analizy reprezentacji feromonowych. 35 4.1 Instrukcja obsługi programu........................ 35 4.2 Dokumentacja techniczna......................... 46 5 Badania i eksperymenty 55 2

5.1 Badanie parametrów dla krawędziowej reprezentacji feromonu..... 55 5.2 Badanie parametrów dla węzłowej reprezentacji feromonu........ 66 5.3 Porównanie różnych reprezentacji mapy feromonowej.......... 74 Podsumowanie 80 Bibliografia 82 Spis rysunków 84 Spis tabel 86 3

Wstęp Celem tej pracy jest porównanie różnych rodzajów reprezentacji feromonu w systemie mrowiskowym zaadaptowanym do optymalizacji problemu plecakowego. System mrowiskowy, podobnie jak algorytmy genetyczne i inne algorytmy ewolucyjne jest algorytmem niedeterministycznym. Bazuje na czynniku losowym. W wielu przypadkach jest niezastąpionym sposobem rozwiązywania problemów, dla których nie istnieją lub nie znaleziono do tej pory algorytmu o wielomianowej złożoności czasowej. Do pracy dołączona została płyta CD zawierająca aplikację testową umożliwiającą porównanie reprezentacji węzłowej i krawędziowej mapy feromonowej. Przy projektowaniu aplikacji testowej głównym zamierzeniem było stworzenie elastycznego i otwartego na modyfikacje modelu danych oraz intuicyjnego interfejsu użytkownika. Optymalizacja algorytmów nie była pierwszorzędnym celem. Aplikację przy niewielkiej modyfikacji będzie można rozszerzyć do rozwiązywania innego rodzaju trudnych, lub wręcz niemożliwych do rozwiązania za pomocą algorytmów deterministycznych problemów. Jako narzędzie do implementacji modelu systemu mrowiskowego wybrano Microsoft Visual Studio 2005. Kod programu napisany został w języku C#. Układ tej pracy jest następujący: W pierwszym rozdziale opisana jest geneza systemu mrówkowego oraz jego ewolucja do systemu mrowiskowego. Przedstawione są przykłady zastosowania i wyjaśniona jest zasada działania tych systemów. W kolejnym rozdziale została omówiona istota problemu plecakowego oraz jego modyfikacje. Przedstawiona została definicja problemu plecakowego oraz informacje dotyczące jego złożoności. Krótko opisano sposoby rozwiązywania różnych typów problemów plecakowych. 4

Rozdział trzeci przedstawia sposoby adaptacji systemu mrowiskowego do problemu plecakowego. Zostały omówione dwie różne reprezentacje mapy feromonowej: węzłowa i krawędziowa. Omówiono rodzaje lokalnych heurystyk i reguły aktualizacji śladu feromonowego dla każdej z wymienionych reprezentacji. W rozdziale czwartym opisana została aplikacja dołączona do pracy. W instrukcji użytkownika przedstawiono możliwości i opisano poszczególne funkcjonalności programu oraz opisano format danych wejściowych i wyjściowych. Dokumentacja techniczna przedstawia schemat działania programu, model danych oraz komunikację pomiędzy elementami systemu. Ostatni rozdział zawiera opis badań i eksperymentów, które umożliwiła przedstawiona wcześniej aplikacja. Zbadany został wpływ poszczególnych parametrów na wyniki działania algorytmu. Porównane zostały obie omówione reprezentacje feromonu. W rozdziale tym podjęto również próbę skonstruowania takiego zestawu parametrów, który dawałby satysfakcjonujące wyniki dla różnych problemów plecakowych. Praca kończy się wnioskami. 5

Rozdział 1 Algorytmy mrówkowe i mrowiskowe Początki sztucznej inteligencji sięgają lat pięćdziesiątych ubiegłego wieku. Powstały wówczas pierwsze, istniejące do dziś laboratorium AI na Uniwersytecie Carnegie Mellon, założone przez Allena Newella i Herberta Simona oraz Massachusetts Institute of Technology, założone przez Johna McCarthy ego. Sztuczna inteligencja po raz pierwszy została zdefiniowana Johna McCarthy ego w 1955 r.: konstruowanie maszyn, o których działaniu dałoby się powiedzieć, że są podobne do ludzkich przejawów inteligencji. Podejmowano wówczas próby zastosowania systemów komputerowych do rozwiązywania złożonych problemów przy braku wszystkich danych. Jednymi z pierwszych takich systemów były algorytmy genetyczne. Na początku lat 90-tych ubiegłego wieku zaproponowano system mrówkowy (z ang. Ant System). 1.1 Wprowadzenie do wirtualnych mrówek Mrówki są owadami żyjącymi w koloniach. Potrafią ze sobą współpracować, dzięki czemu tworzą silną społeczność. Dzięki organizacji grupowej są w stanie wykonać wiele czynności, z którymi nie poradziłyby sobie pojedyncze osobniki. Potrafią odnaleźć najkrótszą drogę z mrowiska do źródła pożywienia. Dokonują tego bez użycia znaków wizualnych. Potrafią przystosować się do zmian w otoczeniu. Przykładowo mogą odnaleźć nową drogę do pożywienia, gdy dotychczasowa droga staje się niedostępna. 6

Rysunek 1.1: Droga mrówek z mrowiska do pożywienia W latach czterdziestych ubiegłego wieku francuski entomolog Pierre-Paul Grasse zaobserwował, że niektóre gatunki termitów reagują na pewnego rodzaju bodźce. Zauważył, że reakcją owada na powyższe bodźce może być wyzwolenie tych samych bodźców. Sposób komunikacji, dzięki któremu praca osobników jest stymulowana przez wydajność jaką osiągnęły nazwał stygmerią. Stygmeria jest nie bezpośrednią formą komunikacji. Owady wymieniają informację modyfikując swoje otoczenie. Informacja stymergiczna może być więc odczytana jedynie przez te owady, które znajdują się w pobliżu miejsca wyzwolenia bodźca. Zjawisko stygmerii występuje również w koloniach mrówek. Aby uformować odpowiednią trasę od pożywienia do gniazda, mrówki posługują się śladem feromonowym. Podczas przemieszczania się mrówka pozostawia pewną ilość feromonu. W większości przypadków mrówki kierują się tam, gdzie feromonu jest więcej. To elementarne zachowanie pomoże odpowiedzieć na pytanie, jak mrówki odnajdują najkrótszą drogę pomiędzy pożywieniem a mrowiskiem, gdy na dotychczasowej drodze pojawia się przeszkoda. Drogę z mrowiska do źródła pożywienia przedstawia rysunek 1.1. W momencie pojawienia się przeszkody (rysunek 1.2, które znajdują się tuż przed przeszkodą nie mają możliwości kontynuowania drogi ustanowionej śladem feromonowym. Muszą skręcić w lewo lub w prawo. Pierwsza mrówka wybierze kierunek losowo. Prawdopodobieństwo, że wybierze krótszą drogę jest równe temu, że wybierze drogę dłuższą. W tej sytuacji w przybliżeniu połowa mrówek skręci w jedną stronę, a druga połowa w drugą. Część mrówek, która losowo wybrała krótszą drogę do ominięcia przeszkody, szybciej odnajdzie zagubiony ślad feromonowy. To spowoduje, że na krótszej ścieżce zostanie odłożona większa ilość feromonu w jednostce czasu. Drogę, na której znajduje się większa ilość feromonu jest bardziej atrakcyjna dla mrówek. Decyzja o wyborze 7

drogi o największej ilości feromonu nie jest deterministyczna, jednak prawdopodobieństwo wyboru drogi rośnie wraz z ilością odłożonego na niej śladu feromonowego. Przez to coraz więcej mrówek zaczyna wybierać krótsza trasę, gdyż znajduje się tam więcej feromonu (rysunek 1.3). Jest to tzw. proces autokatalityczny. Jak widać mrówka działa jako pojedynczy agent chaotycznie, wybierając drogę losowo, jednak dzięki kooperacji z innymi agentami uzyskuje dużo lepsze rezultaty. Zjawisko to zostało wykorzystane w informatyce. Sztuczne mrówki, wzorowane na mrówkach istniejących w środowisku naturalnym są tzw. agentami służącymi do optymalizacji rozwiązań wielu problemów algorytmicznych. Za pomocą tych mrówek otrzymujemy probabilistycznie przybliżone rozwiązania - jedynie w niektórych przypadkach optymalne. Systemy mrówkowe znajdują zastosowanie przy rozwiązywaniu trudnych problemów, często nierozwiązywalnym za pomocą deterministycznych algorytmów. Wykorzystuje się je m. in. do rozwiązywania problemu komiwojażera (TSP - Travelling Salesman Problem), problemów plecakowych (KP - Knapsack Problem) problemów szeregowania zadań (Scheduling problems), trasowania pakietów w sieciach bezprzewodowych i optycznych (Connectionless Network Routing, Optical Network Routing). W tej pracy system mrowiskowy (z ang. ACS - Ant Colony System) zostanie zaadoptowany do wielokrotnego problemu plecakowego w werjsji dyskretnej. Problem ten należy do dziedziny problemów plecakowych. Zwykle nie można rozwiązać metodami deterministycznymi. System mrowiskowy posłuży do generowania rozwiązań wspomnianego problemu. 1.2 System mrówkowy (AS - Ant System) System mrówkowy (Ant System) został zaproponowany przez Włochów: Marco Dorigo, Vittorio Maniezzo i Alberto Colorni na początku lat 90-tych ubiegłego wieku [4]. Stał się pierwszym algorytmem ACO (Ant Colony Optimalization). W tym systemie sztuczne mrówki poszukują rozwiązania poruszając się po grafie problemu. Uruchamiana jest zadana liczba iteracji. Podczas każdej z nich określona liczba mrówek porusza się po grafie wykonując n kroków. W każdym kroku mrówki nakładają ślad feromono- 9

wy i podejmują probabilistyczną decyzję o przejściu do kolejnego węzła grafu. Systemy mrówkowe i mrowiskowe zostały szerzej opisane w publikacjach [5], [6]. Okazało się, że systemy mrówkowe doskonale nadają się do rozwiązywania problemów NP-zupełnych. Działanie systemu mrówkowego najłatwiej opisać na przykładzie problemu komiwojażera. Optymalnym rozwiązaniem tego problemu jest najkrótsza droga (sumaryczna odległość) przebiegająca przez wszystkie miasta (węzły). Dodatkowym ograniczeniem jest to, że każde z miast można odwiedzić jednokrotnie. Problem TSP jest rozwiązywalny za pomocą algorytmu o złożoności n!, dlatego już przy większej liczbie miast nie można go rozwiązać w sensownym czasie. Przyjmijmy następujące założenia: zbiór n miast oznaczonych 1, 2... n oraz odległości między nimi oznaczone d ij graf (N, E), gdzie N jest zbiorem miast, a E - zbiorem odległości pomiędzy nimi. b i (t), gdzie i = 1, 2,..., n jest liczbą mrówek w mieście (węźle) i w chwili t. m jest sumaryczną liczbą mrówek we wszystkich miastach (węzłach). Każda mrówka to prosty agent, którego cechy zostaną omóione w dalszej części pracy. W pierwszym kroku algorytmu mrówki są ustawiane w losowo wybranych miastach (węzłach grafu problemu). W kolejnych krokach poruszają się po krawędziach grafu przechodząc do kolejnych miast. Kolejne krawędzie łączące miasta wybierane są przez mrówki na podstawie prawdopodobieństwa zależnego od funkcji odległości pomiędzy miastami (węzłami) oraz śladu feromonowego odłożonego na krawędzi. Przejście mrówki do miasta odwiedzonego wcześniej jest niedozwolone. Zrealizowane jest to za pomocą tzw listy tabu - listy odwiedzonych miast przez mrówkę. Zbiór miast odwiedzonych przez mrówkę k oznaczono M k. Prawdopodobieństwo przejścia mrówki k z miasta i do miasta j wyraża się wzorem: p ij (t) = [τ ij (t)] α [η ij ] β s/ M k [τ is (t)] α [η is ] β gdy j / M k 0 gdy j M k (1.1) 10

Rysunek 1.4: Wybór krawędzi gdzie η jest odwrotnością odległości między miastami (η ij = 1/d ij ), natomiast α i β to współczynniki wagowe. Wpółczynnik α jest wagą śladu feromonowego, a β jest wagą widoczności η. Przykład: Na rysunku 1.4 mrówka ma do wyboru 4 krawędzie: SA, SB, SC, SD, na których odłożono feromon o następujących wartościach: τ SA = 0.02, τ SB = 0.015, τ SC = 0.37, τ SD = 0.28. Dla uproszczenia załóżmy, że dla każdej krawędzi widoczność η ij jest jednakowa, równa 1 i przyjmijmy parametry α = 1 i β = 1. Z wzoru 1.1 obliczamy prawdopodobieństwo wybrania każdej z krawędzi: 0.02 p A = 0.02 + 0.015 + 0.037 + 0.28 = 0.02 0.1 = 0.2 0.015 p B = 0.02 + 0.015 + 0.037 + 0.28 = 0.015 0.1 = 0.15 0.037 p C = 0.02 + 0.015 + 0.037 + 0.28 = 0.037 0.1 = 0.37 0.028 p D = 0.02 + 0.015 + 0.037 + 0.28 = 0.028 0.1 = 0.28 11

Aktualizacja śladu feromonowego Po przejściu całej trasy przez pojedynczą mrówkę, nakładany jest ślad feromonowy na każdej odwiedzonej krawędzi (i, j). Niech τ ij oznacza wielkość śladu feromonowego na krawędzi (i, j): τ ij (t + 1) = (1 ρ) τ ij (t) + τ ij (t, t + 1) (1.2) gdzie ρ jest współczynnikiem takim, że (1 ρ) oznacza pozostałość śladu feromonowego - wartość ρ musi być mniejsza od 1, aby uniknąć nieskończonej kumulacji śladu feromonowego. τij(t, k t + 1) jest wartością śladu feromonowego odłożonego na krawędzi(i, j) przez k-tą mrówkę w chwili pomiędzy t a t + 1. Obliczana jest wg wzoru: m τ ij (t, t + 1) = τij(t, k t + 1) (1.3) k=1 Dla każdej mrówki tworzymy strukturę danych zwaną listą tabu, w której przechowywane będą identyfikatory odwiedzonych miast. Taki zabieg należy przeprowadzić, aby zapewnić, że każde miasto zostanie odwiedzone przez mrówkę dokładnie jeden raz. Przy kolejnych krokach mrówki, krawędzie prowadzące do miast znajdujących się naliście tabu nie są brane pod uwagę. Pojawiło się kilka koncepcji obliczania wyrażenia τij(t, k t+1). W zależności od sposobu obliczania tej wartości, oraz od tego, w którym momencie będzie uaktualniany ślad feromonowy τ ij (t), algorytm będzie skutkował innymi wynikami. W związku z tym powstały 3 postacie algorytmu mrówkowego. Feromon stały (Ant-density) W algorytmie Feromon stały dana ilość śladu feromonowego Q 1 jest odkładana za każdym razem, kiedy mrówka przechodzi z miasta i do miasta j. Q τij(t, k 1 gdy k-ta mrówka przechodzi z i do j pomiędzy chwilą t a t + 1 t+1) = 0 w przeciwnym wypadku 12

W momencie 0 (na początku działania algorytmu) mrówki zostają rozlokowane w różnych miastach, a intensywność śladu feromonowego na krawędziach jest ustawiana do wartości początkowej. Do listy tabu każdej mrówki dopisywane jest aktualne miasto. Każda mrówka przechodzi z miasta i do j wybierając miasto, do którego przechodzi z prawdopodobieństwem danym funkcją 1.1. Na wynik funkcji wpływają 2 czynniki: wielkość feromonu na krawędzi (τ ij ) oraz widoczność (η ij ) sterowane przez parametry wagowe α i β. Za każdym razem, gdy mrówka wykonuje przejście do kolejnego miasta, pozostawia ona ślad feromonowy na krawędzi (i, j) - ilość śladu odłożonego przez mrówkę jest dodawana do ilości feromonu znajdującego się wcześniej na tej krawędzi uwzględniając odparowywanie feromonu. Gdy każda mrówka wykona ruch, obliczane są prawdopodobieństwa przejść do kolejnych miast uwzględniając nowe wartości śladu feromonowego odłożonego na krawędziach. Algorytm zostaje zakończony po (n 1) krokach - listy tabu będą w tym momencie pełne, więc mrówki nie będą miały możliwości przejścia do żadnego miasta. Feromon średni (Ant-quantity) Sposób działania algorytmu feromon średni jest bardzo zbliżony do działania feromonu stałego z tą różnicą, że ilość feromonu odkładanego na krawędzi jest odwrotnie proporcjonalna do długości tej krawędzi. Zatem w algorytmie feromon średni mamy: τij(t, k t+1) = Q 2 d ij gdy k-ta mrówka przechodzi z i do j pomiędzy chwilą t a t + 1 0 w przeciwnym wypadku Feromon cykliczny (Ant-cycle) Ta postać algorytmu mrówkowego bardziej różni się od wcześniej omówionych algorytmów (feromon stały i średni). W tym przypadku ślad feromonowy nie jest nakładany po każdym przejściu mrówki z miasta do miasta, ale po przejściu całej drogi przez mrówkę: 13

τij(t, k t+1) = Q 3 L k gdy k-ta mrówka przechodzi z i do j pomiędzy chwilą t a t + 1 0 w przeciwnym wypadku gdzie Q 3 jest stałą, a L k jest długością trasy przebytej przez mrówkę k. W przypadku tego algorytmu można oczekiwać lepszych wyników od dwóch poprzednich, ponieważ użyta tutaj jest informacja związana z globalną wartością wyniku. Ilość feromonu jest aktualizowana co n kroków, a wartość jest obliczana analogicznie do wzoru 1.2: τ ij (t + n) = ρ 1 τ ij (t) + τ ij (t, t + n) (1.4) gdzie m τ ij (t, t + n) = τij(t, k t + 1) k=1 Używamy tu innego współczynnika ρ 1, ponieważ zanikanie śladu feromonowego również następuje po przejściu całej trasy przez mrówki. Więcej informacji na temat odmian systemu mrówkowego znajduje się w publikacji [9]. 1.3 System mrówkowy Max-Min (MMAS - Min-Max Ant System) W roku 2000 Stutzle i Hoos zaproponowali system mrówkowy Max-Min AS (MMAS)[7], który jest bardzo zbliżony do pierwotnej wersji systemu mrówkowego. Pierwszą cechą wyróżniającą to rozwiązanie jest fakt, że krawędzie odwiedzone przez najlepszą mrówkę w bieżącej iteracji otrzymują dodatkową dawkę feromonu. Dodatkowo wartości śladu feromonowego są ograniczone przez przedział [τ min, τ max ]. Pomaga to ominąć stagnację, która miała miejsce w systemach mrówkowych, gdy nagradzano jedynie tę mrówkę, która odkryła najlepsze rozwiązanie. Zastosowano tu również metodę wygładzania śladu feromonowego (z ang. trail smoothing mechanism). Polega ona na tym, że ostateczna ilość nakładanego śladu feromonowego jest proporcjonalna do różnicy maksymalnej możliwej ilości feromonu na krawędzi (τ max ) i ilości nałożonej ilości feromonu w danym cyklu, czyli: τ ij τ max τ ij (1.5) 14

. 1.4 System Mrowiskowy - ACS (Ant Colony System) Pierwotną wersją systemu mrowiskowego był system mrówkowy. AS był początkowo zastosowany do rozwiązania problemu komiwojażera (TSP). Powstały jednak lepsze algorytmy w tej dziedzinie. Mimo to, system mrówkowy stanowi trzon algorytmów mrowiskowych, w których również wykorzystuje się sztuczne mrówki i ślad feromonowy. Krawędzie grafu problemu są modyfikowane o odpowiednią ilość feromonu, proporcjonalną do wartości rozwiązania. Na koncu każdego cyklu część feromonu zanika. Aktualizacja śladu feromonowego (globalna i lokalna) W systemie mrowiskowym występuje dodatkowo zjawisko globalnej aktualizacji feromonu - ślad feromonowy nakładany jest dodatkowo tam, gdzie znaleziono najlepsze dotąd rozwiązanie w czasie działania algorytmu. Modyfikacja ta została wprowadzona, aby zwiększyć atrakcyjność najbardziej obiecującej trasy. Dzięki temu algorytm szybciej skupia się na poszukiwaniu optymalnej trasy w pobliżu najlepszego dotąd znalezionego rozwiązania. Globalna aktualizacja śladu feromonowego następuje po odwiedzeniu wszystkich miast przez mrówkę. Feromon jest aktulizowany w następujący sposób: τ ij (t + n) = (1 α) τ ij (t) + α 1 n L + (1.6) gdzie τ ij to ilość feromonu na krawędzi (i, j), α to współczynnik odparowywania feromonu, a L + to długość najlepszej znalezionej dotąd trasy. Podobnie jak w systemie mrówkowym, za każdym razem, gdy mrówka przemieszcza się do kolejnego miasta, następuje lokalna aktualizacja feromonu. Ślad fero- 15

monowy znajdujący się na aktualnej krawędzi jest modyfikowany według wzoru: τ ij (t + 1) = (1 ρ) τ ij (t) + ρ τ 0 gdzie τ 0 jest wartością początkową feromonu. W pierwszym cyklu na każdej z krawędzi nałożony jest ślad feromonowy o wartości τ 0. Dobry mechanizm aktualizacji śladu feromonowego pozwala ominąć stagnację. Jest to stan, w którym wszystkie mrówki zaczynają generować jednakowe rozwiązanie problemu, a tym samym zaprzestają dalszą eksplorację w poszukiwaniu lepszego wyniku. Stagnacja powodowana jest zbyt wysokim stężeniem feromonu na trasie jednego rozwiązania w przypadku, gdy parametry zostaną źle dobrane do aktualnego problemu. Jednym z najtrudniejszych zadań jest właśnie dobór odpowiednich parametrów, tak aby algorytm odpowiednio balansował pomiędzy eksploatacją znalezionych dotąd dróg a eksploracją nowych rozwiązań. Eksploracja i eksploatacja W systemie mrowiskowym, przed przejściem do kolejnego miasta, mrówka podejmuje decyzje o eksploracji lub eksploatacji trasy. Decyzja ta podejmowana jest na podstawie czynnika losowego. Jako jeden z parametrów algorytmu ustalana jest wartość q 0 < 0, 1 >. Przed każdym przejściem mrówki, w celu podjęcia decyzji generowana jest liczba pseudolosowa q również z przedziału < 0, 1 >. arg max{[τ ij ] [η ij ] β } jeżeli q q 0 j = j / M k J w przeciwnym przypadku (1.7) Jeżeli q jest mniejsze lub równe q 0, podejmowana jest decyzja o eksploracji. W tym przypadku mrówka wybiera najbardziej atrakcyjne miasto. Wybór miasta zależy od widoczności miasta (η) oraz ilości feromonu odłożonego na drodze do niego (τ). Decyzja ta jest deterministyczna i określona wzorem: j = arg max j / M k {[τ ij ] [η ij ] β } 16

W przypadku, gdy wartość q jest większa od q 0, podejmowana jest decyzja o eksploracji. Na wybór miasta podczas eksploracji ma wpływ czynnik losowy. Prawdopodobieństwo przejścia do miasta j w tym wypadku określone jest wzorem p ij (t) = τ ij (t) [η ij ] β s/ M k τ is (t) [η is ] β gdy j / M k 0 gdy j M k (1.8) 17

Rozdział 2 Problem plecakowy 2.1 Klasyczny problem plecakowy Załóżmy, że planujemy wycieczkę w góry. Jesteśmy zainteresowani, aby zapełnić nasz plecak najpotrzebniejszymi przedmiotami. Mamy do dyspozycji N różnych typów przedmiotów, które są nam niezbędne. Mogą to być: butelka wody, termos herbaty, kanapka, jabłko, pomarańcza, kurtka, sweter. Każdy z tych elementów ma określone dwa atrybuty: objętość przedmiotu oraz jego wartość (czynnik, który decyduje o stopniu przydatności danego przedmiotu). Pojemność naszego plecaka jest ograniczona, dlatego sumaryczna objętość przedmiotów nie może przekroczyć objętości plecaka. Zadanie polega na tym, aby zapakować do plecaka taką kombinację przedmiotów, aby ich sumaryczna wartość była jak największa. Powyższe problem nosi nazwę problemu plecakowego. Zwany również zadaniem załadunku lub dylematem złodzieja, jest popularnym problemem optymalizacji kombinatorycznej. Optymalizacja kombinatoryczna Optymalizacja kombinatoryczna jest gałęzią optymalizacji w matematyce stosowanej i informatyce. Jest szczególnym przypadkiem problemów optymalizacyjnych - przestrzeń rozwiązań jest zbiorem dyskretnym. Dodatkowo wszystkie rozwiązania muszą spełniać warunek wykonalności, który określa dziedzinę problemu. Algorytmy optymalizacji kombinatorycznej pomagają rozwiązać problemy ogólnie uznawane za 18

trudne do rozwiązania. Zwykle polegają na eksploracji dużej przestrzeni rozwiązań tych problemów, stopniowo zawężając ścieżkę poszukiwań. Opisywany wcześniej System Mrowiskowy, przystosowany do rozwiązywania problemu plecakowego jest jednym z takich algorytmów. Optymalizacja kombinatoryczna skupia się głównie wokół problemów NP-trudnych. Problemy te uznawanę są za nierozwiązywalnew rozsądnym czasie. Mimo to, w niektórych przypadkach (np. gdy przestrzeń rozwiązań jest niewielka), możemy je rozwiązać. Złożoność obliczeniowa Klasą złożoności nazywamy zbiór problemów obliczeniowych o podobnej złożoności obliczeniowej. Problem należy do klasy P, jeżeli istnieje deterministyczna maszyna turinga rozwiązująca ten problem w czasie wielomianowym.[18] Jeżeli istnieje niedeterministyczna maszyna turinga rozwiązująca problem w czasie wielomianowym, to problem należy do klasy NP. Problem p jest NP-zupełny, gdy należy do klasy NP oraz gdy każdy problem z klasy NP można sprowadzić w czasie wielomianowym do problemu p. Teoria złożoności obliczeniowej została szerzej opisana w publikacji [16]. Formalna definicja problemu plecakowego Problem plecakowy możemy sformułować w następujący sposób: Do dyspozycji mamy plecak o pojemności W oraz zbiór n elementów {x 1, x 2,..., x N }. Każdy element i ma określoną wartość p i oraz rozmiar w i. Maksymalizujemy funkcję: przy założeniu: n p i x i (2.1) i=1 n w i x i W, x i {0, 1} (2.2) i=1 19

Złożoność problemu plecakowego Problem plecakowy należy do klasy problemów NP-zupełnych. Dowód: Rozważmy szczególny przypadek problemu plecakowego, w którym p i = w i dla każdego i oraz W = P. To oznacza, że mamy dany zbiór liczb całkowitych w 1,, w n. Liczba P to łączna wartość obiektów wchodzących w skład rozwiązania. Sprawdzamy, czy można wybrać takie liczby, by ich suma wynosiła dokładnie P. Problem ten okazuje się być NP-zupełny. Można zredukować do niego problem pokrycia trójelementowymi podzbiorami, który jest NP-zupełny. Mamy dany przykładowy problem pokrycia trójelementowymi zbiorami: {S 1,, S n }. Musimy sprawdzić, czy wśród danych zbiorów istnieją takie zbiory, które są rozłączne parami i pokrywają zbiór U = {1, 2,, 3m}. Zbiory te przedstawiamy jako wektory bitowe z {0, 1} 3m. Sumowanie tych zbiorów przypomina dodawanie liczb zapisanych w systemie binarnym. Poszukujemy podzbioru tych liczb, którego elementy dadzą w sumie P = 2 n 1. Dodawanie wektorów binarnych różni się jednak od dodawania liczb, dlatego wektory potraktujemy jako liczby przedstawione nie przy podstawie 2, ale przy podstawie n + 1. Wtedy zbiór S staje się liczbą w i = j S(n+1) 3m j. Możemy więc dowieść, że jeżeli istnieje taki podzbiór liczb, którego suma wynosi P = 3m 1 j=0 (n + 1) j, to jest to równoważne istnieniu dokładnego pokrycia zbiorami {S 1, S 2,, S n }. Złożoność problemu plecakowego została omówiona szerzej w publikacji [16]. 2.2 Odmiany problemu plecakowego W klasycznym problemie plecakowym przedmioty nie powtarzają się. Mamy do dyspozycji po jednym elemencie o określonym typie i wartości. Powyższy przypadek nosi nazwę 0-1 lub binarnego problemu plecakowego. Podział ze względu na powtarzalność przedmiotów się powtarzać. Istnieją odmiany problemu plecakowego, w których elementy w plecaku mogą 20

Ze względu na powtarzalność przedmiotów problemy plecakowe dzielimy na: binarne (0-1), nieograniczone, ograniczone. Modyfikacja problemu plecakowego, w założeniach której możemy wielokrotnie umieszczać ten sam przedmiot w plecaku, nosi nazwę nieograniczonego problemu plecakowego (z ang. unbounded knapsack problem). W tym przypadku założenia matematyczne do problemu wyglądają nieco inaczej: n w i x i W, x i {0,, n} (2.3) i=1 Jeżeli przedmioty w plecaku mogą się powtarzać, ale mamy ograniczoną liczbę każdego z przedmiotów, to mówimy o ograniczonym problemie plecakowym (bounded knapsack problem): n w i x i W, x i {0,, b i } (2.4) i=1 gdzie b i jest maksymalną liczbą i-tego przedmiotu, jaka może znaleźć się w plecaku. Podział ze względu na możliwość dzielenia przedmiotów Biorąc pod uwagę możliwość dzielenia przedmiotów, problem plecakowy możemy podzielić na ciągły i dyskretny. W przypadku problemu ciągłego przedmioty możemy sobie wyobrazić jako substancje sypkie lub płynne. W plecaku możemy umieścić dowolną część przedmiotu: n w i x i W, x i R, x 0, 1 (2.5) i=1 Gdy mówimy o problemie dyskretnym, mamy do dyspozycji przedmioty, których nie możemy dzielić. Jeżeli istnieje możliwość dzielenia przedmiotu (i mówimy o problemie jednowymiarowym), to problem plecakowy jest rozwiązywalny przy użyciu algorytmu zachłannego. Aby rozwiązać taki problem, wystarczy obliczyć dla każdego przedmiotu współczynnik wartość/waga, a następnie wypełnić plecak przedmiotami według wielkości obliczonego współczynnika (ropoczynając od najwyższego). 21

Podział ze względu na liczbę ograniczeń Omówione wcześniej odmiany uwzględniały tylko jedno ograniczenie - wagę przedmiotów. W tym przypadku problem nazywamy jednowymiarowym. Każdy przedmiot oprócz wagi może charakteryzować się również objętością, a plecak może mieć ograniczoną dopuszczalną wagę i objętość. W tej sytuacji mówimy o problemie wielokrotnie ograniczonym lub wielowymiarowym (z ang. Multi-dimensional Knapsack Problem). Oczywiście oprócz wagi i objętości możemy ustalić inne ograniczenia. Liczba ograniczeń w problemie wielowymiarowym może być dowolna. Niech liczba ograniczeń jest równa m, wtedy musi zostać spełniony warunek: n w ij x i W j (2.6) i=1 dla każdego j takiego, że j {1,..., m} Podział ze względu na liczbę kontenerów Kolejnym rodzajem problemu plecakowego jest problem wieloplecakowy (z ang. Multiple Knapsack Problem). O takim problemie mówi się, gdy przedmioty mają zostać umieszczone w więcej niż jednym plecaku (kontenerze). Dodatkowo każdy plecak może mieć własną wartość ograniczenia (np. plecaki o różnej pojemności): n m p i x ij (2.7) i=1 j=1 przy założeniu: oraz: n w i x i W j dla każdegoj {1, 2,, m} i=1 n m x ij 1, i=1 j=1 x ij {0, 1}. 22

2.3 Przykład problemu plecakowego Załóżmy, że mamy do dyspozycji 4 przedmioty: A, B, C i D. Każdy z nich ma daną masę i cenę. Problem przedstawia tabela 2.1. Tabela 2.1: Przykładowy problem plecakowy A B C D masa (M) 5kg 10kg 15kg 20kg cena (W) 23zł 48zł 54zł 80zł cena/1kg 4,60zł 4,80zł 3,60zł 4zł Zadanie polega na tym, aby załadować do kontenera o dopuszczalnej masie 25 kg takie przedmioty, aby ich wartość była jak największa. W przypadku powyższego problemu przestrzeń rozwiązań jest stosunkowo mała. Na rysunku 2.2 przedstawione zostały wybrane rozwiązania. a) pusty kontener b) rozwiązanie nieoptymalne ( M = 20kg, W = 78zł ) c) rozwiązanie nieoptymalne ( M = 25kg, W = 102zł ) Rysunek 2.1: Ilustracja przykładowego problemu plecakowego 23

Rysunek 2.2: Wybrane rozwiązania przykładowego problemu d) rozwiązanie optymalne ( M = 25kg, W = 103zł ) Rozwiązania b i c nie są optymalne, ponieważ istnieje taka kombinacja przedmiotów, których sumaryczna waga nie przekracza ładowności plecaka, a których sumaryczna wartość jest większa. Taką kombinację przedstawia rozwiązanie d. 2.4 Techniki rozwiązywania problemów plecakowych W zależności od rodzaju problemu, możemy używać różnych sposobów jego rozwiązania. Większość stosowanych technik okazuje się skuteczna tylko do wybranego rodzaju problemu plecakowego. Na przykład do rozwiązywania problemu ciągłego stosuje się opisany dalej algorytm zachłanny, który nie sprawdza się w przypadku problemu dyskretnego. Programowanie dynamiczne Do rozwiązywania problemu plecakowego dyskretnego możemy wykorzystać programowanie dynamiczne. Polega ono na dzieleniu dużych problemów na mniejsze 24

podproblemy. Kluczem do zaprojektowania algorytmu techniką programowania dynamicznego jest znalezienie równania rekurencyjnego opisującego optymalną wartość funkcji celu dla danego problemu, jako funkcji optymalnych wartości funkcji celu dla podproblemów o mniejszych rozmiarach. Dzięki wykorzystaniu programowania dynamicznego, problem plecakowy jest rozwiązywalny w czasie pseudo-wielomianowym. Algorytm programowania dynamicznego dla 0-1 problemu plecakowego W przypadku klasycznego problemu plecakowego należy przyjąć następujące założenia: Niech w i {1,, n} to koszt i-tego przedmiotu, a p i {1,, n} to wartość i-tego przedmiotu. Maksymalizujemy sumaryczną wartość przedmiotów przy założeniu, że całkowity koszt jest mniejszy od c. Definiujemy rekurencyjną funkcję V (i, j) jako maksymalną sumaryczną wartość kombinacji przedmiotów od 1 i, dla której sumaryczny koszt jest mniejszy lub równy j. Funkcję V (i, j) możemy zdefiniować następująco: V (0, j) = 0 V (i, 0) = 0 V (i 1, j) V (i, j) = max{v (i 1, j), p i + V (i 1, j w i )} gdyw i > j gdyw i j Rozwiązaniem problemu jest wartość funkcji V (n, W ). Chcąc obliczyć wartość funkcji V (i, j), musimy znać obliczyć wartość funkcji V (i 1, j). Jeżeli j jest większe lub równe od kosztu i-tego elementu, to wartość funkcji V (i, j) obliczamy wybierając większą wartość spośród wartość funkcji V (i 1, j w i ) oraz V (i 1, j). W ten sposób z dużego problemu rekurencyjnie dochodzimy do małych podproblemów. Algorytm programowania dynamicznego dla nieograniczonego problemu plecakowego Programowanie dynamiczne można również zastosować do rozwiązywania problemu plecakowego nieograniczonego (czyli takiej modyfikacji problemu plecakowego, gdy w plecaku możemy umieścić ten sam przedmiot więcej niż 1 raz) [18]. 25

Algorytm 1: Algorytm zachłanny while (Plecak.PozostalaPojemnosc>0) (LiczbaDostepnychPrzedmiotow>0) do Przedmiot := { przedmiot o najwiekszym wspolczynniku wartość/objetość } if (Plecak.PozostalaPojemnosc > Przedmiot.Objetosc) then Plecak.DodajCalyPrzedmiot(przedmiot) else // dodajemy możliwie duży fragment przedmiotu: Plecak.DodajFragmentPrzedmiotu(przedmiot) end if end while Definiujemy funkcję V (i) jako maksymalną sumaryczną wartość przedmiotów, których całkowity koszt nie przekracza wartości i. Aby obliczyć wartość funkcji V (i), dla każdego j {1,, n} obliczamy wartość wyrażenia p j + V (i w j ) i wybieramy to, które ma największą wartość: V (i) = 0 V (i) = max{p i + V (i w j ) w j i} V (c). Rozwiązaniem nieograniczonego problemu plecakowego jest wartość funkcji Algorytm zachłanny Do rozwiązania problemów ciągłych można wykorzystać algorytm zachłanny (z ang. greedy algorithm). Jest to taki algorytm, w którym wybieramy przedmioty o największym współczynniku wartość/koszt. W celu lepszego zobrazowania algorytmu koszt jest przedstawiony jako objętość przedmiotu: Algorytm zachłanny nie przynosi oczekiwanych efektów w przypadku problemów dyskretnych. Rysunek 2.3 przedstawia rozwiązania przykładowego problemu plecakowego (2.1). I) rozwiązanie przy założeniach binarnego (0-1) problemu plecakowego ( M = 25kg, W = 71zł ) 26

Rysunek 2.3: Rozwiązania przykładowego problemu przy użyciu algorytmu zachłannego II) rozwiązanie przy założeniach nieograniczonego problemu plecakowego ( M = 25kg, W = 119zł) III) rozwiązanie przy założeniach ciągłego problemu plecakowego ( M = 25kg, W = 111zł ) Rozwiązanie optymalne algorytm zachłanny zwrócił przy założeniach problemu ciągłego. W powyższym przykładzie rozwiązanie optymalne zostało również znalezione przez algorytm zachłanny przy założeniach problemu dyskretnego nieograniczonego (jednak jest to szczególny przypadek). W przypadku problemu binarnego algorytm zachłanny zwrócił rozwiązanie nieoptymalne. System mrowiskowy Obiecujące rezultaty daje system mrowiskowy zaadoptowany do problemu plecakowego. Temat przystosowania ACO do rozwiązywania problemu plecakowego zostanie opisany szerzej w kolejnym rozdziale. 27

Rozdział 3 Reprezentacje mapy feromonowej w problemie plecakowym W poniższym rozdziale zostaną omówione różne podejścia do adaptacji systemu mrowiskowego do rozwiązywania problemu plecakowego. Główną różnicą jest model mapy feromonowej. Ślad feromonowy może być odkładany na krawędziach lub węzłach grafu problemu [1]. 3.1 Adaptacja systemu mrowiskowego do MKP Kluczowym punktem adaptacji systemu mrowiskowego do rozwiązywania problemu plecakowego jest wybór, które z elementów tworzonego rozwiązania mają być nagradzane. Związany jest z tym również sposób w jaki nagrody te będą wykorzystywane do tworzenia nowych rozwiązań. System mrowiskowy zaadoptowany do problemu plecakowego przedstawia algorytm 2. Rozwiązaniem MKP jest zbiór wybranych obiektów S = {0 1,, o k } (mówimy, że obiekt o i został wybrany, gdy zmienna decyzyjna x i jest równa 1. Można rozważyć następujące sposoby nakładania śladu feromonowego: Sposób I - feromon odkładany na obiektach [2]. Pierwszym sposobem jest nakładanie śladu feromonowego na każdym obiekcie w zbiorze S. W tym przypadku dążymy do zwiększenia atrakcyjności wybraneg obiektu, aby zwiększyć prawdo- 28

Algorytm 2: ACO zaadoptowany do MKP Inicjuj ślad feromonowy do wartości τ max. repeat for mrówka k 1..nb do Utwórz puste rozwiązanie S k. Wybierz losowo pierwszy obiekt o 1 1..n. S k := {o 1 } ObiektyKandydujace := {o i 1..n} while ObiektyKandydujace zawiera elementy do Wybierz obiekt o i z prawdopodobieństwem p Sk (o i ). S k := S k {oi }. Usuń z ObiektyKandydujace każdy obiekt, który nie spełnia ograniczeń. end while end for Aktualizuj ślad feromonowy. until warunek stopu nie spełniony podobnieństwo użycia tego obiektu przy tworzeniu nowego rozwiązania. Sposób II - feromon odkładany na parach wybranych obiektówx [1]. Ślad feromonowy można nakładać na każdej parze (o i, o i+1 ) wybranych obiektów ze zbioru S. Zabieg ten ma na celu zwiększenie atrakcyjności obiektu o i+1, jeżeli ostatnim wybranym obiektem był o i. 3.2 Ślad feromonowy odkładany w węzłach W problemie komiwojażera (TSP) mamy do czynienia ze zbiorem miast połączonych krawędziami. TSP można uznać za wzorcowy problem zdefiniowany za pomocą grafu (w którym węzłami są miasta, a krawędziami drogi łączące miasta). Rozwiazaniem problemu komiwojażera jest sekwencja: S =< o o, o 2,, o n > W przeciwieństwie do TSP, rozwiązaniem problemu plecakowego nie jest sekwencja, ale zbiór przedmiotów: S = {o 1, o 2,, o n } 29

Projektując model mapy feromonowej dla modelu plecakowego, można pominąć kolejność umieszczania przedmiotów w plecaku. Ze zbioru S zawierającego n przedmiotów wybieramy najlepszy podzbiór S zawierający s przedmiotów. Mając na uwadze powyższy fakt, można tak zmodyfikować system mrowiskowy, aby ślad feromonowy odkładany był na węzłach grafu. Taka reprezentacja mapy feromonowej, zwana dalej podejściem węzłowym, to pierwszy ze sposobów adaptacji systemu mrowiskowego do problemu plecakowego. Został on szerzej przedstawiony w publikacji [2]. Podejście węzłowe znacznie obniża koszt algorytmu. System nie musi pamiętać wartości śladu fermonowego na wszystkich krawędziach, których liczba w grafie pełnym wynosi n (n 1) 2, a jedynie na n węzłach. Aktualizacja śladu feromonowego Wartość feromonu odłożonego na węźle i w chwili t+1 w tym podejściu będzie obliczana według wzoru 3.1: τ i (t + 1) = (1 ρ) τ i (t, t + 1), (3.1) gdzie ρ oznacza współczynnik wyparowywania śladu feromonowego, a τ i to całkowity przyrost feromonu. Całkowity przyrost feromonu to suma wartości śladu feromonowego odłożonego przez wszystkie m mrówek w chwili t + 1. Jest obliczany według wzoru 3.2: m τ i (t, t + 1) = τi k (t, t + 1) (3.2) k=1 Kolejną różnicą pomiędzy problememami uporządkowania a problemem plecakowym jest wielkość rozwiązania. W problemie TSP wielkość rozwiązania jest z góry ustalona (komiwojażer musi przejść przez wszystkie miasta). W związku z tym z góra ustalona jest również ilość kroków algorytmu. Ilość feromonu, którym dysponuje mrówka dzielona jest przez ilość miast i odkładana proporcjonalnie na każdej krawędzi. W przypadku problemu plecakowego przestrzeń rozwiązań może składać się z elementów różnej wielkości. Innymi słowy ilość przedmiotów wchodzących w skład rozwiązania nie jest ustalona z góry. 30

W klasycznym systemie mrowiskowym wykonujemy aktualizację śladu feromonowego po przejściu N kroków przez każdą mrówkę. W problemie TSP ta liczba kroków była rowna ilości miast. W problemie plecakowym nie wiemy po ilu krokach mrówka zakończy cykl. Dlatego aby osiągnąć zgodność z systemem mrowiskowym, należy zdefiniować liczbę N max. Aktualizacja śladu feromonowego będzie odbywała się po każdych N max krokach algorytmu, a przyrost feromonu obliczany będzie według wzoru 3.3 Q L k gdy mrówka k włączy do rozwiązania obiekt i τ i (t, t + N max ) = 0 w przeciwnym przypadku (3.3) Wielkość feromonu, jakim dysponuje mrówka obliczamy według wzoru 3.4 Q = 1 ni=1 c i (3.4) Lokalne heurystyki Podejście to wymaga również modyfikacji sposobu obliczania prawdopodobieństwa przejścia do kolejnego węzła. W klasycznym systemie mrowiskowym mrówka w każdym kroku wybier jedną z krawędzi (i, j) z prawdopodobieństwem p ij. Prawdopodobieństwo wybrania krawędzi (i, j) zależy od wartości feromonu τ ij na tej krawędzi oraz lokalnej heurystki η ij. W omawianym podejściu adaptacji systemu mrowiskowego do problemu plecakowego feromon jest odkładany na węzłach grafu. Prawdopodobieństwo przejścia będzie więc zależeć od wartości śladu feromonowego odłożonego na węzłach oraz lokalnej heurystyki η i Lokalna heurystyka, podobnie jak w przypadku wartości feromonu, będzie obliczana nie dla krawędzi grafu, ale dla węzła. Nieistotne, jaki obiekt został ostatnio włączony do rozwiązania - lokalna heurystyka będzie obliczana jako stosunek wartości obiektu do średniego współczynnika wykorzystania zasobów. Wartośc lokalnej heurystyki obiektu i dla mrówki k jest obliczana według wzoru 3.5. η i (S k (t)) = c i δ i (k, t) (3.5) 31

gdzie: c i - wartość obiektu i. δ i (k, t) - średni współczynnik wykorzystania zasobów mrówki k przez obiekt i. 3.3 Ślad feromonowy odkładany na krawędziach Opisane poniżej podejście - zwane dalej podejściem krawędziowym lub reprezentacją krawędziową, bazuje na klasycznym algorytmie mrowiskowym. Podejście to zostało zaproponowane w 2004 roku przez Stefkę Fidanovą. Przedstawione zostało w publikacji [1]. Tak jak w przypadku podejścia węzłowego, obiektami włączanymi są do rozwiązania są węzły grafu. Podstawową różnicą między podejściem krawędziowym a węzłowym jest jednak to, że ślad feromonowy jest odkładany na krawędziach grafu. Mówimy w tym przypadku o mrówce krawędziowej. W każdym kroku mrówka k wybiera jedną z dozwolonych krawędzi. Prawdopodobieństwo przejścia z obiektu i do obiektu j zależy od dwóch wartości: atrakcyjności krawędzi eta ij oraz wartości śladu feromonowego τ ij. Jest obliczane według wzoru 3.6: p k ij(t) = τ ij η ij (S k (t)) q dozwolonek (t) τ iqη iq (S k (t)) gdyj dozwolone k (t) 0 w przeciwnym przypadku (3.6) Wartość η ij obliczana jest za pomocą jednej z zaproponowanych dalej heurystyk. Lokalne heurystyki Przy obliczaniu prawdopodobieństwa przejścia możemy korzystać z dwóch rodzajów heurystyk: statycznych i dynamicznych. Statyczne heurystyki nie zmieniają się w trakcie działania algortymu. Wartość heurystyki przy wyborze danej ścieżki będzie identyczna w każdym kroku algorytmu. 32

Dynamiczne heurystyki są zależne od aktualnego stanu algorytmu. W zależności jakie obiekty włączone są do rozwiązania częściowego, heurystyki mogą przyjmować różne wartości dla tego samego argumentu. W publikacji [1] zaproponowano kilka heurystyk dla problemu MKP. Aby wypromować obiekty o większej wartości i mniejszym koszcie, można użyć heurystyki 3.7: η ij = p d 1 j ( m i1 w ij ) d 2. (3.7) W heurystyce 3.7 możemy uwzględnić również budżet, jakim dysponujemy. Jako budżet należy rozumieć maksymalny dopuszczalny koszt wszystkich obiektów w rozwiązaniu. Taką modyfikację przedstawia wzór 3.8. W tym wypadku dla każego z zasobów liczony jest stosunek kosztu obiektu kandydującego do budżetu danego zasobu. η ij = p d 1 j ( m i1 w ij /c i ) d 2. (3.8) Wyżej opisane zostały heurystyki statyczne. Nie zależą od tego, jakie przedmioty zostały włączone wcześniej do rozwiązania. Podczas budowania rozwiązania częściowego można jednak uwzględnić pozostałą ilość zasobów, którymi dysponujemy. Jak wiadomo pozostałe zasoby zmieniają się w zależności od tego, jakie przedmioty zostały włączone do tej pory w rozwiązaniu częściowym. Takie podejście przedstawia heurystyka opisana wzorem 3.9: η ij = p d 1 j mi1 (w ij /(c i n j=1 w ij x j ). (3.9) Heurystyka 3.9 zależy od dotychczasowego przebiegu algorytmu, dlatego jest heurystyką dynamiczną. Aktualizacja śladu feromonowego W systemie mrowiskowym ślad feromonowy jest aktualizowany w dwóch etapach. Każda mrówka wykonuje aktualizację lokalną. Lokalna aktualizacja śladu feromonowego przebiega według reguły 3.10: 33

τ ij (t + 1) = (1 ρ)τ ij (t) + ρτ 0. (3.10) Po zakończeniu cyklu przez wszystkie mrówki odbywa się globalna aktualizacja śladu feromonowego. Na wszystkich krawędziach należących do najlepszego rozwiązania wartość feromonu jest modyfikowana według reguły 3.11. τ ij (t + 1) = (1 α)τ ij (t) + α τ. (3.11) gdzie: α (0, 1 > - współczynnik wyparowywania feromonu. τ - wielkość odkładanego feromonu. Wielkość odkładanego feromonu τ jest wprost proporcjonalna do wartości funkcji celu najlepszego rozwiązania. 34

Rozdział 4 Aplikacja do analizy reprezentacji feromonowych. W tym rozdziale zostanie opisana aplikacja dołączona do niniejeszej pracy. Aplikacja ta umożliwia analizę omówionych wcześniej podejść adaptacji systemu mrowiskowego do problemu plecakowego. Graficzny interfejs użytkownika został zaprojektowany tak, aby korzystanie z aplikacji było możliwie wygodne i intuicyjne. 4.1 Instrukcja obsługi programu Program składa się z dwóch części: pierwsza z nich umożliwia wczytanie pojedynczego problemu, sterowanie parametrami algorytmu i analizowanie działania algorytmu przy pomocy kilku rodzajów wizualizacji; druga część to kolejka zadań, dzięki której można zaplanować obliczenia do wykonania. Przeznaczeniem kolejki zadań jest analiza wyników działania algorytmu przy różnych parametrach wejściowych. 35

Zalecane parametry sprzętowe Program działa w środowisku Microsoft Windows XP. Dołączona aplikacja została utworzona w środowisku Microsoft Visual Studio.NET 2005. Do prawidłowego funkcjonowania aplikacji wymagana jest biblioteka.net Framework w wersji 2.0. Aplikacja działa na każdej platformie sprzętowej spełniającej wymagania systemu Windows XP. Do efektywnej pracy programu zalecane są następujące parametry sprzętowe: Procesor Pentium 1.6 GHz, 256MB pamięci operacyjnej, 20MB wolnego miejsca na dysku twardym Szczegółowa analiza przebiegu działania algorytmu Po uruchomieniu programu pojawia się główne okno aplikacji wraz z informacją o programie (rysunek 4.1). Rysunek 4.1: Okno O programie 36

Na pasku u góry okna znajdują się trzy ikony. Pierwsza od lewej otwiera okno O programie. Kolejna (symbol wózka) otwiera nowe okno problemu do analizy. Trzecia ikona (zegar) pozwala otworzyć plik kolejki zadań. Aby wczytać dowolny problem plecakowy, należy otworzyć nowe okno problemu (zielona ikona symbolizująca wózek). Pojawi się okno, w którym znajdują się trzy zakładki: Problem, Parametry, Sterowanie. Rysunek 4.2: Zakładka Problem Na pierwszej zakładce należy wczytać problem plecakowy. Po kliknięciu na przycisk Wczytaj z pliku pojawi się okno dialogowe umożliwiające wybór pliku do wczytania. Pliki z danymi wejściowymi problemu muszą mieć rozszerzenie.mkp. Format pliku z danymi został opisany dalej. Jeżeli program napotka na problem podczas wczytywania pliku (np. brak dostępu do pliku, nieprawidłowy format pliku), to pojawi się odpowiedni komunikat. Jeżeli problem zostanie wczytany prawidłowo, to dane wejściowe zostaną wyświetlone w tabeli (rysunek 4.2). W pierwszym wierszu (Plecak 1 ) znajdujsą dane plecaka. Kolejne wiersze opisują przedmioty (Element 1.. n), które są do dyspozycji. 37

W kolumnach tabeli podana jest wartość przedmiotu i ograniczenia. Po wczytaniu problemu można przejść do wyboru reprezentacji mapy feromonowej (przycisk Następny krok). Zostanie otwarta druga zakładka, przedstawiona na rysunku 4.3. Rysunek 4.3: Zakładka Parametry - wybór reprezentacji feromonu Można wybrać jedną z dwóch reprezentacji feromonu opisanych w pracy: węzłową lub krawędziową. Po wybraniu reprezentacji feromonu należy kliknąć przycisk Dalej, aby przejść do ustawiania parametrów algorytmu (rysunek 4.4). Algorytm można skonfigurować ustawiając następujące wartości parametrów: Liczba mrówek - liczba całkowita, większa od 0 Wartość początkowa feromonu (τ 0 ) - liczba rzeczywista większa od 0 Waga heurystyki lokalnej (β)- liczba rzeczywista, większa lub równa 0 Współczynnik wyparowywania (ρ)- liczba rzeczywista z przedziału [0, 1] Wielkość poświaty feromonowej (α)- liczba rzeczywista z przedziału [0, 1] Prawdopodobieństwo eksploracji (q 0 ) - liczba rzeczywista z przedziału [0, 1] 38

Rysunek 4.4: Zakładka Parametry - ustawienia parametrów dla wybranej reprezentacji Gdy parametry algorytmu zostaną ustawione, należy kliknąć przycisk Dalej. Zostanie otwarta kolejna zakładka - Sterowanie (rysunek 4.5). Zakładka Sterowanie podzielona jest na kilka obszarów: Nawigacja - w tym miejscu można ustawić warunek stopu algorytmu: ograniczyć liczbę cykli algorytmu lub podać wartość funkcji celu, po osiągnięciu której działanie algorytmu zostanie zakończone. Prędkość - Za pomocą suwaka można ustawić opóźnienie pomiędzy cyklami. Gdy suwak znajduje się po lewej stronie, po każdym cyklu działanie algorytmu jest wstrzymywane na 1 sekundę. W przypadku, gdy suwak znajduje się po prawej stronie, opóźnienie jest zerowe. Zmiana położenia suwaka pozwala zatem sterować prędkością działania algorytmu. Jest to pomocne przy analizowaniu omówionych dalej wizualizacji. Wyniki - ten obszar poświęcony jest statusowi działania algorytmu. W tym miejscu wyświetlany jest czasie działania algorytmu, liczba wykonanych iteracji oraz wartość najlepszego znalezionego rozwiązania. Poniżej tych informacji znajdują 39

Rysunek 4.5: Zakładka Sterowanie - widok w trakcie działania algorytmu się cztery przyciski służące do otwierania okien wizualizacji: Wydajność, Szczegóły rozwiązania, Rozkład feromonu, Rozkład prawdopodobieństwa. w dolnej części okna znajduje się pasek postępu oraz dwa przyciski do sterowania algorytmem (Uruchom i Reset). Wizualizacje Użytkownik ma do dyspozycji kilka rodzajów wizualizacji: Szczegóły rozwiązania - okno zawierające informacje o aktualnym najlepszym znalezionym rozwiązaniu. Na zakładce Podsumowanie znajduje się wartość rozwiązania i lista przedmiotów, które znajdują się w plecakach. Na zakładce Plecak 1 znajduje się wizualizacja plecaka, która przedstawia procentowe zapełnienie plecaka przez poszczególne przedmioty we wszystkich wymiarach (rysunek 4.6). Wydajność - wykres, na którym przedstawione są wartości najlepsze i najgorsze rozwiązania znalezione w poszczególnych cyklach (rysunek 4.7). 40

Rysunek 4.6: Wizualizacja rozwiązania Rysunek 4.7: Wykres wydajności algorytmu Rozkład feromonu - wizualizacja aktualizowana w czasie rzeczywistym podczas działania algorytmu. Przedstawia rozkład feromonu na krawędziach lub węzłach w zależności od wybranego algorytmu. Wizualizacja mapy reprezentacji węzłowej przedstawia rysunek 4.8, natomiast rysunek 4.9 przedstawia wizualizację mapy feromonu reprezentacji krawędziowej. Ilość feromonu oznaczona jest kolorem. Kolor czarny oznacza wartość inicjalną feromonu. W przypadku reprezentacji węzłowej wizualizacja ma postać wykresu słupkowego, w którym każdy węzeł odpowiada 41

jednemu słupkowi. Reprezentacja krawędziowa została zwizualizowana przez siatkę punktów. Kolory punktów zmieniają się stopniowo od czarnego przez żółty do czerwonego. Kolor czerwony oznacza największą ilość feromonu. Rysunek 4.8: Wizualizacja mapy feromonowej w reprezentacji węzłowej Rozkład prawdopodobieństwa - wizualizacja bardzo zbliżona do Rozkładu feromonu. Różnica polega na tym, że przy wizualizacji jest brana pod uwagę jest nie tylko ilość feromonu, ale również heurystyka lokalna. Kolejka zadań Kolejka zadań to funkcjonalność programu pozwalająca na zaplanowanie wielu uruchomień algorytmu z różnymi parametrami. Po kliknięciu na pomarańczową ikonę symbolizującą zegar pojawia się okno dialogowe wyboru pliku. Jeżeli wybrany plik 42

Rysunek 4.9: Wizualizacja mapy feromonowej w reprezentacji kolejki ma prawidłowy format, to zostaje otwarte okno Kolejka zadań przedstawione na rysunku 4.10. Kolejka ta wczytywana jest z pliku zapisanego w formacie.csv. Jest to plik tekstowy, w którym każdy wiersz odpowiada jednemu zadaniu. Parametry zadania są oddzielone średnikami. Każdy wiersz pliku zawiera następujące informacje: nazwa pliku problemu, np. sento.mkp rodzaj algorytmu (K - reprezentacja krawędziowa, W - reprezentacja węzłowa) liczba uruchomień algorytmu liczba cykli w każdym uruchomieniu algorytmu parametry algorytmu oddzielone spacjami (np. m=5 beta=1,5) Przykładowy plik kolejki wygląda następująco: 43

Rysunek 4.10: Kolejka zadań podczas działania test2.mkp;k;100;80;m=5 beta=0,4 alpha=8 rho=0,001 tau0=0,0001 test2.mkp;w;100;40;m=10 beta=0,4 alpha=8 rho=0,001 tau0=0,0001 test2.mkp;k;100;20;m=20 beta=0,4 alpha=8 rho=0,001 tau0=0,0001 test2.mkp;k;100;10;m=40 beta=0,4 alpha=8 rho=0,001 tau0=0,0001 test2.mkp;k;100;50;m=10 beta=0,4 alpha=8 rho=0,001 tau0=0,0001 test2.mkp;k;100;50;m=10 beta=0,4 alpha=4 rho=0,001 tau0=0,0001 test2.mkp;k;100;50;m=10 beta=0,4 alpha=2 rho=0,001 tau0=0,0001 test2.mkp;k;100;50;m=10 beta=0,4 alpha=1 rho=0,001 tau0=0,0001 Pierwszy wiersz informuje o tym, ze: test2.mkp - problem ma zostać wczytany z pliku test2.mkp K - do rozwiązania problemu zostanie użyty algorytm mrówki krawędziowej 100 - algorytm zostanie uruchomiony 100 razy 80 - każde uruchomienie będzie się składało z 80 cykli 44

m=5 beta=0,4 alpha=8 rho=0,001 tau0=0,0001 - parametry algorytmu: 5 mrówek, β = 0, 4, α = 8, ρ = 0, 001, τ 0 = 0, 0001 Kolejkę można zatrzymać lub uruchomić za pomocą przycisku Start/stop. Zadania wykonywane są w kolejności, w jakiej zostały zapisane w pliku. Gdy zadanie jest wykonywane, wiersz w tabeli zmienia kolor na żółty. Po wykonaniu zadania wiersz zmienia kolor na zielony (gdy w conajmniej jednym uruchomieniu znaleziono optymalne rozwiązanie) lub czerwony (gdy nie znaleziono optymalnego rozwiązania w żadnym z uruchomień). W tabeli znajdują się dodatkowo kolumny informujące o najlepszym znalezionym rozwiązaniu, ilości trafionych rozwiązań we wszystkich uruchomieniach oraz średni numer cyklu, w którym zostało znalezione najlepsze rozwiązanie. Wyniki zadania uruchamianych w kolejce są zapisywane do plików z rozszerzeniem.out. Na przykład wyniki kolejki test.csv są zapisywane do pliku test.csv.out. W pliku tym zapisywane są następujące informacje: dane wejściowe wykonywanego zadania, wartość najlepszego znalezionego rozwiązania, liczba uruchomień, w których znaleziono optymalne rozwiązanie, liczba cykli, w których trafiono na optymalne rozwiązanie, numer cyklu pierwszego trafienia (wartość średnia z wszystkich uruchomień), wartość najlepszego rozwiązania w poszczególnych cyklach (wartości średnie z wszystkich uruchomień), średnia wartość rozwiązania w poszczególnych cyklach (wartości średnie z wszystkich uruchomień), suma trafień optymalnego rozwiązania w poszczególnych cyklach z wszystkich uruchomień. 45

Format danych wejściowych i wyjściowych Problem plecakowy do analizy można wczytać z pliku. Pliki zawierające dane wejściowe problemu plecakowego są plikami tekstowymi z rozszerzeniem.mkp. Wartości w pliku są oddzielone spacjami. Przykładowo plik weing1.mkp ma następującą treść: 2 28 1898 440 22507 270 14148 3100 4650 30800 615 4975 1160 4225 510 11880 479 440 490 330 110 560 24355 2885 11748 4550 750 3720 1950 10500 600 600 45 0 85 150 65 95 30 0 170 0 40 25 20 0 0 25 0 0 25 0 165 0 85 0 0 0 0 100 30 20 125 5 80 25 35 73 12 15 15 40 5 10 10 12 10 9 0 20 60 40 50 36 49 40 19 150 141278 Struktura plików mkp jest ustalona w następujący sposób: Pierwsza linia pliku zawiera liczbę ograniczeń oraz liczbę przedmiotów oraz. Problemie weing1 składa się z 28 przedmiotów. Objętość plecaka ma 2 ograniczenia. Kolejne 28 liczb to wartości poszczególnych przedmiotów (1898, 440,..., 10500). Następne 2 liczby to wartości ograniczeń plecaka (600, 600). W następnej kolejności podane są wartości ograniczeń (56 liczb) dla wszystkich przedmiotów. Ostatnia liczba to wartość optymalnego rozwiązania problemu. 4.2 Dokumentacja techniczna Do wykonania projektu użyta została platforma Microsoft Visual C# Express 2005. Kod programu został napisany w języku C#. Więcej informacji dotyczących tego 46

języka programowania można znaleźć w publikacjach [10], [11], [12]. Projekt aplikacji można podzielić na dwie warstwy: logiki i prezentacji. Warstwa prezentacji zawiera formatki oraz komponenty stanowiące graficzny interfejs aplikacji. Warstwa logiki dzieli się na następujące pakiety klas: model algorytmu mrowiskowego (AcoAlgorithm), model wielokrotnego problemu plecakowego (MkpModel), sterownik (Controller) Model algorytmu mrowiskowego W niniejszej pracy omawiane są dwie różne reprezentacje feromonu: węzłowa i krawędziowa. Algorytmy odpowiadające tym reprezentacjom umożliwiają rozwiązywanie problemu plecakowego o dowolnej liczbie wymiarów przedmiotu oraz dowolnej liczbie plecaków. W strukturze projektu tym algorytmom odpowiadają im klasy: NodeAntAlgorithm oraz EdgeAntAgorithm. Klasy te dziedziczą po abstrakcyjnej klasie AcoAlgorithm zawierającą wspólne elementy tych dwóch algorytmów. Klasa ta stanowi zarazem interfejs dla klas pakietu sterownika. Klasa AcoAlgorithm Klasa stanowi trzon algorytmu mrowiskowego (diagram 4.11 - więcej informacji na temat diagramów klas i języka UML można znaleźć w publikacji [17]). Do niej przekazywane są informacje o problemie do rozwiązania oraz parametry algorytmu. W klasie zdefiniowane są dwie kluczowe metody abstrakcyjne: Initalize i ExecuteCycle. Implementacje tych metod zostały zawarte w klasach potomnych (NodeAntAlgorith oraz EdgeAntAlgorithm) Metoda Initialize() jest uruchamiana po wczytaniu problemu oraz parametrów. Pozwala przygotować algorytm do działania. Podczas jej wywołania defi- 47

Rysunek 4.11: Diagram klas pakietu AcoAlgorithm niowane są elementy grafu problemu, zbiór mrówek oraz innych obiektów niezbędnych w trakcie działania algorytmu. Metoda ExecuteCycle() odpowiada za wykonanie pojedynczego cyklu algorytmu. Wyniki cyklu zwracane są w obiekcie klasy CycleResult. Wyniki te zawierają informacje o najlepszym i najgorszym rozwiązaniu znaleziony w wykonanym cyklu. W CycleResult przekazywana jest również informacja o średniej z wartości rozwiązań znalezionych w danym cyklu. Klasa NodeAntAlgorithm Szczegółowe informacje o sposobie działania algorytmu węzłowego zostały umieszczone w klasie NodeAntAlgorithm oraz związanymi z nim klasami: KnapsackItemNode oraz NodeAnt. Klasa KnapsackItemNode opisuje pojedynczy węzeł grafu problemu. Ślad feromonowy odkładany jest na węzłach, więc obiekty klasy KnapsackItemNode zawierają informację o ilości feromonu znajdującego się w węźle. Ponadto każdy węzeł odpwiada konkretnemu przedmiotowi umieszczanemu w plecaku w relacji 1-1 zawiera referencję do plecaka (obiekt Knapsack) oraz przedmiotu (KnapsackItem) Klasa NodeAnt reprezentuje agenta w reprezentacji węzłowej. Agent ten za- 48

wiera następujące informacje: lista odwiedzonych węzłów (visitednodes), lista dostępnych węzłów (availablenodes), referencja do węzła, w którym aktualnie się znajduje (currentnode), obiekt rozwiązania (Solution). Podczas działania algorytmu agent decyduje o tym, który węzeł jako kolejny ma zostać włączony do rozwiązania. Podjęcie takiej decyzji odbywa się w trakcie wywołania metody selectnextnode(). Wybór węzła odbywa się zgodnie z założeniami algorytmu: I) Obliczana jest atrakcyjność poszczególnych węzłów. II) Podejmowana jest decyzja o eksploatacji lub eksploracji. III) W drodze eksploatacji wybierany jest węzeł najbardziej atrakcyjny lub w przypadku eksploracji - kolejny węzeł jest losowany (prawdopodobieństwo wybrania węzła jest wprost proporcjonalne do jego atrakcyjności). IV) Agent (mrówka) ustawiana jest w wybranym węźle (KnapsackItemNode) za pomocą metody setlocation() po czym następuje lokalna aktualizacja śladu feromonowego. Lista dostępnych węzłów generowana jest na podstawie informacji o pozostałej ilości miejsca w plecaku oraz ograniczeniach. Dla każdego węzła sprawdzane jest, czy odpowiadający mu przedmiot zmieści się w plecaku (za pomocą metody Knapsack.IsEnoughPlaceFor()). Gdy lista dostępnych węzłów jest pusta, agent kończy cykl i analizowana jest wartość rozwiązania. Gdy wszyscy agenci zakończą cykl informacje o znalezionych rozwiązaniach przekazywane są w obiekcie CycleResult. Na początku kolejnego cyklu lista odwiedzonych węzłów każdej mrówki jest czyszczona. Informacją pozostałą po wcześniej odbytych cyklach jest ślad feromonowy odłożony na poszczególnych węzłach grafu (KnapsackItemNode). 49

Klasa EdgeAntAlgorithm Reprezentacja krawędziowa została zrealizowana przez klasę EdgeAntAlgorithm oraz związane z nią klasy: EdgeAnt, EdgeAntNode oraz Edge. Obiekty klas EdgeAntNode oraz Edge reprezentują odpowiednio węzły grafu oraz krawędzie pomiędzy nimi. W reprezentacji krawędziowej feromon odkładany jest na krawędziach grafu. W związku z tym informacja o ilości feromonu przechowywana jest w obiektach klasy Edge. Każda krawędź (Edge) zawiera również referencje do węzła (EdgeAntNode) źródłowego i docelowego. Węzły natomiast zawierają listę referencji do wychodzących z nich krawędzi (jest to pewien nadmiar informacji, jednak znacznie przyspiesza odwoływanie się do poszczególnych struktur danych). Obiekty węzłów w algorytmie krawędziowym (EdgeAntNode), tak jak w przypadku algorytmu węzłowego, zawierają informację o plecakach i przedmiotach. Różnią się tym od KnapsackItemNode, że zawierają informacji o feromonie (jak wspomniano wcześniej informacja ta przechowywana jest na krawędziach grafu. Agenta w algorytmie krawędziowym reprezentuje klasa EdgeAnt. W tym przypadku agent zawiera informację o odwiedzonych krawędziach oraz o węźle, w którym aktualnie się znajduje. Działanie EdgeAnt jest zbliżone do NodeAnt. Różni się ono tym, że feromon jest odkładany na krawędziach grafu. Podczas wykonywania cyklu w metodzie selectnextedge wybierana jest najbardziej atrakcyjna krawędź. Przy obliczaniu atrakcyjności krawędzi uwzględniany jest feromon odłożony na krawędzi oraz przedmiot znajdujący się w węźle do którego ta krawędź prowadzi. Model wielokrotnego problemu plecakowego Klasa MultipleKnapsackProblem opisuje problem plecakowy. Obiekt klasy MultipleKnapsackProblem zawiera następujące informacje: umowną nazwę problemu plecakowego, listę plecaków (Knapsack), które należy zapełnić, listę dostępnych przedmiotów (KnapsackItem), 50

Rysunek 4.12: Model wielokrotnego problemu plecakowego - diagram klas wartość rozwiązania optymalnego (jeżeli taka wartość jest znana) Klasa MultipleKnapsackProblem udostępnia również metodę MultipleKnapsackProblem.F która pozwala wczytać problem plecakowy z pliku. Format pliku wejściowego został w instrukcji obsługi użytkownika. Obiekt Knapsack reprezentuje pojedynczy plecak, w którym można umieszczać przedmioty. W obiekcie plecaka przechowywane są: lista przedmiotów, wartość pozostałej przestrzeni w plecaku (typu Size), sumaryczna wartośći przedmiotów w plecaku (typu Value). Każdy przedmiot charakteryzuje się dwoma parametrami: wartością przedmiotu (Value) oraz jego wielkością (Size). Wielkość przedmiotu może mieć dowolną liczbę wymiarów - liczba wymiarów to inaczej liczba ograniczeń w problemie plecakowym. Obiekt klasy Solution reprezentuje rozwiązanie problemu plecakowego. Zawiera listę przedmiotów wchodzących w skład rozwiązania oraz wartość rozwiązania. Sterownik Sterownik odpowiedzialny jest za sterowanie przebiegiem algorytmu. Komunikacja pomiędzy sterownikiem a graficznym interfejsem użytkownika oparta jest na 51

Rysunek 4.13: Diagram przejść stanów sterownika modelu zdarzeń. Klasa MkpSolver odpowiada za uruchamianie kolejnych cykli algorytmu, do póki warunek stopu nie zostanie spełniony. Umożliwia uruchomienie algorytmu w tle. MkpSolver stanowi pomost pomiędzy interfejsem użytkownika a modelem algorytmu. Klasa ta kontroluje stan algorytmu. Przykładowo, gdy użytkownik próbuje zmienić parametry w trakcie działania algorytmu, MkpSolver blokuje możliwość zmiany parametrów (wyrzucany jest wyjątek AcoException). Diagram 4.13 przedstawia możliwe przejścia pomiędzy stanami algorytmu. Po utworzeniu obiektu MkpSolver ma on stan New. Następnie wybierany jest problem plecakowy, po czym następuje zmiana stanu na ProblemSet. W następnej kolejności wybieramy rodzaj mapy feromonowej i sterownik przechodzi do stanu AlgorithmSet. Po ustawieniu parametrów algorytmu MkpSolver stan przyjmuje wartość ParametersSet. W tym momencie uruchamiana jest metoda Initialize(), a sterownik przechodzi do stanu Ready. Po uruchomieniu algorytmu sterownik przechodzi do stanu Running, a po zatrzymaniu powraca do stanu Ready. Po wykonaniu pojedynczego cyklu wywoływane jest zdarzenie ExecuteCycleEvent. 52

Rysunek 4.14: Diagram klas interfejsu użytkownika Jako parametry zdarzenia przekazywane są wyniki zakończonego cyklu (obiekt CycleResult). Obiekt ten jest wykorzystywany przez interfejs do wizualizacji wyników. Klasa TaskQueue reprezentuję kolejkę zadań. Dzięki niej można wykonać serie obliczeń za pomocą algorytmu. Do kolejki możemy dodawać zadania (obiekty klasy Task). Zadanie (Task) zawiera informację o problemie, rodzaj algorytmu (mrówka węzłowa lub krawędziowa) oraz informację o liczbie uruchomień algorytmu, liczbę cykli w jednym uruchomieniu oraz parametry algorytmu. Każde zadanie można uruchomić dzięki metodzie Execute(). Zadanie jest zakończone po zakończeniu ostatniego cyklu ostatniego uruchomienia algorytmu. Graficzny interfejs użytkownika Graficzny interfejs użytkownika został zbudowany przy użyciu pakietu Windows.Forms wchodzącego w skład biblioteki.net Framework. Do stworzenia interfejsu graficznego wykorzystano technologię MDI, która pozwala na stworzenie okna stanowiącego kontener dla innych okien uruchamianych w programie. Rolę głównego okna (MdiParent) pełni klasa MainWindow. Oknami należącymi do MainWindow są: MkpControlForm - okno sterowania przebiegiem i wizualizacją algorytmu, 53

TaskQueueForm - okno zarządzania kolejką zadań, SolutionForm - wizualizacja rozwiązania (używa komponentu KnapsackVisualisation do wizualizacji zawartości plecaka) PerformanceChart - wizualizacja wartości rozwiązań w poszczególnych cyklach algorytmu, PheromoneMap - wizualizacja mapy feromonowej 54

Rozdział 5 Badania i eksperymenty W rozdziale tym zostaną opisane doświadczenia mające na celu porównanie dwóch podejść adaptacji systemu mrowiskowego do problemu plecakowego. Zbadany z zostanie wpływ poszczególnych parametrów na wyniki działania algorytmów. W badaniach wykorzystano kilka znanych problemów plecakowych. Dla wszystkich testowanych problemów znana jest wartość optymalna rozwiązania. Dane wejściowe tych problemów znajdują się w plikach: hp1.mkp, hp2.mkp pb1.mkp - pb7.mkp sento1.mkp, sento2.mkp weing1.mkp - weing6.mkp weish01.mkp - weish30.mkp Pliki te znajdują się na płycie CD dołączonej do niniejszej pracy. 5.1 Badanie parametrów dla krawędziowej reprezentacji feromonu Algorytm mrówki krawędziowej można regulować za pomocą następujących parametrów: 55

liczba mrówek (m) wartość początkowa feromonu (τ 0 ) waga heurystyki (β) współczynnik poświaty feromonowej(α) współczynnik wyparowywania (ρ) prawdopodobieństwo eksploracji (q 0 ) Parametry dla każdego problemu są dobierane empirycznie. Ustalenie uniwersalnych parametrów dla wszystkich problemów jest niemożliwe. Powodem jest choćby fakt, że część problemów można rozwiązać za pomocą algorytmu używającego bardziej zachłannej strategii. W przypadku innych problemów takie strategie się nie sprawdzają. Zostało to zobrazowane na rysunku 5.1. Rysunek 5.1: Wykresy przykładowych funkcji o wielu optimach lokalnych. Porównując wykresy można stwierdzić, że funkcja f(x) zawiera mniej optimów lokalnych. Funkcja g(x) zawiera więcej optimów lokalnych, co nie sprawdziłoby się w przypadku algorytmu zachłannego (algorytm utknąłby w miejscu jednego z optimów lokalnych). W przypadku systemu mrowiskowego mamy do czynienia z tzw stagnacją. Zjawisko to pojawia się, gdy zbyt duża ilość feromonu zostanie odłożona na krawędziach grafu należących do rozwiązania znajdującego się w lokalnym optimum, a odparowywanie feromonu następuje zbyt wolno. Gdy trasa na której odkładany jest feromon staje się wielokrotnie bardziej atrakcyjna od innych tras, prawie wszystkie 56

mrówki zaczynają jej używać i szansa znalezienia rozwiązania leżącego w globalnym optimum jest znikoma. Należałoby użyć takich wartości parametrów, aby po znalezieniu jednego z optimów lokalnych algorytm był w stanie kontynuować poszukiwanie w pozostałych optimach lokalnych. Można zwiększyć współczynnik wyparowywania ρ lub zmniejszyć wartość feromonu odkładaną na krawędzi (współczynnik α) podczas globalnej aktualizacji śladu feromonowego. Można też zmodyfikować wagę heurystyki lokalnej w przypadku gdy jest ona zbyt duża, faworyzowane są przedmioty, które mają większy iloraz wartości przedmiotu przez jego wielkość. Przy modyfikowaniu parametrów należy jednak mieć na uwadze, że zbyt duża zmiana wartości parametru spowoduje, że stagnacja nie wystąpi, ale zastosowanie algorytmu nie da dobrych rezultatów. Przykładowo, gdy współczynnik wyparowywania feromonu ρ będzie zbyt duży, feromon będzie wyparowywał na tyle szybko, że mrówki nie będą poruszały się po trasach wyznaczających dobre rozwiązania. Jak widać problem doboru parametrów jest skomplikowany. Zmiana wartości jednego z parametrów może wpłynąć na to, że należałoby zmodyfikować również inny parametr. Poniższy rozdział został poświęcony eksperymentom mającym na celu dobór odpowiednich wartości parametrów. Nie jest możliwe znalezienie takich wartości parametrów, które byłyby złotym środkiem dla wszystkich problemów plecakowych. Jednak zostanie podjęta próba ustalenia zakresów wartości parametrów, dla których przy większości problemów zastosowanie algorytmu mrowiskowego daje dobre rezultaty. Współczynnik poświaty feromonowej Współczynnik poświaty feromonowej α pozwala regulować wartość feromonu odkładanego na krawędziach grafu podczas globalnej aktualizacji. Wartość tego współczynnika wpływa wprost proporcjonalnie na wielkość odkładanego feromonu. Badania współczynnika α zostały przeprowadzone dla problemów sento1 oraz weish01. Testowano następujące wartości parametru: 1, 2, 5, 10, 20, 50, 100, 200. Wartości pozostałych parametrów zostały dobrane empirycznie, drogą prób i błędów. Dla 57

każdej wartości parametru α wykonano 20 uruchomień algorytmu po 100 iteracji. Wartości pozostaych parametrów to: m = 20 β = 0, 4 τ 0 = 0, 00001 ρ = 0, 00001 q 0 = 0, 5 Na rysunku 5.2 znajdują się wykresy przedstawiające: całkowitą liczbę iteracji we wszystkich próbach, w których trafiono na optymalne rozwiązanie (wykresy a), c)) skuteczność algorytmu liczba prób, w których znaleziono optymalne rozwiązanie (wykresy b), d)) Wykresy a) i b) przedstawiają wyniki dla problemu sento1.mkp, a wykresy c) i d) dla weish01.mkp. Z wykresów można odczytać, że największą skuteczność algorytm osiągał w przypadku mniejszych wartości α: 1, 2 lub 4. Dla α = 1 i problemu sento1.mkp algorytm znalazł rozwiązanie optymalne w 14 z 20 prób (70%), a w przypadku α = 50 skuteczność zmniejszyła się o połowę (30%). Również w przypadku problemu weish01.mkp algorytm był najbardziej skuteczny, gdy α = 1. W tym przypadku 19 z 20 prób zakończyło się znalezieniem optymalnego rozwiązania. Przy zwiększaniu wartości α skuteczność ta zmniejszała się. Gdy α = 50, tylko w 14 z 20 prób znaleziono optimum. Nieco inaczej sytuacja wygląda po przeanalizowaniu wykresów a) i c). Wykresy te przedstawiają liczbę iteracji, w których znaleziono optymalne rozwiązanie. Liczba ta była stosunkowo niewielka dla α = 1. Fakt ten świadczy o tym, że gdy współczynnik α ma małą wartość, to algorytm unika stagnacji. Gdy współczynnik α jest duży, wtedy algorytm w wielu iteracjach generuje rozwiązanie optymalne, ale też nie potrafi wyjść z optimum lokalnego. 58

Rysunek 5.2: Całkowita liczba optymalnych rozwiązań w iteracjach (a, c) i skuteczność algorytmu (b,c). Współczynnik wyparowywania feromonu Gdy ilość feromonu odkładana na niektórych krawędziach narasta lawinowo w porównaniu do innych krawędzi, może to spowodować stagnację i niemożność algorytmu do wyjścia z optimum lokalnego. Z drugiej strony, gdy feromon odparowuje zbyt szybko, maleje skuteczność algorytmu. Parametrem umożliwiającym sterowanie szybkością wyparowywania feromonu jest współczynnik ρ. W tym doświadczeniu zostanie zbadany wpływ tego współczynnika na skuteczność algorytmu. Problemy, na których przeprowadzono doświadczenia to: sento1.mkp pb1.mkp Dla każdego zestawu wartości parametrów przeprowadzono 20 prób uruchomienia algorytmu. Badane wartości parametru ρ to: 0, 3 ; 0, 2 ; 0, 1 ; 0, 01 ; 0, 001 ; 59

0, 0001 ; 0, 00001. Wartości pozostaych parametrów są następujące: m = 20 β = 0, 4 τ 0 = 0, 00001 α = 2 q 0 = 0, 5 Rysunek 5.3 przedstawia wpływ parametru ρ na skuteczność algorytmu. Pionowa oś przedstawia procentową skuteczność algorytmu (stosunek znalezionych rozwiązań optymalnych do liczby prób). Kolorem jasnym przedstawione są wyniki dla problemu sento1, a kolorem ciemnym dla problemu pb1. Rysunek 5.3: Wpływ parametru ρ na skuteczność algorytmu. Można zauważyć, że algorytm inaczej reaguje na zmianę parametru ρ dla problemu sento1, a inaczej dla problemu pb1. W przypadku sento1 skuteczność algorytmu wzrasta wraz ze zmniejszaniem parametru ρ. Dobre rezultaty (pomiędzy 60 70%) 60

Rysunek 5.4: Średnie wartości rozwiązań w poszczególnych cyklach (sento1). algorytm osiąga zarówno przy wartościach 0, 0001 jak i 0, 00001. Natomiast przy większych wartościach parametru ρ skuteczność spada kilkakrotnie od 30% dla wartości 0, 01 do 10% przy wartości 0, 3. Inaczej wygląda sytuacja w przypadku problemu pb1. Tutaj algorytm osiąga największą skuteczność na poziomie 65% przy parametrze ρ = 0, 01. W miarę zwiększania lub zmniejszania parametru skuteczność maleje do ok 20% dla wartości parametru ρ równej 0, 3 lub 0, 00001. Analizując wpływ parametru ρ warto zwrócić również uwagę na jego wpływ na średnią wartość rozwiązania w poszczególnych iteracjach. Można to zaobserwować na rysunkach 5.4 oraz 5.5. Wykresy te przedstawiają zależność średniej wartości rozwiązania w poszczególnych iteracjach od parametru ρ. W przeciwieństwie do skuteczności algorytmu, w obu przypadkach średnia wartość rozwiązania rośnie szybciej dla mniejszych wartości parametru ρ. W przypadku problemu pb1 dla parametru ρ = 0, 0001 średnia wartość rozwiązania w ostatnich iteracjach kształtowała się na poziomie 2900-2910. Jednak już dla ρ = 0, 01 średnia wartość rozwiązania w ostatnich cyklach oscylowała w granicach 2870. Trzeba zauważyć, że właśnie dla tej wartości parametru ρ algorytm miał naj- 61

Rysunek 5.5: Średnie wartości rozwiązań w poszczególnych cyklach (pb1). większą skuteczność. Nasuwa się wniosek, że średnia wartość rozwiązania oraz skuteczność nie zawsze idą w parze podczas zmiany wartości parametrów algorytmu. Mimo, że średnia wartość rozwiązania jest większa dla wartości ρ = 0, 0001, to liczba trafionych rozwiązań optymalnych jest mniejsza. Powodem może być fakt, że algorytm oscyluje w optimach lokalnych przy dużych wartościach rozwiązań, lecz nie znajduje optimum globalnego. W przypadku problemu sento1 w wyniku zmniejszania wartości parametru ρ średnia wartość rozwiązania w ostatnich iteracjach rośnie. Dla ρ = 0, 2 wartość ta oscyluje w granicach 6550. Po zmniejszeniu wartości, dla ρ = 0, 0001 wartość ta wzrasta do blisko 7000, czyli jest większa o ok 7%. Podsumowując nie można ustalić uniwersalnej wartości parametru ρ dla wszystkich problemów. Dla obu problemów algorytm przynosił satysfakcjonujące rezultaty, gdy wartość parametru ρ mieściła się w zakresie od 0, 001 do 0, 01. Nie są to jednak wartości, które gwarantują dobre rezultaty w przypadku innych problemów. Można je traktować co najwyżej jako punkt wyjścia do do dalszej analizy. 62

Rysunek 5.6: Liczba mrówek a skuteczność algorytmu. Liczba mrówek Zmieniając liczbę mrówek szukających rozwiązań, trzeba mieć na uwadze fakt, że zmiana pociąga za sobą zmianę ilości obliczeń wykonywanych podczas działania algorytmu. Przykładowo: czas w jakim zostanie wykonane 100 iteracji algorytmu po 20 mrówek jest zbliżony do czasu wykonania 20 iteracji algorytmu, gdy liczba mrówek wynosi 100. W tym doświadczeniu badany jest wpływ liczby mrówek na skuteczność algorytmu. Liczba iteracji algorytmu jest stała we wszystkich próbach. Należy zwrócić uwagę na fakt, że algorytm działający w pełni losowo ma teoretycznie większą szansę trafienia na optymalne rozwiązanie przy większej liczbie mrówek (liczba wygenerowanych rozwiązań w jednym eksperymencie jest równa iloczynowi liczby iteracji przez liczbę mrówek). Badane problemy to: hp1, weing1 oraz sento1. Dla każdego problemu wykonano 6 doświadczeń. Każda próba składała się ze 100 iteracji algorytmu. Wartości parametrów algorytmów zostały dobrane empirycznie dla każdego z problemów. Badane wartości parametru m to: 5, 10, 20, 40, 80, 160. Rysunek 5.6 przedstawia zależność pomiędzy liczbą mrówek a skutecznością algorytmu. Przy 5 mrówkach skuteczność w zależności od problemu mieściła się w 63

zakresie od 0 do 30%. Zwiększając liczbę mrówek ośmiokrotnie (m = 40), skuteczność ta osiągała wartość od 15% dla problemu hp1 do ponad 80% dla problemu sento1. Przy 160 mrówkach skuteczność wynosiła od ponad 40% dla problemu hp1 do blisko 100% dla problemów sento1 i weing1. Skuteczność algorytmu wzrastała wraz ze wzrostem liczby mrówek. Jednak przy 160 mrówkach czas obliczeń był około 30 razy dłuższy niż w przypaku 5 mrówek. Zadowalające wyniki, powyżej 90%, zostały osiągnięte dla problemów weing1 i sento1 w przypadku m = 80. Waga heurystyki Parametr β jest współczynnikiem wagowym lokalnej heurystyki. Gdy wartość tego parametru rośnie, wtedy rośnie również prawdopodobieństwo przejścia mrówki jest większe tam, gdzie wartość lokalnej heurystyki jest większa. W poniższym doświadczeniu zostały zbadane 3 problemy: hp1, sento1 oraz weing1. Dla każdego problemu wykonano po 50 prób dla każdej z poniższych wartości parametru β: 0, 1 ; 0, 2 ; 0, 5 ; 1 ; 2 ; 4 ; 8. Pozostałe parametry miały wartości: m = 40 α = 8 ρ = 0, 001 τ 0 = 0, 0001 q 0 = 0, 5 Wyniki doświadczenia przedstawia rysunek 5.7. Analizując wykres można zauważyć, że algorytm dla każdego problemu inaczej reagował na zmianę parametru β. W przypadku problemu weing1 dla 0, 1 < β < 2 skuteczność wynosiła ponad 50%. Jednak już dla wartości β = 4 i większej skuteczność drastycznie spadła do blisko 0%. 64

Rysunek 5.7: Wpływ parametru β na skuteczność algorytmu krawędziowego. W przypadku problemu sento1 skuteczność wynosiła 100%, gdy wartość parametru β mieściła się w przedziale od 2 do 4. Przy wartości β = 0, 2 skuteczność wynosiła już tylko 50%, a przy β = 0, 1 zaledwie 10%. Skuteczność algorytmu była niska dla problemu hp1. Jednak najlepsze rezultaty, na poziomie 20% zostały osiągnięte przy wartości parametru β = 0, 01. Dla β 1 skuteczność zmalała do kilku procent. Podsumowując, najepsze wyniki uzyskiwane były dla następujących wartości parametru: β = 2 w przypadku problemu sento1, β = 1 w przypadku weing1, β = 0, 1 w przpadku hp1. Prawdopodobieństwo eksploatacji Kolejnym parametrem jest q 0. Parametr wyznacza prawdopodobieństwo wyboru eksploatacji przez mrówkę i przyjmuje wartości z zakresu 0 do 1. Wartość q 0 = 0 oznacza, że w każdym ruchu mrówka podejmie decyzję o eksploracji przestrzeni rozwiązań. Wartość q 0 = 1 oznacza, że za każdym razem zostanie przeprowadzona eksploatacja (czyli deterministyczny wybór najbardziej obiecującej krawędzi). Doświadczenie przeprowadzono dla następujących wartości parametru q 0 : 0 65

Rysunek 5.8: Wpływ parametru q 0 na skuteczność algorytmu krawędziowego. (zawsze eksploracja) ; 0, 1 ; 0, 3 ; 0, 5 ; 0, 7 ; 0, 9 ; 1 (zawsze eksploatacja). Podobnie jak w przypadku poprzednich doświadczeń, badania przeprowadzono na problemach: hp1, sento1 oraz weing1. Wyniki przeprowadzonego doświadczenia zostały zaprezentowane na rysunku 5.8. Można zauważyć, że w przypadku problemu sento algorytm dawał satysfakcjonujące wyniki (blisko 100% skuteczności) gdy prawdopodobieństwo eksploracji mieściło się w przedziale [0; 0, 7]. Dla problemu hp1 największa skuteczność (na poziomie 30%) osiągnięta została przy wartości parametru q 0 = 0, 3. W przypadku problemu weing1 skuteczność powyżej 90% algorytm osiągał, gdy 0 < q 0 < 0, 3. 5.2 Badanie parametrów dla węzłowej reprezentacji feromonu W tym rozdziale zostanie zbadany wpływ następujących parametrów na skuteczność algorytmu dla reprezentacji węzłowej: współczynnik poświaty feromonowej α, 66

waga heurystyki lokalnej β, współczynnik wyparowywania ρ, liczba mrówek m, prawdopodobieństwo eksploracji q 0. Parametry te zostały szerzej opisane w poprzednich doświadczeniach. Dla reprezentacji węzłowej przeprowadzono szereg doświadczeń analogicznych do tych, które zostały opisane wcześniej dla reprezentacji krawędziowej. W doświadczeniach wykorzystano problemy sento1, weing1 oraz hp1. Problemy te różnią się wielkością i trudnością w rozwiązaniu ich przy pomocy algorytmu mrowiskowego. Wpółczynnik poświaty feromonowej Dla poszczególnych problemów parametry zostały dobrane empirycznie: Problem m β ρ τ 0 q 0 sento1 40 1 0,001 0,0001 0,1 hp1 40 0,4 0,001 0,0001 0,1 weing1 40 0,4 0,001 0,0001 0,1 Testowane wartości parametru α to: 1 (najmniejsza ilość feromonu odkładana przy aktualizacji globalnej), 2, 4, 8, 16, 32, 64, 128 (największa ilość feromonu odkładana przy aktualizacji globalnej). Wykonano po 20 prób dla każdej wartości parametru. Każda próba składała się ze 100 iteracji algorytmu. Wyniki doświadczenia przedstawia rysunek 5.9. Dla wszystkich testowanych wartości skuteczność algorytmu dla problemu weing1 wynosiła 100%. W przypadku problemu sento1 najlepsze rezultaty (100% skuteczności) przyniosły próby przy wartości parametru α = 1. Dla większych wartości parametru skuteczność stopniowo malała do ok. 80% dla wartości α = 128. Nieco inaczej sytuacja wygląda dla problemu hp1. W tym wypadku trudno stwierdzić zależność pomiędzy wartością parametru α, a skutecznością algorytmu. Aby 67

Rysunek 5.9: Wpływ współczynnika α na skuteczność algorytmu węzłowego. Rysunek 5.10: Średnia wartość rozwiązania w poszczególnych iteracjach algorytmu dla problemu hp1. dokładniej przeanalizować próby algorytmu dla problemu hp1, na rysunku 5.10 przedstawiono średnie rozwiąznia w poszczególnych iteracjach. Można zauważyć, że w przypadku α = 8 i α = 128 średnia wartość rozwiązania w iteracji szybko osiąga stały pułap na poziomie od 3240 do 3280. Dla α = 1 pułap 68

ten jest niższy od 3200 do 3240. Skuteczność algorytmu dla wymienionych wartości parametru α jest zbliżona, więc można przyjąć, że najlepszym wyborem jest tu α = 8. Największą skuteczność algorytm osiągał dla następujących wartości parametru α: hp1 : α = 8 sento1 : α = 1 weing1 : dowolna wartość α Waga heurystyki Eksperymenty przeprowadzone za pomocą algorytmu krawędziowego wykazały dużą rozbieżność pomiędzy optymalnymi wartościami parametru β w zależności od badanego problemu. W poniższym doświadczeniu przetestowano skuteczność algorytmu dla 7 różnych wartości parametru β. Dla każdej z wartości przeprowadzono 20 prób po 100 iteracji. Badane wartości parametru β to: 0, 1 (niewielki wpływ heurystyki lokalnej) ; 0, 2 ; 0, 5 ; 1 ; 2 ; 4 ; 8 (duży wpływ heurystyki lokalnej). Jak wynika z przeprowadzonego doświadczenia (rysunek 5.11), parametr β ma duży wpływ na osiągane rezultaty. W przypadku problemu sento1 skuteczność dla β = 0, 2 wynosi niespełna 20%, ale już dla wartości β = 0, 5 skuteczność ta wzrasta do blisko 100%. Rozwiązanie optymalne było znajdowane w każdej z prób, gdy parametr β przyjmował wartość od 1 do 8. Analizując wpływ wartości parametru β na wyniki rozwiązania problemu weing1 można zauważyć, że najwyższą skuteczność na poziomie 100% algorytm osiągał, gdy 0, 2 > β > 1. Już dla wartości β = 4 skuteczność zmalała do kilku procent, a dla wartości β = 8 algorytm nie potrafił znaleźć optymalnego rozwiązania. Ciekawą obserwację można przeprowadzić analizując wpływ parametru β na wyniki działania algorytmu dla problemu hp1. W żadnym z poprzednich doświadczeń, nawet w przypadku algorytmu krawędziowego nie udało się uzyskać takiej skuteczności dla problemu hp1. Najwyższa skuteczność, powyżej 50%, została osiągnięta, gdy 69

Rysunek 5.11: Waga heurystyki a skuteczność reprezentacji węzłowej. β = 0, 1. Zwiększanie wartości parametru β wpływało niekorzystnie na skuteczność algorytmu. Dla β = 4 skuteczność ta wynosiła 0%. Współczynnik wyparowywania feromonu W algorytmie węzłowym parametrem jest ρ, który odpowiada za sterowanie szybkością wyparowywania feromonu z węzłów grafu problemu. Podobnie jak w przypadku mrówki krawędziowej, większa wartość parametru ρ powoduje szybsze wyparowywanie feromonu. Niweluje przez to prawdopodobieństwo stagnacji, ale zwiększa czynnik losowy przy wyborze kolejnych węzłów przez mrówkę. Badane wartości parametru ρ są identyczne jak dla tego samego doświadczenia dla algorytmu krawędziowego. Wyniki doświadczenia przedstawia rysunek 5.12. Można zaobserwować, że dla wszystkich trzech problemów algorytm osiągał najlepszą skuteczność dla ρ = 0, 01. Dla problemów sento1 i weing skuteczność ta wynosiła 100%, a w przypadku problemu hp1 około 60% (jest to dotychczas największa skuteczność dla tego prolemu otrzymana w przeprowadzonych doświadczeniach). Zmniejszenie wartości parametru ρ do 0, 00001 skutkowało nieznacznym spadkiem skuteczności w przypadku problemów sento1 i weing1. Dla problemu hp1 sku- 70

Rysunek 5.12: Współczynnik wyparowywania feromonu a skuteczność reprezentacji węzłowej. teczność spadła o ponad połowę. Zwiększenie wartości parametru ρ do 0, 1 zdecydowanie zmniejszyło skuteczność do odpowiednio 10% dla hp1, 30% dla weing1 i 60% dla sento1. Prawdopodobieństwo eksploatacji Doświadczenia wykazały, że w przypadku reprezentacji węzłowej lepsze wyniki uzyskiwane są w przypadku mniejszych wartości parametru q 0, niż w przypadku reprezentacji krawędziowej. W związku z tym zestaw wartości testowych parametru ρ dla algorytmu węzłowego został nieco zmodyfikowany: 0 (tylko eksploracja) ; 0, 05 ; 0, 1 ; 0, 2 ; 0, 3 ; 0, 5 ; 0, 7 ; 1 (tylko eksploatacja). W przypadku prawdopodobieństwa eksploatacji q 0 = 1 mrówki zawsze wybierają najbardziej obiecujący węzeł. Na rysunku 5.13 można zauważyć, że optimum dla problemu sento1 zostało uzyskane w blisko 100% prób niezależnie od wartości parametru q 0. Jednak zmiana parametru q0 znacząco wpływała na wyniki osiągnięte dla pozostałych dwóch problemów. Dla problemu weing1 Skuteczność bliską 100% algorytm osiągał, gdy 0 q 0 0, 3. Natomiast w przypadku problemu hp1 optimum osiągniete zostało w ponad 60% przypadków, gdy q 0 = 0, 2. 71

Rysunek 5.13: Wpływ prawdopodobieństwa eksploatacji na skuteczność reprezentacji węzłowej. Podsumowując wyniki działania algorytmu, były one satysfakcjonujące dla wszystkich badanych problemów, gdy wartość q 0 = 2. Na tej podstawie nie można stwierdzić, że powyższa wartość będzie również sprawdzać się w przypadku innych problemów. Można jednak przyjąć ją za punkt wyjścia przy dobieraniu wartości parametru q 0. Liczba mrówek W poniższym doświadczeniu zostanie zbadany wpływ liczby mrówek na skuteczność algorytmu. Testowane wartości parametru m są identyczne jak w przypadku reprezentacji krawędziowej (5, 10, 20, 40, 80, 160), a wartości pozostałych parametrów zostały dobrane empirycznie. Skuteczność algorytmu wzrastała wraz z wzrostem liczby mrówek. Po zwiększaniu liczby mrówek, podobnie jak dla algorytmu krawędziowego zwiększa się również liczba obliczeń. Czas wykonywania obliczeń dla 80 mrówek jest blisko dwukrotnie większy od czasu wykonywania obliczeń dla 40 mrówek. Na rysunku 5.14 widać, że w przypadku wszystkich problemów skuteczność przekraczała próg 50% dla m = 40. Skuteczność dla m = 40 dla poszczególnych pro- 72

Rysunek 5.14: Wpływ liczby mrówek na skuteczność reprezentacji węzłowej blemów wynosiła: 100% dla problemu sento1, 98% dla problemu weing1, 58% dla problemu hp1. Dwukrotne zwiększenie liczby mrówek (do 80) zwiększyło skuteczność dla problemu hp1 do 65%. Korzystając z własności prawdopodobieństwa (wzór 5.1), można obliczyć ile wynosi skuteczność w przypadku dwukrotnego uruchomienia algorytmu dla 40 mrówek. P (A B) = P (A) + P (B) + P (A B) (5.1). Jeżeli dla jednego uruchomienia prawdopodobieństwo trafienia optimum wynosi 58%, to przy dwukrotnym uruchomieniu algorytmu prawdopodobieństwo to wynosi: 0, 58 + 0, 58 0, 58 2 = 82, 36%. Można więc stwierdzić, że korzystniejsze pod względem skuteczności jest dwukrotne uruchomienie algorytmu z paramerem m = 40 niż jednokrotne uruchomienie algorytmu dla m = 80. 73

Inaczej sytuacja wygląda dla wartości m = 20. Dwukrotne uruchomienie algorytmu dla takiej wartości m daje skuteczność: 0, 3 + 0, 3 0, 3 2 = 51%, czyli niższą niż w przypadku jednokrotnego uruchomienia algorytmu z parametrem m = 40. Z tego wynika, że najkorzystniejsze rezultaty dla problemu hp1 algorytm osiąga, gdy m = 40. Podsumowanie Nie można ustalić uniwersalnych parametrów dla każdego problemu. Dla testowanych problemów najlepsze rezultaty algorytm osiągał przy wartościach parametrów przedstawionych w tabeli 5.2. Przedstawione w tabeli wyniki okazały się najlepszymi z testowanych wartości przy 100 iteracjach algorytmu i 40 mrówkach. Tabela 5.1: Najlepsze wartości parametrów dla badanych problemów w reprezentacji krawędziowej Problem α β ρ q 0 sento1 1 1 8 0, 01 0, 001 0 0, 5 weing1 1 12 0, 1 1 0, 01 0, 001 0 0, 5 hp1 8 0, l 0, 001 0, 2 5.3 Porównanie różnych reprezentacji mapy feromonowej Trudno jest porównywać oba algorytmy pod względem skuteczności, ponieważ nie ma gwarancji, że parametry, które zostały użyte były optymalne dla badanych problemów. Możliwe, że w przeprowadzonych doświadczeniach pominięte zostały optymalne wartości parametrów dla analizowanych problemów. W przypadku problemów sento1 i weing1 obie reprezenacje przy odpowiedniej konfiguracji parametrów pozwoliły osiągnąć 100% skuteczności. Inaczej sytuacja wyglądała w przypadku problemu hp1. Badane parametry w reprezentacji krawędziowej 74

pozwoliły osiągnąć skuteczność na poziomie 30%. Jednak już w reprezentacji węzłowej odpowiedni dobór wartości parametrów pozwolił osiągnąć skuteczność dwukrotnie wyższą, na poziomie 60%. Porównanie skuteczności dla poszczególnych problemów Aby porównać skuteczność obu algorytmów utworzono 5 zestawów parametrów dla każdej reprezentacji feromonu. Przy doborze parametrów kierowano się wynikami z przeprowadzonych wcześniej doświadczeń. Zestawy parametrów przedstawione zostały w tabelach 5.2 i 5.3. Tabela 5.2: Doświadczalne zestawy parametrów dla reprezentacji węzłowej Zestaw α β ρ q 0 W1 1 1 0, 01 0, 1 W2 1 0, 1 0, 001 0, 2 W3 2 0, 5 0, 001 0, 2 W4 4 1 0, 001 0, 4 W5 8 0, 5 0, 001 0, 2 Tabela 5.3: Doświadczalne zestawy parametrów dla reprezentacji krawędziowej Zestaw α β ρ q 0 K1 1 1 0, 1 0, 3 K2 1 0, 1 0, 0001 0, 2 K3 2 l 0, 0001 0, 3 K4 4 0, 5 0, 01 0, 2 K5 8 2 0, 001 0, 2 Doświadczenie zostało przeprowadzone na 21 problemach. Przy doborze problemów kierowano się ich zróżnicowaniem pod względem wielkości i trudności. Dla każdego z 10 zestawów parametrów wykonano 40 prób po 100 iteracji. W każdej iteracji rozwiązanie budowało 40 mrówek, co daje razem ponad 33 miliony wygenerowanych rozwiązań. Przeprowadzenie całego doświadczenia trwało kilkanaście godzin ciągłych obliczeń. Mimo tak dużej liczby wygenerowanych rozwiązań prawdopodobieństwo losowego trafienia optimum jest znikome. W przypadku największych problemów: weing8 75

Tabela 5.4: Skuteczność algorytmu dla poszczególnych problemów przy różnych zestawach parametrów. Problem W1 W2 W3 W4 W5 K1 K2 K3 K4 K5 weish01 100,0% 95,0% 100,0% 100,0% 100,0% 100,0% 40,0% 100,0% 100,0% 100,0% weish02 75,0% 85,0% 65,0% 42,5% 67,5% 100,0% 20,0% 100,0% 95,0% 75,0% weish06 100,0% 92,5% 80,0% 60,0% 72,5% 87,5% 0,0% 62,5% 100,0% 95,0% weish13 100,0% 87,5% 100,0% 100,0% 95,0% 62,5% 0,0% 37,5% 100,0% 100,0% weish14 97,5% 45,0% 100,0% 100,0% 97,5% 12,5% 0,0% 2,5% 100,0% 77,5% weish22 5,0% 0,0% 77,5% 92,5% 87,5% 0,0% 0,0% 0,0% 22,5% 15,0% weish27 0,0% 0,0% 95,0% 100,0% 92,5% 0,0% 0,0% 0,0% 32,5% 35,0% weing1 97,5% 100,0% 100,0% 90,0% 100,0% 60,0% 7,5% 77,5% 92,5% 97,5% weing3 100,0% 100,0% 100,0% 100,0% 100,0% 100,0% 77,5% 100,0% 95,0% 95,0% weing5 100,0% 100,0% 100,0% 100,0% 100,0% 100,0% 82,5% 100,0% 100,0% 97,5% weing7 0,0% 0,0% 0,0% 5,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% weing8 0,0% 0,0% 2,5% 20,0% 5,0% 0,0% 0,0% 0,0% 0,0% 0,0% hp1 35,0% 37,5% 32,5% 20,0% 17,5% 10,0% 22,5% 22,5% 17,5% 22,5% hp2 7,5% 90,0% 60,0% 17,5% 60,0% 0,0% 2,5% 2,5% 15,0% 15,0% pb1 47,5% 67,5% 52,5% 15,0% 30,0% 20,0% 25,0% 25,0% 15,0% 22,5% pb2 17,5% 85,0% 65,0% 15,0% 55,0% 2,5% 5,0% 0,0% 25,0% 15,0% pb4 100,0% 100,0% 90,0% 87,5% 95,0% 92,5% 45,0% 87,5% 97,5% 75,0% pb5 77,5% 55,0% 37,5% 7,5% 27,5% 55,0% 80,0% 77,5% 37,5% 40,0% pb7 97,5% 57,5% 75,0% 50,0% 45,0% 77,5% 5,0% 62,5% 85,0% 70,0% sento1 100,0% 15,0% 95,0% 100,0% 87,5% 75,0% 0,0% 25,0% 100,0% 75,0% sento2 90,0% 0,0% 62,5% 72,5% 40,0% 22,5% 0,0% 2,5% 77,5% 37,5% i weing7 liczba możliwych kombinacji przedmiotów wynosi 2 105 1 4 10 31, a liczba wygenerowanych rozwiązań w 100 iteracjach algorytmu wynosi 1, 6 10 5. Wyniki doświadczenia procentowy stosunek liczby prób, w których udało się znaleźć optymalne rozwiązanie do całkowitej liczby prób przedstawia tabela 5.4. Analizując wyniki doświadczenia można zauważyć, że tylko jeden zestaw parametrów (W4 ) pozwolił rozwiązać wszystkie testowane problemy. Również tylko dla tego zestawu zostało osiągnięte optimum problemu weing7. 20 z 21 testowych problemów udało się rozwiązać używająć zestawów W3 i W5. W przypadku reprezentacji krawędziowej najwięcej, bo 19 z 21 problemów zostało rozwiązanych przy użyciu zestawów K4 i K5. Najsłabszym zestawem parametrów okazał się zestaw K5. Przy jego wykorzystaniu udało się rozwiązać tylko 12 problemów. Rysunek 5.15 przedstawia porównanie skuteczności algorytmów dla poszczególnych zestawów parametrów. Okazuje się, że mimo tego, że zestaw W4 jako jedyny pozwolił na rozwiązanie wszystkich problemów, to pod względem średniej skuteczności znajduje się w środku rankingu testowanych zestawów. Najlepszy w tym wypadku okazał się zestaw W1. Biorąc pod uwagę medianę skuteczności, najlepszy rezultat osiągnięto dla zestawu W1. Dla tego zestawu w przypadku połowy badanych problemów skuteczność przekraczała 90%. Pod względem mediany skuteczności na drugim miej- 76

Rysunek 5.15: Skuteczność dla poszczególnych zestawów parametrów. scu znalazł się zestaw dla reprezentacji krawędziowej K4. W tym przypadku połowa badanych problemów została rozwiązana w 85% prób. Podsumowując: zestawy wartości parametrów, na które warto zwrócić szczególną uwagę to: W1 znalezione optimum dla każdego z badanych problemów, W3 największa średnia skuteczność, W4 największa mediana skuteczności, K4 najwyższa średnia skuteczność i największa mediana skuteczności dla reprezentacji krawędziowej. Rysunek 5.16 przedstawia porównanie średniej skuteczności reprezentacji węzłowej i krawędziowej. Można zauważyć, że w większości problemów lepsza skuteczność 77

Rysunek 5.16: Średnia skuteczność algorytmów dla poszczególnych problemów. została osiągnięta przy użyciu reprezentacji węzłowej. Nie jest to jednak dowód wyższości reprezentacji węzłowej nad reprezentacją krawędziową. Można jedynie stwierdzić, że przy zestawach parametrów wykorzystanych w doświadczeniu średnia skuteczność reprezentacji węzłowej była wyższa niż w reprezentacji krawędziowej. Bardziej wiarygodne może okazać się porównanie skuteczności dla najlepszego spośród testowanych zestawów parametrów reprezentacji węzłowej i krawędziowej. Takie porównanie przedstawia rysunek 5.17. W przypadku problemów weish02 oraz pb5 lepsze wyniki osiągnięto przy użyciu reprezentacji krawędziowej. W pozostałych przypadkach lepsze wyniki osiągnięto dla reprezentacji węzłowej. Jedynym wiarygodnym testem byłoby przetestowanie wszystkich możliwych kombinacji wartości parametrów. Nie jest to możliwe, dlatego nie można jednoznacznie określić, która z nich daje lepsze wyniki w przypadku problemu plecakowego. Dla testowych zestawów parametrów bardziej skuteczna okazała się reprezentacja węzłowa. Nie ma jednak dowodu na to, że 78

inne zestawy parametrów dla reprezentacji krawędziowej nie pozwoliłyby na osiągnięcie lepszych wyników niż dla reprezentacji węzłowej. Rysunek 5.17: Skuteczność algorytmu dla poszczególnych problemów przy najlepszym zestawie parametrów 79

Podsumowanie W pracy przedstawiono i porównano dwie reprezentacje mapy fermonowej w problemie plecakowym: węzłową i krawędziową. Do pracy dołączona została aplikacja testowa, dzięki której można przeanalizować wyniki działania tych dwóch algorytmów. W poprzednich pracach została zbadana jedna z reprezentacji map feromonowych. W tej pracy oprócz reprezentacji węzłowej zaproponowanej przez G. Leguizamon, Z. Michalewicza[2] zbadano również reprezentację krawędziową zaproponowaną przez S. Fidanovą. W odróżnieniu do poprzednich prac, w dołączonej aplikacji zostały wykorzystane heurystyki przedstawione przez S. Fidanovą w publikacji[1]. Celem badań było porównanie skuteczności dwóch reprezentacji w problemie plecakowym i zbadanie wpływu poszczególnych parametrów na osiągane wyniki. Przy adaptacji systemu mrowiskowego do problemu plecakowego problem stanowi odpowiedni dobór wartości parametrów algorytmu. Przeanalizowano szczegółowo wpływ każdego z parametrów na skuteczność algorytmu w obu reprezentacjach. Wartości parametrów powinny być dobierane indywidualnie do każdego problemu. Zestaw parametrów, który okaże się skuteczny dla jednego problemu, może nie spełniać oczekiwań w przypadku innego problemu. Aby badania były wiarygodne, każde z doświadczeń przeprowadzono na kilku różnych problemach plecakowych. Poszczególne doświadczenia zostały zakończone wnioskami. Liczba wartości parametrów i ich kombinacji jest nieskończenie wielka. Przy dobieraniu tych wartości trzeba ustalić zestaw parametrów będący punktem wyjścia do dalszej analizy. Poprzednie publikacje nie dostarczają takiego zestawu wartości parametrów. W tej pracy podjęta została próba skonstruowania takiego zestawu. Na wybranych 21 problemach plecakowych przeprowadzono analizę skuteczności dla róż- 80