Stałe: Przerwa czas pomiędzy sesjami komunikacyjnymi

Transkrypt

Stałe: Przerwa czas pomiędzy sesjami komunikacyjnymi
Stałe:
Przerwa  czas pomiędzy sesjami komunikacyjnymi
Zakończenie  tag do komunikatu o zakończeniu obliczeń
Token  tag do komunikatu z krążącym żetonem
Niesprawdzony_podproblem  tag do komunikatu z wierzchołkiem
Funkcje:
Bieżący_czas()  aktualny „wall clock time”
Usuń_min()  usuń podproblem z kolejki priorytetowej
Kolejny_element()  zwróć element z kolejki priorytetowej bez jego
usuwania
Inicjacja()  wyczyść kolejkę priorytetową
Wstaw()  wstawia podproblem do kolejki priorytetowej
Pusta()  zwraca true, jeśli kolejka priorytetowa jest pusta
Oszacowanie()  zwraca estymatę heurystyczną dla podproblemu
Zmienne:
kolor  kolor procesu (do wykrywania zakończenia obliczeń)
globalny_koszt  koszt najlepszego rozwiązania znalezionego do tej
pory
id  numer procesu
punkt_początkowy  problem dla którego rozpoczynamy obliczenia
ostatnia_komunikacja  czas zakończenia ostatnio odbytej sesji
komunikacyjnej
lokalny_koszt  koszt najlepszego rozwiązania znalezionego do tej pory
przez ten proces
lokalne_rozw  najlepsze rozwiązanie znalezione do tej pory przez
ten proces
licznik_komunikatów  liczba wysłanym minus liczba odebranych
q  kolejka priorytetowa
token  token przesyłany w pierścieniu procesów (do detekcji
zakończenia)
u  wierzchołek przestrzeni stanów (podproblem)
v  nowy wierzchołek potomny
Równoległy_BFS(minimalizacja):
Inicjacja(q)
if id = 0 then
Wstaw(q, punkt_początkowy)
token.koszt ← ∞
token.kolor ← BIAŁY
token.licznik ← 0
Wyślij token następnemu procesowi
endif
lokalny_koszt ← ∞
globalny_koszt ← ∞
ostatnia_komunikacja ← Bieżący_czas()
licznik_komunikatów ← 0
kolor ← BIAŁY
repeat
if Pusta(q) or (Bieżący_czas()–ostatnia_komunikacja > Przerwa) then
BFS_komunikacja()
ostatnia_komunikacja ← Bieżący_czas()
else if not Pusta(q) then
u ← Usuń_min(q)
if Oszacowanie(u) < lokalny_koszt then
kolor ← CZARNY
if u jest kompletnym rozwiązaniem then
if Oszacowanie(u) < globalny_koszt then
lokalne_rozw ← u
lokalny_koszt ← Oszacowanie(lokalne_rozw)
endif
else
for wszystkich synów v wierzchołka u do
if Oszacowanie(v) < globalny_koszt then
Wstaw(q, v)
endif
endfor
endif
endif
endif
forever
BFS_komunikacja():
if jest oczekujący komunikat z tagiem Zakończenie then
Zakończ poszukiwania
endif
if jest oczekujący komunikat z tagiem Token then
Odbierz komunikat zawierający token
if lokalny_koszt < token.koszt then
token.koszt ← lokalny_koszt
token.rozw ← lokalne_rozw
endif
if token.koszt ≤ Oszacowanie(Kolejny_element(q)) then
Inicjacja(q)
endif
globalny_koszt ← token.koszt
if id = 0 then
if (kolor = BIAŁY) end (token.kolor = BIAŁY) end
(token.licznik + licznik_komunikatów = 0) then
Rozgłoś komunikat z tagiem Zakończenie
Zakończ poszukiwania
else
token.kolor ← BIAŁY
token.licznik ← 0
endif
else
if kolor = CZARNY then
token.kolor ← CZARNY
endif
token.licznik ← token.licznik + licznik_komunikatów
endif
Prześlij token następnemu procesowi
kolor ← BIAŁY
endif
while są oczekujące komunikaty z tagiem Niesprawdzony_podproblem do
Odbierz komunikat z niesprawdzonym podproblemem u
licznik_komunikatów ← licznik_komunikatów – 1
kolor ← CZARNY
if Oszacowanie(u) < globalny_koszt then
Wstaw(q, u)
endif
endwhile
if w kolejce q jest więcej niż jeden podproblem then
Prześlij niesprawdzony podproblem do następnego procesu
licznik_komunikatów ← licznik_komunikatów + 1
kolor ← CZARNY
endif
return