Anna Wawszczak - Biblioteka szablonów algorytmów heurystycznych
Transkrypt
Anna Wawszczak - Biblioteka szablonów algorytmów heurystycznych
Biblioteka szablonów algorytmów heurystycznych Anna Wawszczak1 1 Wydział Inżynierii Mechanicznej i Informatyki Kierunek Informatyka, Rok V [email protected] Streszczenie Algorytmy heurystyczne sa˛ wykorzystywane praktycznie w każdej dziedzinie nauki, mi˛edzy innymi w technice, medycynie, ekonomii. Cz˛esto jednak osoby zajmujace ˛ si˛e konkretnym problemem nie posiadaja˛ wiedzy wystarczajacej ˛ do samodzielnego zaimplementowania na przykład algorytmu genetycznego. Zaprezentowana w niniejszej pracy biblioteka szablonów algorytmów heurystycznych MetahLib została zaprojektowana aby umożliwić korzystanie z algorytmów heurystycznych bez konieczności posiadania szczegółowej wiedzy na temat ich działania. Sposób wykorzystania biblioteki został przedstawiony na przykładzie problemu minimalizacji funkcji wielu zmiennych z ograniczeniami. Do rozwiazania ˛ tego problemu zastosowane zostały algorytmy przeszukiwania lokalnego (z wykorzystaniem strategii najwi˛ekszego spadku i pierwszego ulepszenia), oraz algorytm symulowanego wyżarzania. 1 Wst˛ep Dynamiczny rozwój techniki stawia przed nami nowe, coraz trudniejsze zadania. Rozwiazywanie ˛ problemów staje si˛e coraz bardziej skomplikowane, gdyż staramy si˛e brać pod uwag˛e coraz wi˛ecej czynników wpływajacych ˛ na analizowane zjawisko. Zaniedbanie cz˛eści z tych czynników powoduje, iż wykorzystywany model coraz bardziej odbiega od rzeczywistości. Uwzgl˛ednienie dużej ich liczby powoduje konieczność wprowadzenia coraz bardziej skomplikowanych zwiazków ˛ i zależności mi˛edzy nimi, prowadzac ˛ w rezultacie do komplikacji problemu i znacznego zwi˛ekszenia złożoności obliczeniowej. Wiele współczesnych algorytmów próbujacych ˛ dać odpowiedź na pytania dotyczace ˛ otaczajacego ˛ nas świata to problemy klasy NP lub NP-trudne. Mimo szybkiego rozwoju komputerów, ciagłego ˛ zwi˛ekszania mocy obliczeniowej oraz stosowania komputerów pracujacych ˛ równoległe, algorytmy takie sa˛ nadal zbyt kosztowne obliczeniowo. Wykładniczy wzrost liczby operacji koniecznych do wykonania pozwala na rozwiazanie ˛ tylko niewielkich zadań. Gdy rozmiar zadania jest na tyle duży, że bezpośrednie znalezienie rozwiazania ˛ za pomoca˛ klasycznych metod jest niemożliwe lub nieopłacalne, konieczne jest zastosowanie algorytmów dajacych ˛ rozwiazanie ˛ bliskie optymalnemu. W wielu przypadkach korzystniej jest uzyskać w rozsadnym ˛ czasie rozwiazanie ˛ dobre, lecz nie optymalne niż czekać 1 bardzo długi okres czasu na znalezienie rozwiazania ˛ idealnego. W zadaniach tego typu doskonale sprawdzaja˛ si˛e algorytmy heurystyczne. Celem niniejszej pracy jest prezentacja biblioteki szablonów algorytmów heurystycznych MetahLib, zaprojektowanej w taki sposób, aby mogła być wykorzystywana również przez osoby majace ˛ jedynie podstawowa˛ wiedz˛e na temat tego typu algorytmów. Cz˛esto osoby zajmujace ˛ si˛e konkretnym problemem nie posiadaja˛ wystarczajacej ˛ wiedzy aby samodzielnie zaimplementować na przykład algorytm genetyczny. Z drugiej strony, osoby zajmujace ˛ si˛e heurystykami cz˛esto nie wiedza˛ wystarczajaco ˛ dużo na temat dziedziny problemu, który należy rozwiazać. ˛ Biblioteka MetahLib pozwala na korzystanie z algorytmów heurystycznych bez konieczności zagł˛ebiania si˛e w szczegóły działania algorytmu. Wymaga jedynie zdefiniowania tych elementów, które sa˛ bezpośrednio powiazane ˛ z rozwiazywanym ˛ problemem. W niektórych przypadkach do rozwiazania ˛ problemu konieczne jest jedynie zefiniowanie funkcji oceny rozwiazania. ˛ Algorytmy heurystyczne charakteryzuja˛ si˛e tym, iż sa˛ w dużym stopniu uniwersalne. Cz˛esto rozwiazanie ˛ problemu możliwe jest za pomoca˛ różnych heurystyk. Nie ma ściśle określonych zasad dotyczacych ˛ wyboru najlepszego algorytmu. Czasami po uruchomieniu programu okazuje si˛e, że wybrany algorytm jest nieskuteczny. Biblioteka szablonów algorytmów heurystycznych została zaprojektowana tak, aby umożliwić szybka˛ zmian˛e wykorzystywanego algorytmu, bez konieczności ponownego definiowania jego elementów składowych. Wszystkie algorytmy należace ˛ do biblioteki MetahLib wymagaja˛ takiego samego sposobu zdefiniowania funkcji oceny, a w wi˛ekszości przypadków również generatora sasiedztwa ˛ i kryterium stopu. Możliwe jest na przykład wykorzystanie najprostszego algorytmu przeszukiwania lokalnego i uruchomienie go z kilku losowych punktów. Jeśli rozwiazania ˛ uzyskane z różnych punktów startowych b˛eda˛ różne, może to oznaczać, że istnieje wiele minimów (lub maksimów) lokalnych. W prosty sposób można wyeliminować ten problem i przeprowadzić przeszukiwanie za pomoca˛ symulowanego wyżarzania, wykorzystujac ˛ zdefiniowana˛ wcześniej funkcj˛e sasiedztwa, ˛ reprezentacj˛e celu i funkcj˛e oceny. 2 Biblioteka MetahLib Biblioteka MetahLib składa si˛e z trzech algorytmów heurystycznych: • przeszukiwania lokalnego, • symulowanego wyżarzania, • algorytmu genetycznego, oraz dodatkowych elementów koniecznych do działania algorytmu, mi˛edzy innymi: • szablonu klasy b˛edacej ˛ modelem reprezentacji rozwiazania ˛ b˛edacego: ˛ – wektorem liczb rzeczywistych, – ciagiem ˛ binarnym, • funkcji sasiedztwa, ˛ 2 • operatorów selekcji, • operatorów krzyżowania, • operatorów mutacji, • generatora liczb losowych. Biblioteka MetahLib została zaimplementowana w j˛ezyku C++. 3 3.1 Wybrane algorytmy heurystyczne Przeszukiwanie lokalne Local search (przeszukiwanie lokalne) to jedna z podstawowych metod optymalizacji kombinatorycznej, pozwalajaca ˛ znaleźć rozwiazanie ˛ bliskie optymalnemu w rozsadnym ˛ czasie. Przeszukiwanie lokalne jest pewnego rodzaju baza˛ dla wielu metaheurystyk umożliwiajacych ˛ znalezienie rozwiazania ˛ lepszej jakości niż local search. Algorytm przeszukiwania lokalnego zaczyna poszukiwania od rozwiazania ˛ poczatko˛ wego, które w pierwszej iteracji pełni rol˛e rozwiazania ˛ bazowego. Nast˛epnie, w otoczeniu tego rozwiazania, ˛ poszukiwane jest rozwiazanie ˛ lepszej jakości. Znalezione w ten sposób rozwiazanie ˛ staje si˛e nowym rozwiazaniem ˛ bazowym. W kolejnych krokach iteracji przeszukiwane jest otoczenie aktualnego rozwiazania. ˛ Proces poszukiwania kończy si˛e, gdy w otoczeniu rozwiazania ˛ bazowego nie można już znaleźć rozwiazania ˛ lepszej jakości.[3] Rozwiazanie ˛ to zostaje zwrócone jako rezultat optymalizacji. W pewnych przypadkach proces optymalizacji może zostać zakończony, gdy spełnione zostanie określone na wst˛epie kryterium. Może nim być na przykład maksymalna dopuszczalna liczba iteracji. Istnieje kilka metod przeszukiwania lokalnego. Różnia˛ si˛e one głównie sposobem wybierania nowego rozwiazania ˛ z otoczenia. Dwie podstawowe strategie realizujace ˛ to zadanie to metoda najwi˛ekszego spadku (steepest descent), znana również jako wspinanie si˛e po najbardziej stromym zboczu oraz metoda pierwszego ulepszenia (first improvement). Pierwsza z wymienionych strategii polega na przeszukaniu całego otoczenia i wybraniu rozwiazania ˛ o najlepszej wartości funkcji oceny. Jeśli rozwiazanie ˛ to jest gorsze niż rozwiazanie ˛ bazowe, oznacza to, iż osiagni˛ ˛ ete zostało lokalne optimum. Strategia pierwszego ulepszenia nie przeszukuje całego sasiedztwa ˛ rozwiazania ˛ bazowego. Podczas każdej iteracji wybierane jest tylko jedno rozwiazanie ˛ należace ˛ do otoczenia. Jeśli rozwiazanie ˛ to jest lepsze, staje si˛e nowym rozwiazaniem ˛ bazowym.[2] 3.2 Symulowane wyżarzanie Symulowane wyżarzanie to algorytm bazujacy ˛ na przeszukiwaniu lokalnym, należacy ˛ do klasy algorytmów niedeterministycznych. Metoda ta znajduje zastosowanie wsz˛edzie tam, gdzie istnieje ryzyko wystapienia ˛ lokalnego minimum, z którego algorytm przeszukiwania lokalnego nie mógłby si˛e wydostać. Sposób działania algorytmu symulowanego wyżarzania oparty jest na analogii do zjawiska zaczerpni˛etego z termodynamiki. Podstawowa˛ cecha˛ algorytmu symulowanego wyżarzania jest to, iż poza akceptacja˛ rozwiazań ˛ lepszych w świetle funkcji oceny, w pewnych przypadkach akceptowane sa˛ również rozwiazania ˛ gorsze.[2] Poczatkowo ˛ prawdopodobieństwo akceptacji rozwiazania ˛ 3 gorszego jest stosunkowo duże. W kolejnych iteracjach prawdopodobieństwo stopniowo maleje. W rezultacie tego, w końcowej fazie działania algorytmu jedynie rozwiazania ˛ lepszej jakości moga˛ zostać zaakceptowane. Olbrzymia˛ zaleta˛ algorytmu symulowanego wyrażania jest to, iż wynik jego działania tylko w małym stopniu zależy od wyboru rozwiazania ˛ poczatkowego. ˛ Odpowiedni dobór parametrów pozwala algorytmowi na ucieczk˛e z lokalnego optimum. 4 Przykład zastosowania Działanie algorytmów należacych ˛ do biblioteki MetahLib zostało zaprezentowane na przykładzie problemu minimalizacji funkcji wielu zmiennych z ograniczeniami zaproponowango w pracy [1]. Zadanie polega na minimalizacji funkcji określonej wzorem (1) 5 G(x, y) = −10.5 · x1 − 7.5 · x2 − 3.5 · x3 − 2.5 · x4 − 1.5 · x5 − 10 · y − 0.5 · ∑ xi2 (1) i=1 przy ograniczeniach: 6 · x1 + 3 · x2 + 3 · x3 + 2 · x4 + x5 ≤ 6.5 10 · x1 + 10 · x3 + y ≤ 20 0 ≤ xi ≤ 1 0≤y (2) Globalnym rozwiazaniem ˛ jest: (x∗ , y∗ ) = (0, 1, 0, 1, 1, 20) przy czym: G(x∗ , y∗ ) = −213 4.1 Przeszukiwanie lokalne - strategia najwi˛ekszego spadku (steepest descent) Podstawowym elementem, który należy zdefiniować jest sposób reprezentacji rozwiaza˛ nia. W tym przypadku zastosowany został szablon klasy Solution. Solution<double> solution(6); Zdefiniowany w ten sposób obiekt solution przechowuje rozwiazanie ˛ za pomoca˛ wektora zmiennych typu double. Pierwszy element tego wktora odpowiada zmiennej y, natomiast kolejne elementy o indeksach od 1 do 5 przechowuja˛ odpowiednio zmienne x1 do x5 . Wszystkie elementy rozwiazania ˛ zostały zainicjowane wartościa˛ 0. Kolejny, bardzo ważny element algorytmu to funkcja oceny. Jest to jedyny element algorytmu, który musi zostać od podstaw zdefiniowany przez użytkownika. Zadaniem funkcji oceny jest określenie jakości alizowanego rozwiazania. ˛ Funkcj˛e oceny należy zdefiniować jako obiekt funkcyjny. Operator () powinien przyjmować jako parametr obiekt klasy reprezentuacej ˛ rozwiazanie ˛ (solution_type), natomiast zwracać wartość oceny typu fitness_type. Dla analizowanego problemu funkcja oceny zdefiniowana została w nast˛epujacy ˛ sposób: 4 class ObjectiveFunction { public: typedef Solution<double> solution_type; typedef double fitness_type; fitness_type operator()(const solution_type& v) { double suma = 0.0; for (int i=1; i<6; ++i){ suma+= v[i]*v[i]; } return -10.5*v[1]-7.5*v[2]-3.5*v[3]-2.5*v[4]-1.5*v[5] -10*v[0]-0.5*suma; } }; Funkcj˛e sasiedztwa, ˛ tworzac ˛ a˛ nowe rozwiazanie ˛ na podstawie rozwiazania ˛ bazowego, należy zdefiniować również jako obiekt funkcyjny. Operator() przyjmuje jako parametr obiekt klasy reprezentujacej ˛ rozwiazanie ˛ oraz zwraca wektor obiektów tej samej klasy należacych ˛ do sasiedztwa ˛ rozwiazania ˛ bazowego. Biblioteka MetahLib zawiera standardowe funkcje sasiedztwa ˛ zdefiniowane jako szablony obiektów funkcyjnych. Dla potrzeb rozważanego zadania wykorzystany został szablon klasy NeighbourVec<> zdefiniowany jako: NeighbourVec< solution_type > ng(0.05); Wartość przekazywana w konstruktorze określa stopień modyfikacji rozwiazania ˛ (wielkość przeszukiwanego otoczenia). Wartość 0.05 oznacza, iż poszczególne zmienne należace ˛ do rozwiazania ˛ moga˛ być zmienione o 5%. W przypadku zadań z ograniczeniami pojawia si˛e problem generowania rozwiazań ˛ nie spełniajacych ˛ tych ograniczeń. Dwa najcz˛eściej wykorzystywane sposoby radzenia sobie z tym problemem to odrzucanie lub naprawianie złych rozwiazań ˛ wewnatrz ˛ funkcji sasiedztwa ˛ lub zastosowanie funkcji kary. Aby uniknać ˛ konieczności definiowania funkcji sasiedztwa, ˛ dla analizowanego przypadku zastosowana została druga z wymienionych metod – funkcja kary. Funkcja ta przekazywana jest do algorytmu jako obiekt funkcyjny. Operator () przyjmuje dwa parametry: • referencj˛e do analizowanego rozwiazania ˛ • referencj˛e do zmiennej typu double, przez która˛ przekazywana jest wielkość kary nałożonej na rozwiazanie. ˛ Wartość 0.5 oznacza, że na rozwiazanie ˛ nałożona zostanie kara równa połowie wartości zwróconej przez funkcj˛e oceny. Wartość logiczna zwracana przez funkcj˛e określa, czy dane rozwiazanie ˛ może być dalej brane pod uwag˛e (true), czy powinno zostać całkowicie odrzucone (false). class Penality{ typedef Solution<double> solution_type; 5 typedef ObjectiveFunction::fitness_type fitness_type; public: bool operator()(solution_type & s, double & penality) { fitness_type tmp; if ((tmp=6*s[1]+3*s[2]+3*s[3]+2*s[4]+s[5]-6.5)>0) penality += tmp/6.5; if((tmp=10*s[1]+10*s[3]+s[0]-20>0)) penality += tmp/20; for (int i=0; i<6; ++i) if ((s[i] < 0) || (i!= 0 && s[i]>1)) return false; return true; } }; Ostatnim elementem algorytmu jest kryterium stopu, definiowane podobnie jak poprzednie elementy jako obiekt funkcyjny. Operator () przyjmuje zmienna˛ typu int, b˛edac ˛ a˛ liczba˛ iteracji, a zwraca wartość logiczna˛ true jeśli algorytm ma zakończyć działanie oraz false w przeciwnym wypadku. Dla celów analizowanego zadania wykorzystany został obiekt funkcyjny Iteration b˛edacy ˛ elementem biblioteki MetahLib. Iteration it(1e5); Wartość przekazana w konstruktorze to maksymalna dopuszczalna liczba itercji. Po zdefiniowaniu wszystkich elementów należy utworzyć obiekt klasy SteepestDescent reprezentujacy ˛ algorytm najwi˛ekszego spadku: SteepestDescent< solution_type , ObjectiveFunction, NeighbourVec<solution_type> , Iteration, less<double>, Penality > sd(of,ng,it, less<fitness_type>(), penality); Przekazane w konstruktorze parametry to: • of – funkcja oceny, • ng – generator sasiedztwa, ˛ • it – kryterium stopu, • less<fitness_type> – obiekt funkcyjny porównujacy ˛ oceny dwóch rozwiazań, ˛ • penality – funkcja kary. Ostatnim krokiem jest uruchomienie algorytmu poprzez wywołanie operatora (). Jako parametr przekazywane jest rozwiazanie ˛ poczatkowe, ˛ natomiast zwracane jest rozwiaza˛ nie zoptymalizowane. Wartość funkcji oceny dla zoptymalizowanego rozwiazania ˛ zwraca funkcja evaluation(). 6 solution_type s_opt = sd(s); cout << sd.evaluation() << endl; Optymalizacja przeprowadzona za pomoca˛ algorytmu steepest descent pozwoliła na otrzymanie rozwiazania, ˛ dla którego wartość minimalizowanej funkcji (1) wynosi −141.176. Jak widać jest to wynik dość odległy od globalnego minimum funkcji. 4.2 Przeszukiwanie lokalne - strategia pierwszego ulepszenia (first improvement) W celu poprawy wyniku uzyskanego za pomoca˛ algorytmu przeszukiwania lokalnego, wykorzystujacego ˛ strategi˛e steepest descent, dokonana została zmiana algorytmu na algorytm przeszukiwania lokalnego ze strategia˛ pierwszego ulepszenia. Jednym z celów prezentowanej biblioteki była łatwa możliwość wymiany stosowanego algorytmu. Jedyna˛ zmiana˛ jaka jest w tym przypadku konieczna jest zmiana funkcji sasiedztwa. ˛ W opisywanym powyżej algorytmie funkcja sasiedztwa ˛ generowała wektor rozwiazań ˛ sasiednich. ˛ W przypadku strategii pierwszego ulepszenia, z otoczenia bieżacego ˛ rozwia˛ zania wybierane jest (najcz˛eściej losowo) tylko jedno rozwiazanie ˛ sasiednie. ˛ Funkcja sa˛ siedztwa zwraca wi˛ec nie wektor a pojedyńcze rozwiazanie. ˛ Podobnie jak poprzednio zastosowany został generator sasiedztwa ˛ b˛edacy ˛ cz˛eścia˛ biblioteki MetahLib. Neighbour< solution_type > ng(0.5); Po zmianie generatora sasiedztwa ˛ pozostaje jedynie utworzenie reprezentujacego ˛ algorytm obiektu klasy FirstImprovemnt. Obiekt ten tworzony jest identycznie jak w poprzednim przypadku. FirstImprovement< solution_type, ObjectiveFunction, Neighbour<solution_type> , Iteration, less<double>, Penality > fi(of,ng,it, less<fitness_type>(), penality); Również identyczny jest sposób uruchomienia algorytmu i odczytania wyniku: solution_type s_opt = fi(s); cout << fi.evaluation() << endl; Zmiana algorytmu znacznie poprawiła rezultaty optymalizacji. Minimalna wartość funkcji uzyskana dla zoptymalizowanego rozwiazania ˛ wyniosła −198, 003. Ponieważ strategia first improvement sprawia, iż algorytm staje si˛e niedeterministyczny, przedstawiony wynik to średnia z wyników uzyskanych w 5 kolejnych uruchomieniach algorytmu. Jak widać uzyskany wynik jest już znacznie bliższy poszukiwanemu minimum funkcji. 7 4.3 Symulowane wyżarzanie Kolejna próba poprawy uzyskanego rezultatu to zmiana algorytmu przeszukiwania lokalnego na algorytm symulowanego wyżarzania. Dodatkowym elementem, który pojawia si˛e si˛e w symulowanym wyżarzaniu to parametr temperatury oraz funkcja chłodzenia, która modyfikuje ta˛ temperatur˛e. Funkcja chłodenia przekazywana jest do algorytmu jako obiekt funkcyjny, którego operator () przyjmuje jako parametry liczb˛e iteracji i aktualna˛ temperatur˛e, a zwraca nowa˛ zmodyfikowana˛ wartość temperatury. Klasa linear_cooling, b˛edaca ˛ elementem biblioteki MetahLib, realizuje liniowa˛ zmian˛e temperatury. Za każdym wywołaniem funkcji temperatura zmniejszana jest o wartość dT, przekazywana˛ jako parametr klasy. simulated_annealing::linear_cooling lc(1e-4); Pozostałe elementy algorytmu pozostaja˛ takie same jak w przypadku przeszukiwania lokalnego. Definicja obiektu klasy reprezentujacej ˛ algorytm symulowanego wżarzania wyglada ˛ nast˛epujaco: ˛ SimulatedAnnealing<solution, ObjectiveFunction, Neighbour<solution_type>, simulated_annealing::linear_cooling, Iteration, Penality> sa (of, ng, lc, it, penality); Aby uruchomić algorytm, poza rozwiazaniem ˛ poczatkowym, ˛ należy również podać temperatur˛e poczatkow ˛ a.˛ solution_type s_opt = sa(0.5); cout << fi.evaluation() << endl; Wartość funkcji dla najlepszego znalezionego rozwiazania ˛ wyniosła −212.998. Wartość średnia dla 5 uruchomień algorytmu to −209, 89. Ponieważ uzyskany wynik różni si˛e od wartości optymalnej jedynie o mniej niż 0.001%, można przyjać, ˛ iż globalne minimum funkcji zostało odnalezione. Z pewnościa˛ istnieja˛ szybsze i skuteczniejsze metody wyznaczenia minimum analizowanej funkcji. Powyższe przykłady nie maja˛ jednak na celu pokazania optymalnej metody rozwiazania ˛ tego problemu, a jedynie zaprezentowanie sposobu wykorzystania biblioteki MetahLib. 5 Wykorzystanie biblioteki w połaczeniu ˛ z innymi aplikacjami Jednym z głównych zastosowań algorytmów heurystycznych jest optymalizacja kształtu. W zagadnieniach inżynierskich podczas optymalizacji kształtu najcz˛eściej jako kryterium przyjmuje si˛e pewna˛ wielkość fizyczna,˛ np. sił˛e, cz˛estotliwości itp. Istnieje wiele programów inżynierskich umożliwiajacych ˛ symulacj˛e zjawisk fizycznych i wyznaczenie tych wartości w zależności od zadanych parametrów. Znaczna cz˛eść z tych programów 8 umożliwia uruchomienie symulacji za pośrednictwem wiersza poleceń (bez korzystania z interfejsu graficznego). Programy te moga˛ być z powodzeniem stosowane w połaczeniu ˛ z algorytmami heurystycznymi, w tym również z algorytmami należacymi ˛ do biblioteki MetahLib. Jedynym elementem bezwzgl˛ednie wymaganym przez wszystkie algorytmy biblioteki MetahLib jest funkcja oceny rozwiazania. ˛ Po zdefiniowaniu odpowiedniego interfejsu, zapewniajacego ˛ komunikacj˛e mi˛edzy programami, programy inżynierskie moga˛ pełnić rol˛e takiej właśnie funkcji oceny. Podczas uruchamiania programu przekazywane sa˛ parametry opisujace ˛ model, b˛edace ˛ jednocześnie zmiennymi podlegajacymi ˛ optymalizacji. Po zakończeniu obliczeń program zwraca wynik b˛edacy ˛ wartościa˛ funkcji oceny. Wykorzystanie algorytmów heurystycznych w połaczeniu ˛ z programem Cosmos/M zostało przedtawione w pracy [4]. Zaprezentowana została tam optymalizacja kształtu podpory pod półk˛e hybrydowym algorytmem heurystycznym. Celem optymalizacji była minimalizacja maksymalnego napr˛eżenia, które wyznaczane było za pomoca˛ programu Cosmos/M. Połaczenie ˛ programów inżynierskich z biblioteka˛ MetahLib znacznie zmniejsza nakład pracy potrzebny do implementacji programu wykonujacego ˛ optymalizacj˛e. 6 Podsumowanie Przedstawiona w niniejszej pracy biblioteka MetahLib może być wygodnym narz˛edziem, ułatwiajacym ˛ korzystanie z algorytmów heurystycznych. Dzi˛eki temu, iż biblioteka poza szablonami algorytmów, zawiera również dodatkowe elementy takie jak funkcje sa˛ siedztwa, szablony klas pełniacych ˛ funkcj˛e reprezentacji rozwiazania, ˛ kryterium stopu czy schematy chłodzenia, ilość kodu pisanego przez użytkownika zredukowana jest do niezb˛ednego minimum. Czasami ogranicza si˛e jedynie do zdefiniowania, zależnej bezpośrednio od rozwiazywanego ˛ problemu, funkcji oceny. W niniejszej pracy sposób wykorzystania biblioteki został zaprezentowany na przykładzie minimalizacji funkcji wielu zmiennych z ograniczeniami. Optymalizacja przeprowadzona została za pomoca˛ trzech metod. Dzi˛eki zastosowanym w bibliotece rozwiaza˛ niom, przejście pomi˛edzy poszczególnymi algorytmami wymagało jedynie niewielkich modyfikacji. Optymalizacja ostatnim z zaprezentowanych algorytmów (symulowane wyżarzanie) przyniosła oczekiwany efekt. Uzyskany wynik różnił si˛e od znanego na wst˛epie minimum globalnego zaledwie o 0.001%. Sposób implementacji biblioteki pozwala na dalsza˛ jej rozbudow˛e. Możliwe jest dodanie nowych szablonów algorytmów, takich jak na przykład algorytm poszukiwania z tabu (tabu search), wykorzystujacych ˛ te same elementy, które sa˛ stosowane w połaczeniu ˛ z instniejacycmi ˛ już szablonami. Literatura [1] Floudas C.A., Pardalos P.M. Recent Advantages in Global Optimization. Princeton Series in Computer Science, Princeton University Press, Princeton, NJ, 1992r. 9 [2] Sadiq M. Sait, Habib Youssef, Iterative Computer Algorithms with Applications in Engineering. Solving Combinatorial Optimization Problems, IEEE Computer Society, California 1999r [3] Z.Michalewicz, D.B.Fogel How to solve it: Modern Metaheuristics, Springer- Verlag, Berlin Heidelberg 2000r [4] Anna Bekus, Robert Bieda Optymalizacja kształtu podpory pod półk˛e hybrydowym algorytmem heurystycznym, Studencka Konferencja Informatyczna, Cz˛estochowa 2007r. 10