• Nie Znaleziono Wyników

4.2 Algorytmy lokalnych poszukiwań

4.2.1 Algorytmy poszukiwań z zabronieniami i poszukiwa-

Ogólny schemat algorytmu poszukiwań z zabronieniami (algorytmu ta-bu) został już przedstawiony w sekcji 2.2.1. Jednym z najlepszych algo-rytmów tego typu dla klasycznego problemu gniazdowego jest algorytm o nazwie T SAB, który został przedstawiony po raz pierwszy w pracy [70]. Algorytm ten, w stosunku do typowych algorytmów tabu, został wyposa-żony w dodatkowy mechanizm tzw. skoków powrotnych. Mechanizm ten umożliwia algorytmowi powrót do tych fragmentów przestrzeni rozwiązań, które wydają się szczególnie obiecujące. W skrócie, algorytm T SAB można opisać następująco. Algorytm rozpoczyna działanie z dowolną permutacją π ∈ Π (np. skonstruowaną przez algorytm typu wstaw) oraz po

zainicjo-waniu zmiennych π := π, C := Cmax(π), przechowujących najlepszą per-mutację i najlepszą wartość funkcji celu znalezioną w trakcie poszukiwań. Algorytm wymaga również ustalenia wartości parametrów maxiter, max t, maxδ i maxc. Parametr maxiter określa maksymalną liczbę iteracji bez po-prawy wartości funkcji celu, max t określa długość listy tabu, parametry maxδ i maxc są używane w detektorze cykli. Detektor cykli jest pewnym dodatkowym mechanizmem zabezpieczającym algorytm przed cyklicznym „odwiedzaniem” tych samych rozwiązań. W każdej iteracji algorytmu, przy użyciu procedury przeszukiwania sąsiedztwa NSP (od ang. neighborhood searching procedure), ze zbioru ruchów AV2(π) (nie zabronionych przez aktualną listę tabu) wybierany jest ruch v0, rozwiązanie sąsiednie π0 oraz modyfikowana jest lista tabu. Jeżeli w ciągu maxiter iteracji wartość zmien-nej C nie zostanie poprawiona, wykonywany jest skok powrotny do jedne-go z najlepszych rozwiązań odnalezionych w trakcie wcześniejszych iteracji algorytmu. Rozwiązania te są przechowywane na specjalnej liście L, prze-chowującej maksymalnie maxl elementów, gdzie maxl jest parametrem. Algorytm kończy swoje działanie, gdy lista L jest pusta.

W celu przybliżonego rozwiązania omawianego problemu gniazdowe-go z transportem, poniżej przedstawia się modyfikacje algniazdowe-gorytmu T SAB, które zachowują wszystkie zalety oryginalnego algorytmu. Autor tej pracy zdecydował się ograniczyć prezentację algorytmów jedynie do tych składni-ków, którymi należy zastąpić oryginalne składniki algorytmu T SAB w celu utworzenia wspomnianych modyfikacji.

Omawiane poniżej algorytmy w trakcie swojej pracy wykorzystują są-siedztwo AN3(π), π ∈ Π. Z wykorzystaniem notacji podobnej jak w pra-cy [70], opis algorytmów będzie rozpoczęty od koncepcji modyfikacji listy tabu. Lista tabu jest krótkoterminową pamięcią (zwykle o stałym rozmia-rze), która zabezpiecza algorytm przed cyklicznym powrotem do rozwiązań przeglądniętych we wcześniejszych iteracjach algorytmu. Bardziej precyzyj-nie, każdorazowo po zastosowaniu ruchu v = (x, y) ∈ AV3(π) do dowolnej permutacji π ∈ Π, na liście tabu zapamiętywany jest ruch odwrotny, noto-wany jako para v = (y, x). Każdy ruch na liście będzie nazynoto-wany ruchem zabronionym i nie może być zastosowany do żadnej permutacji.

Dana jest permutacja π ∈ Π. Każdy ruch (x, y) ∈ AV3(π) taki, że mx∈ Mp i mx∈ Mt będzie nazywany odpowiednio ruchem pro-dukcyjnym i transportowym. Zatem, zbiór ruchów AV3(π) można podzielić na dwa rozłączne podzbiory: zbiór ruchów produkcyjnych AVp3(π) = {(x, y) ∈ AV3(π) : mx ∈ Mp} oraz zbiór ruchów transportowych AV3

t (π) = {(x, y) ∈ AV3(π) : mx ∈ Mt}. Ponieważ moc zbioru AV3

t (π) jest zwykle znacznie większa od mocy zbioru AV3

