• Nie Znaleziono Wyników

Algorytm typu tabu

W dokumencie 1.1 Tezy pracy (Stron 142-146)

Zaproponowany algorytm oparty jest o klasyczną metodę tabu, przed-stawioną w rozdziale 2.4.5, dlatego zdecydowałem się na szczegółowy opis tylko poszczególnych elementów algorytmu.

6.5.1 Sąsiedztwo

Sąsiedztwo kolejności π ∈ Π wykorzystywane w algorytmie MTS bazuje na ruchach typu wstaw. Dla każdej operacji j ∈ Ω wyznaczamy ruch

vR(j) = arg minnCmax(v)) : v ∈ V B(π, j)o (6.61) zwany reprezentantem operacji j. Sąsiedztwo kolejności π ma postać

NM T S(π) =nπ(vR(j)): j ∈ Ωo. (6.62) Ogólnie w algorytmach typu tabu, stosuje się dwie metody wyboru ru-chu. Pierwsza z nich (i) dokładna, ale wolna polega na przejrzeniu całego sąsiedztwa i wybraniu najlepszego w sensie wartości funkcji ruchu nie ta-bu. Druga metoda (ii) znacznie szybsza, polega na przerwaniu przeglądania

rozwiązań z sąsiedztwa, w momencie znalezienia pewnego ruchu nie-tabu, który poprawia bieżącą wartość funkcji celu. W takim przypadku algo-rytm wybiera oczywiście pierwszy znaleziony taki ruch. W przypadku gdy nie istnieje żaden ruch nie-tabu, poprawiający bieżącą wartość funkcji celu pierwsza i druga metoda wyboru ruchu są sobie równoważne.

W proponowanym algorytmie stosujemy zarówno pierwszą jak i drugą metodę wyboru ruchu. Algorytm rozpoczyna pracę wybierając ruch pierw-szą z opisanych metod. Zmiana metody z pierwszej na drugą następuje gdy przez x iteracji algorytm nie poprawił globalnego najlepszego rozwią-zania14 (w prezentowanym algorytmie parametrowi x nadaliśmy wartość 5). Ponowny powrót algorytmu do dokładnej metody wyboru ruchu nastę-puje w momencie poprawienia globalnego najlepszego rozwiązania. Taka dynamiczna zmiana metody wyboru ruch istotnie przyśpiesza algorytm, co więcej interesujące nas obszary rozwiązań, badane są jednak dokładną metodą.

Badania numeryczne wykazały, że zastosowanie tak dynamicznie zmie-niającej się metody wyboru ruchu, znacznie poprawiają efektywność algo-rytmu w stosunku do algorytmów ograniczających się do stosowania tylko jednej z opisanych metod.

Ponadto w celu przyśpieszenia algorytmów, zdecydowałem się na wy-znaczanie tylko części reprezentantów w jednej iteracji. Dokładnie odbywa się to następujący sposób. Każdej operacji przypisałem pewną cechę z za-kresu od 1 do k. Liczność operacji posiadających daną cechę jest jednakowa (z dokładnością do 1). Liczba możliwych cech k jest dobierana na podstawie danych instancji k = 1 + bo/ξc, gdzie ξ jest pewnym współczynnikiem (do-branym eksperymentalnie na 50). W danym kroku iteracyjnym wyznaczani są tylko reprezentanci operacji posiadający cechę mod(iter, k) + 1, gdzie iter jest bieżącym numerem wykonywanej iteracji, zaś funkcja mod(iter, k) zwraca resztę z wartości iter podzielonej przez k. Opisana metoda przyśpie-sza pracę algorytmu k razy, poprzez k-krotne zmniejszenie liczby wyzna-czanych reprezentantów. Oczywiście jedna iteracja tak zmodyfikowanego sąsiedztwa jest znacznie mniej efektywna niż iteracja klasyczna, jednakże z czasowym kryterium stopu, zaproponowana metoda poprawia efektywność algorytmu.

6.5.2 Akceleratory wyboru reprezentanta

Podstawowa idea akceleratorów wyboru reprezentanta vjR, polega na takim wykorzystaniu własności problemu, aby nie wyznaczając wartości

14Globalne najlepsze rozwiązanie, jest to najlepsze w sensie wartości funkcji celu roz-wiązanie znalezione przez algorytm

Cmax(v)) dla wszystkich ruchów v ∈ V B(π, j), określić go dokładnie. W tym celu proponuję wykorzystać jednocześnie dwa następujące sposoby ak-celeracji.

Istotą pierwszego sposobu jest całkowita rezygnacja z wyznaczenia re-prezentanta vjR, jeżeli wartość Cmax(γ) jest nie mniejsza, niż wartość funkcji celu dla reprezentanta innej operacji, który nie jest tabu.

Drugi sposób polega na tym, że przed obliczeniem dla danego bazowego zestawu pozycji z ∈ ZZB(j) wartości funkcji celu Cmax(v)), v = (j, z), wyznaczamy wartość dolnego ograniczenia h(z). Jeżeli wartość h(z) jest nie mniejsza niż obliczona już wartość funkcji celu: (i) dla innego zestawu bazowego operacji j lub (ii) dla reprezentanta innej operacji, który nie jest tabu, to taki zestaw bazowy jest opuszczany bez wyliczania Cmaxv).

