📘 Notatki do zaimplementowanych algorytmów
Algorytm: Hierholzer’s Algorithm
- Graf nieskierowany – każda krawędź łączy dwa wierzchołki w obie strony
- Graf spójny – istnieje ścieżka między każdą parą wierzchołków (nie jest rozłączny)
- Każdy wierzchołek ma parzysty stopień – tzn. liczba wychodzących i wchodzących krawędzi jest parzysta
Cykl Eulera to cykl, który przechodzi przez każdą krawędź grafu dokładnie raz i wraca do punktu początkowego.
Algorytm Hierholzera konstruuje częściowe cykle i scala je w jeden pełny cykl Eulera.
- Wybierz wierzchołek startowy
u - Buduj ścieżkę, dopóki są dostępne krawędzie, usuwając odwiedzone
- Jeśli cykl się zamknął, ale są nieużyte krawędzie:
- Wybierz nowy startowy wierzchołek z cyklu
- Rozpocznij nowy cykl i połącz z poprzednim
- Zakończ, gdy wszystkie krawędzie są odwiedzone
Algorytm: Algorytm ścieżek powiększających (Augmenting Path Algorithm, DFS)
- Graf dwudzielny – zbiór wierzchołków można podzielić na dwa rozłączne zbiory (V₁ i V₂), gdzie każda krawędź łączy wierzchołek z V₁ z wierzchołkiem z V₂
- Graf może być skierowany lub nieskierowany
- Krawędzie mogą być nieważone
Skojarzenie to zbiór krawędzi, które nie mają wspólnych wierzchołków.
Maksymalne skojarzenie to takie, którego nie da się już powiększyć bez konfliktu.
Algorytm znajduje tzw. ścieżki powiększające i używa ich do rozszerzania skojarzenia.
Ścieżka powiększająca względem aktualnego skojarzenia to ścieżka w grafie,
która zaczyna się i kończy w wolnych wierzchołkach,
i której krawędzie naprzemiennie należą i nie należą do aktualnego skojarzenia.
- Zainicjuj
match[v] = -1dla wszystkich wierzchołków - Dla każdego wolnego wierzchołka
uz lewej partycji:- Uruchom DFS w celu znalezienia ścieżki powiększającej
- Jeśli znaleziona, zaktualizuj skojarzenie
- Powtarzaj aż brak ścieżek powiększających
Zastosowanie: Minimalne skojarzenie kosztowe
- Graf dwudzielny, skierowany
- Liczba wierzchołków w obu partiach musi być taka sama (|V₁| = |V₂|)
- Wszystkie krawędzie mają nieujemne wagi
- Preferowany graf pełny – każdy wierzchołek z V₁ jest połączony z każdym z V₂
🔹 Graf pełny – zawiera krawędź między każdą możliwą parą wierzchołków z dwóch partycji
🔹 Graf skierowany – krawędzie mają kierunek (u → v), tzn. przypisania są jednostronne
Algorytm przypisuje elementy z V₁ do V₂ z minimalnym kosztem całkowitym.
Działa na bazie etykietowania wierzchołków i budowania tzw. grafu równości (Gl).
Przy braku pełnego skojarzenia – algorytm aktualizuje etykiety wierzchołków i kontynuuje szukanie.
- Inicjalizacja etykiet:
l(x) = max c(x, y)dla x ∈ V₁l(y) = 0dla y ∈ V₂
- Buduj graf równości
Gl(gdziel(x) + l(y) == c(x,y)) - Znajdź pełne skojarzenie w
Gl - Jeśli nie uda się:
- Buduj drzewo naprzemienne (S, T)
- Oblicz α = min
{ l(x) + l(y) - c(x,y) }dla x ∈ S, y ∉ T - Zaktualizuj etykiety:
l(x) -= α,l(y) += α
- Powtarzaj aż znajdziesz pełne skojarzenie
Algorytm: Branch & Bound (Metoda podziału i ograniczeń)
- Graf nieskierowany
- Graf spójny – każda para wierzchołków jest połączona ścieżką
- Wszystkie wagi są dodatnie
- Preferowany graf pełny – każda para miast ma bezpośrednie połączenie
Problem komiwojażera (TSP) polega na znalezieniu najkrótszego cyklu Hamiltona – trasy, która odwiedza wszystkie miasta dokładnie raz i wraca do punktu wyjścia.
Metoda podziału i ograniczeń:
- Przeszukuje tylko te części drzewa rozwiązań, które mają szansę na lepszy wynik
- Wykorzystuje lower bounds (dolne ograniczenia kosztu), aby odrzucać nieopłacalne ścieżki
- Zainicjuj
bestCost = ∞ - Wybierz wierzchołek startowy
- Rekurencyjnie buduj trasę:
- Dodaj sąsiada, jeśli nie był odwiedzony
- Oblicz koszt częściowej trasy
- Jeśli koszt ≥
bestCost, przytnij (nie kontynuuj) - W przeciwnym razie kontynuuj rekurencyjnie
- Gdy odwiedzono wszystkie wierzchołki i wrócono do startu:
- Jeśli koszt jest niższy niż
bestCost, zapisz nową najlepszą trasę
- Jeśli koszt jest niższy niż