Koloryzacja grafu tak, aby żaden brzeg nie był monochromatyczny
Odpowiednia koloryzacja grafu przypisuje każdej wierzchołce kolor tak, że żadne dwie wierzchołki połączone brzegiem nie mają tego samego koloru. Najmniejsza liczba kolorów, która to umożliwia dla danego grafu, to jego liczba chromatyczna, oznaczana χ(G). Koloryzacja grafów wydaje się abstrakcyjna, ale jest w rzeczywistości podstawową operacją planowania: wierzchołki to egzaminy, zadania lub kanały radiowe, brzegami są konflikty, a odpowiednia koloryzacja to bezkonfliktowe przypisanie - harmonogramowanie egzaminów, alokacja rejestrów w kompilatorach i przydział częstotliwości bezprzewodowych jest wszystkim koloryzacją grafów w różnych strojach.
Dlaczego znalezienie χ(G) dokładnie jest trudne
Decydowanie, czy graf może być skolorowany z k kolorami, to problem NP-złożony dla każdego k ≥ 3 – nie istnieje znany algorytm, który rozwiązuje go w czasie wielomianowym dla wszystkich grafów, a większość informatyków uważa, że takiego algorytmu nie ma. Dlatego też każde praktyczne narzędzie do kolorowania używa heurystyki: kolejności punktów wierzchołowych do pokolorowania oraz reguły, która kolor nadać, które generuje dobre kolorowanie szybko bez jakiejkolwiek gwarancji optymalności.
Złoty podział i dlaczego kolejność ma znaczenie
Najprostsza heurystyka odwiedza wierzchołki w jakiejś kolejności i przypisuje każdemu najmniejszy numer kolor nie używany przez sąsiednie, już pokolorowane wierzchołki:
dla v w kolejności_wierzchołków: zastosowane = kolory sąsiednich wierzchołków pokolorowanych przez v color[v] = najmniejszy kolor nie występujący w zastosowanych To zawsze kończy się i używa maksymalnie Δ+1 kolorów, gdzie Δ jest największą liczbą stopni grafu – gwarantowany prawdziwy limit. Jednak kolejność podawana ma ogromne znaczenie: źle dobrana kolejność może zmusić regułę greedy do użycia znacznie więcej kolorów niż potrzeba w grafie, który mógłby być pokolorowany z bardzo niewielką liczbą kolorów, a dobrze dobrana kolejność może osiągnąć optimum. Dlatego złoty podział sam w sobie nie jest jednym algorytmem, to rodzina algorytmów rozróżniona całkowicie ze względu na strategię kolejności.
for v in vertex_order: used = colors of v's already-colored neighbours color[v] = smallest color not in used
Welsh-Powell: kolejność według stopnia
Heurystyka Welsh-Powella (1967) sortuje wierzchołki według malejącego stopnia przed uruchomieniem algorytmu greedy, z założenia, że wierzchołki o wysokiej gęstości połączeń mają najwięcej ograniczeń i powinny być kolorowane jako pierwsze, a dostępnych jest najmniej możliwości wyboru koloru. Jest prosta, szybka i zauważalnie lepsza niż losowa lub arbitralna kolejność wierzchołków na większości rzeczywistych grafów, choć nadal nie gwarantuje jej optymalności w najgorszym przypadku.
DSatur: sortowanie według nasycenia, dynamicznie
DSatur (Brélaz, 1979) ulepsza sortowanie zaproponowane przez Welsh-Powella poprzez ponowne obliczanie kolejności w trakcie procesu. W każdym kroku koloruje się nieobarwiony wierzchołek o najwyższym stopniu nasycenia – czyli z uwzględnieniem liczby użytych już odrębnych kolorów wśród jego sąsiadów – a w przypadku remisu, decyduje kolejność według stopnia. Adaptuje się to do bieżącego procesu barwienia, zamiast narzucać stały porządek z góry, i jest udowodniona jego optymalność dla wielu ważnych rodzin grafów, w tym grafów dwuróżnicowych. Na ogólnych grafach nie gwarantuje optymalności, ale w praktyce konsekwentnie przewyższa statyczne algorytmy greedy i Welsh-Powella, dlatego jest domyślnym heurystyką w większości współczesnych narzędzi do barwienia.
Jak blisko jest blisko na tyle?
Dla wielu rzeczywistych grafów, zwłaszcza tych rzadkich lub strukturalnych, DSatur trafia na prawdziwy współczynnik kolorowania lub znajduje się w odległości jednego koloru od niego. Najtrudniejsze przypadki to gęste, nieregularne grafy bez oczywistej struktury do wykorzystania, gdzie nawet DSatur może popaść w kilka kolorów powyżej χ(G) i tylko dokładne przeszukiwanie (metoda podziałowo-zyskowna lub programowanie całkowite) może potwierdzić minimalną wartość – co wiąże się z kosztem obliczeniowym rosnącym wykładniczo wraz ze wzrostem rozmiaru grafu. Jest to praktyczny kompromis, jaki czyni każde heurystyka kolorowania: DSatur oferuje niewielki, zwykle niewidoczny próg powyżej optimum, w zamian za czas działania skalujący się do grafów z milionami wierzchołków, gdzie dokładne rozwiązania nie są możliwe.
Frequently asked questions
Jakie jest różnice między liczbą chromatyczną a liczbą kolorów używaną przez heurystykę?
Liczba chromatyczna chi(G) to minimalna, prawdziwa liczba kolorów, jaką może użyć dowolne poprawne malowanie — jej dokładne znalezienie jest problemem NP-kompletnym. Heurystyka, taka jak greedy, Welsh-Powell lub DSatur, generuje poprawne malowanie szybko, ale nie gwarantuje, że będzie ono zgodne z chi(G); może używać więcej kolorów niż koniecznie.
Dlaczego kolejność kolorowania wierzchołków ma tak duże znaczenie?
Malowanie greedy angażuje się w wybór koloru dla każdego wierzchołka natychmiast po jego odwiedzeniu, wykorzystując tylko już narysowane sąsiednie wierzchołki do podjęcia decyzji. Zła kolejność może "zablokować" graf, używając więcej kolorów niż potrzeba, podczas gdy dobra kolejność — jak dynamiczna kolejność oparta na saturacji DSatur — utrzymuje więcej możliwości dla trudniejszych do narysowania wierzchołków.
Czy DSatur gwarantuje znalezienie optymalnego malowania?
Nie, na ogólnych grafach — nie istnieje znany algorytm o złożoności wielomianowej. DSatur jest udowodniony jako optymalny dla niektórych struktur grafowych, takich jak grafy dwusłuzbowe, a w praktyce działa bardzo blisko optymalnie na większości rzeczywistych grafów, ale tylko dokładne wyszukiwanie o złożoności wykładniczej może zagwarantować prawdziwą liczbę chromatyczną na dowolnym grafie.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Graph Coloring i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację Graph Coloring