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