Przypominam, że złożoność obliczeniowa wyznaczenia h(z) dla operacji j wynosi O(|Mj|), podczas gdy dokładne obliczenie wartości funkcji celu ma złożoność O((Pi∈O|Mi|)2).

6.5.3 Postać listy tabu

Elementem listy tabu T , zgodnie z ideą zawartą w [77], są atrybuty kolejności i ruchu. Dokładniej, jest to łuk określający kolejność pomiędzy pewną parą czynności. Po wykonaniu ruchu v = (j, z) dla kolejności π, na listę T zapisywany jest zbiór AV(π, v) =Sl∈MjAVl(π, v) zawierający od 1 do |Mj| łuków, gdzie:

AVl(π, v) =

{((j, l), πl(zlπ,j + 1))}, zlπ,j < zl, {(πl(zlπ,j− 1), (j, l))}, zlπ,j > zl,

∅, zlπ,j = zl.

(6.63)

Przesunięcie czynności (j, l) „w prawo” (na pozycję o większym indek-sie) jest tabu wtedy i tylko wtedy, gdy na liście T znajduje się przynaj-mniej jeden łuk (j1, j2) taki, że j1 = πl(i) dla pewnego zlπ,j < i ¬ zl oraz j2 = (j, l). Symetrycznie przesunięcie „w lewo” jest tabu, gdy na liście T znajduje się przynajmniej jedna para operacji (j1, j2) taka, że j1 = (j, l) oraz j2 = πl(i) dla pewnego zl ¬ i < zπ,jl . W algorytmie zastosowaliśmy efektywne określanie statusu przesuwanej czynności zgodnie z ideą z [77];

obliczenia wstępne mają złożoność O(max{|M| · |O|, |T |}), zaś sprawdzenie czy przesunięcie pojedynczej czynności jest tabu ma złożoność O(1).

Generalnie przy ruchach zmieniających położenie kilku czynności, moż-na wyróżnić dwie definicje ruchu tabu. Pierwsza z nich, zwamoż-na słabym tabu, mówi że, ruch v = (j, z) uważamy za tabu, jeżeli przesunięcie każdej czyn-ności wchodzącej w skład operacji j jest tabu. Druga z nich zwana silnym

tabu, mówi że, ruch v = (j, z) uważamy za tabu, jeżeli przesunięcie przy-najmniej jednej czynności wchodzącej w skład operacji j jest tabu. W obu przypadkach czynności operacji j, które nie są przesuwane w wyniku ruchu v, nie są brane pod uwagę przy określaniu statusu ruchu.

Badania numeryczne przeprowadzone przez autora wykazały, przewagę algorytmów z zastosowaniem silnej definicji tabu. Dlatego w proponowa-nym algorytmie MTS stosujemy tą właśnie postać zabronienia. Ponadto przeprowadzone badania wykazały, że optymalna długość listy tabu przy zastosowaniu silnego zabronienia jest nieco dłuższa niż w przypadku zabro-nienia słabego.

6.5.4 Techniki wspierające

Algorytm MTS został wzbogacony o detektor cyklu oraz o metodę skoku powrotnego zapewniającą dywersyfikację poszukiwań, [77]. Idea tej meto-dy polega na tym, że jeżeli po upływie ustalonej liczby kroków MTS nie znajduje lepszego rozwiązania lub zostaje wykryty cykl, to algorytm po-wraca do ostatniego najlepszego rozwiązania, lista tabu jest przypo-wracana do stanu w jakim była po wykonaniu ruchu generującego ostatnie najlepsze rozwiązanie, zbiór reprezentantów zostaje pomniejszany o odpowiedni ruch i proces poszukiwań jest kontynuowany.

Dodatkową techniką podnoszącą efektywność algorytmu jest dostoso-wująca się dynamicznie długość listy tabu. Technika ta polega na tym, że algorytm po wykonaniu określonej liczby powrotów (skoków powrotnych) nie przynoszących efektów w postaci znalezienia lepszego rozwiązania, prze-chodzi w „tryb bez powrotów”. W trybie tym zamiast wykonywać skok powrotny, modyfikowana jest długość listy tabu. W przypadku wykonania ustalonej liczby kroków bez poprawy rozwiązania, długość listy tabu jest zmniejszana, lecz w przypadku wykrycia cyklu, długość ta jest zwiększana.

6.5.5 Rozwiązanie początkowe

Do generacji rozwiązania początkowego posłużyłem się algorytmem konstrukcyjnym MINS, który jest opisany w wcześniejszej sekcji. Zrezy-gnowałem z bardzo szybkich algorytmów konstrukcyjnych przedstawionych na początku tego rozdziału, ponieważ algorytm MINS generował uszere-gowania ponad 10% lepsze, niż najlepszy zaproponowany tam algorytm i o 3,6% lepsze, niż najlepsze spośród uszeregowań uzyskanych wszystkimi proponowanymi algorytmami permutacyjnymi.

W dokumencie 1.1 Tezy pracy (Stron 142-146)