pomy-słem wydaje się użycie dwóch list tabu. Pierwsza, lista tabu produkcyjna Tp= (Tp

1, T2p, . . . , Tmaxpp ), o stałej długości maxp, nie zawiera ruchów trans-portowych, tzn. na liście mogą być zapamiętane ruchy produkcyjne i ruchy sztuczne. ruchem sztucznym będzie nazywany ruch dv = (0, 0). Podobnie, lista tabu transportowa Tt = (Tt

1, T2t, . . . , Tmaxtt ), o stałej długości maxt, nie zawiera ruchów produkcyjnych. Dodanie ruchu v, v ∈ AV3

p(π), noto-wane jako Tp ⊕ v, polega na położeniu Tjp := Tp

j+1, j = 1, . . . , maxp − 1 oraz Tp

maxp:= v. W ten sam sposób dodawany jest ruch v, v ∈ AV3

t (π) do listy Tt. Czynność ta będzie notowana jako Tt⊕ v. Jeżeli któraś z list tabu będzie pusta, tzn. będzie zawierać jedynie ruchy sztuczne, fakt ten będzie oznaczany odpowiednio przez Tp= ∅ lub Tt= ∅.

Główna idea zastosowania listy tabu o stałej długości polega na tym, że ruch zabroniony znajduje się na liście stałą liczbę iteracji, równą długości listy tabu. Aby idea ta była zachowana w przypadku dwóch list, za każdym razem gdy do jednej z list dodawany jest ruch odwrotny, do drugiej listy oddawany jest ruch sztuczny. Bardziej precyzyjnie, jeżeli kładzie się Tp⊕ v, to kładzie się też Tt⊕ dv. Symetrycznie, jeżeli kładzie się Tt⊕ v, to kładzie się też Tp⊕ dv.

Ruch zabroniony jest perspektywiczny, jeżeli spełnia przyjęte kryterium aspiracji, tzn. jeżeli prowadzi do rozwiązania lepszego od najlepszego roz-wiązania znalezionego do tej pory w trakcie pojedynczego uruchomienia algorytmu. Zbiór wszystkich takich ruchów będzie oznaczany przez

ZP = {v ∈ AV3(π) ∩ T : Cmaxv) < C}, (4.9) gdzie T = Tp∪Tt, zaś Cjest wartością funkcji celu najlepszego znalezione-go rozwiązania. Ostatecznie, zbiór ruchów niezabronionych i zabronionych perspektywicznych można zapisać następująco:

ZR = (AV3(π) \ T ) ∪ ZP. (4.10) Najprostszy algorytm poszukiwań z zabronieniami powstaje poprzez iterowanie procedury przeszukiwania sąsiedztwa (P P S) przedstawionej na rys. 4.2. Jednakże, najlepsze rezultaty przynosi osadzenie procedury P P S w schemacie omawianego już algorytmu T SAB. Zatem, pierwszy z algo-rytmów rozwiązywania problemu omawianego w tym rozdziale, nazwany algorytmem T SABAGV, uzyskuje się poprzez zastąpienie oryginalnego są-siedztwa AN2(π) sąsiedztwem AN3(π) i oryginalnej procedury NSP pro-cedurą P P S. Algorytm T SABAGV wykorzystujący „klasyczne” sąsiedztwo AN2(π) będzie nazywany algorytmem T SAB0

AGV. Podobnie jak oryginalny algorytm, algorytmy T SABAGV, T SAB0

AGV wymagają określenia warto-ści parametrów maxiter, maxl, maxδ, maxc (omawianych na początku tej

Procedura rozpoczyna działanie z permutacją π, aktualną listą tabu T = Tp∪ Tt, niepustym zbiorem ruchów AV3(π) i najlepszą znale-zioną wartością funkcji celu C. Procedura zwraca ruch v0, zmodyfi-kowaną listę tabu T0 i nową permutację π0.

1. Dla każdego ruchu v ∈ AV3(π) wyznacz i zapamiętaj wartość Cmaxv) używając równania (3.40).

2. Wyznacz zbiór ZR, dany równaniem (4.10).

3. Jeżeli ZR 6= ∅, to wyznacz ruch v0 ∈ ZR taki, że Cmaxv0

) = min{Cmaxv) : v ∈ ZR} i idź do kroku 12.

4. Jeżeli |AV3(π)| = 1, to wybierz ruch v0 ∈ AV3(π) i idź do kroku 12.

5. Jeżeli Tp 6= ∅, to znajdź i = min{1 ¬ j ¬ maxp : Tjp 6= dv}. W przeciwnym przypadku idź do kroku 8.

6. Jeżeli i 6= maxp, to powtarzaj Tp := Tp⊕ Tp

maxp dopóki AV3 p(π) \ Tp= ∅ i idź do kroku 11. 7. Powtarzaj Tp := Tp⊕ dv dopóki AV3 p(π) \ Tp = ∅ i idź do kroku 11.

8. Znajdź i = min{1 ¬ j ¬ maxt : Tt

j 6= dv}.

9. Jeżeli i 6= maxt, to powtarzaj Tt := Tt⊕ Tt

maxt dopóki AVt3(π) \ Tt= ∅ i idź do kroku 11. 10. Powtarzaj Tt:= Tt⊕ dv dopóki AV3 t (π) \ Tt= ∅. 11. Wybierz ruch v0 ∈ AV3(π) \ {Tp∪ Tt}. 12. Jeżeli v0 ∈ AV3 p(π), to połóż Tp:= Tp⊕ v0 oraz Tt:= Tt⊕ dv. W przeciwnym przypadku połóż Tt:= Tt⊕ v0 oraz Tp := Tp⊕ dv. Połóż π0 := πv0

oraz T0 := Tp∪ Tt.

Rysunek 4.2: Schemat procedury P P S

sekcji); oryginalny parametr określający długość listy tabu został zastąpio-ny parametrami maxp i maxt, omawiazastąpio-nymi powyżej.

W celu przybliżonego rozwiązania problemu gniazdowego z transpor-tem, modyfikacjom został również poddany algorytm poszukiwania rozpro-szonego (ogólny schemat algorytmów tego typu został omówiony w

sek-cji 2.2.4) o nazwie i–T SAB. Oryginalnie, algorytm ten został zaprojekto-wany dla klasycznego problemu gniazdowego i opisany w pracy [72]. Poniżej zamieszczony jest krótki opis jego działania. Algorytm wykorzystuje pro-cedurę generowania nowych rozwiązań początkowych NIS (od ang. new initial solution generator ). Procedura rozpoczyna działanie z dwoma per-mutacjami α, β. Procedura zwraca permutację φ, której odległość w mierze tau Kendalla (omawianej w sekcji 3.4.1) od permutacji α i β wynosi od-powiednio h(α, β) · maxV % i h(α, β) · (100% − maxV %), gdzie maxV jest parametrem.

Algorytm i–T SAB jest algorytmem dwufazowym. W fazie wstępnej al-gorytm rozpoczyna działanie z dowolną permutacją początkową π0 ∈ Π. Przy użyciu algorytmu T SAB, później procedury NIS generowane jest maxE rozwiązań elitarnych, zapamiętywanych na liście, gdzie maxE jest parametrem. W każdej iteracji fazy zasadniczej z listy rozwiązań elitarnych wybierane jest rozwiązanie najlepsze π oraz – najbardziej od niego odda-lone w sensie miary tau Kendalla – rozwiązanie πd. Następnie, w efekcie użycia procedury NIS, później algorytmu T SAB, generowane jest rozwią-zanie π0, które zastępuje rozwiązanie πdna liście rozwiązań elitarnych. Algo-rytm i–T SAB kończy działanie, jeśli odległość pomiędzy rozwiązaniem π

i πdjest mniejsza niż maxD, gdzie maxD jest parametrem.

Modyfikacja algorytmu i–T SAB, nazwana algorytmem i–T SABAGV, polega na zastąpieniu algorytmu T SAB w fazie wstępnej oraz zasadni-czej odpowiednio algorytmem T SAB0

AGV i T SABAGV. Ponieważ czas pra-cy algorytmu i–T SABAGV silnie zależy od poszczególnych instancji pro-blemu, poza parametrami maxV , maxE, maxD stosuje się również para-metry maxR oraz maxT , stanowiące dodatkowe kryteria stopu. Pierwsze z kryteriów określa maksymalną liczbę wywołań algorytmów T SABAGV, T SABAGV0 bez poprawy najlepszego rozwiązania π, zaś drugie – maksy-malny czas pracy algorytmu i–T SABAGV.

Najbardziej czasochłonnym krokiem każdej iteracji wszystkich algoryt-mów jest przegląd sąsiedztwa dokonywany przez procedurę P P S. Dzię-ki zastosowaniu w niej własności 3.6-3.8 i twierdzenia 3.1, omawianych w sekcji 3.2.1, złożoność obliczeniowa procedury P P S (i tym samym po-szczególnych iteracji wszystkich algorytmów) wynosi O(|ANi(π)| · n log m), i ∈ {2, 3}, przy założeniu, że nk= m, k ∈ J, ol= n, l ∈ M, n ­ m.