Раскрашивание графа так, чтобы ни один край не был монохромным
Правильное раскрашивание графа присваивает каждой вершине цвет таким образом, что никакие две вершины, соединенные ребром, не имеют одинаковый цвет. Наименьшее количество цветов, необходимое для этого конкретного графа, называется его хроматическим числом, обозначаемым χ(G). Раскрашивание графов может показаться абстрактным, но на самом деле это примитив планирования в disguise: вершины - экзамены, задачи или радиоканалы, ребра - конфликты, а правильное раскрашивание — это свободное от конфликтов назначение — составление графиков экзаменов, регистрация выделения в компиляторах и распределение частот беспроводной связи все являются раскрашиванием графов в разных одеждах.
Чому важко визначити точну χ(G)
Визначення того, чи можна розфарбувати граф з використанням k кольорів, є NP-неповним для будь-якого k ≥ 3 — не існує відомих алгоритмів, які б вирішували цю задачу за поліноміальний час для всіх графів, і більшість комп'ютерних вчених вважають, що таких алгоритмів не існує. Саме тому всі практичні інструменти розфарбування використовують евристику: порядок, у якому потрібно фарбувати вершини, та правило, яке визначає колір для кожної вершини, щоб швидко отримати гарну розфарбовування без будь-яких гарантій оптимальності.
Нежорстка забарвлення та важливість порядку
Найпростіший евристичний підхід відвідує вершини в певному порядку та призначає кожній найменше число, яке ще не використовується серед сусідніх вершин, які вже були зафарбовані:
для v у vertex_order: використовуйте кольори сусідів вершини v, color[v] = найменший колір, який не зустрічається в цьому наборі Це завжди завершується і завжди використовує щонайбільше Δ+1 кольорів, де Δ - максимальний ступінь графа — реальна гарантована межа. Але порядок, у якому ви його подаєте, має величезне значення: погано обраний порядок може змусити нежорстке правило використовувати набагато більше кольорів, ніж потрібно для графа, який міг би бути зафарбований з дуже невеликою кількістю кольорів, і добре обраний порядок може досягти оптимального результату. Саме тому нежорстка забарвлення само по собі не є одним алгоритмом; це родина алгоритмів, що відрізняється в цілому лише стратегією порядку.
for v in vertex_order: used = colors of v's already-colored neighbours color[v] = smallest color not in used
Welsh-Powell: порядок по степени
Уаллс-Пілл (1967) сортує вершини за спадним ступенем, перед тим як застосовується жадібний алгоритм, з міркувань, що високозв'язані вершини мають найбільше обмежень і повинні бути розфарбовані першими, тоді як доступно найбільше варіантів кольорів. Це просто, швидко та помітно краще за випадковий або будь-який інший порядок вершин у більшості реальних графів, хоча він все ще не має гарантії оптимальності в найгіршому випадку.
DSatur: порядок за сатійною мірою, динамічно
DSatur (Brélaz, 1979) покращує Welsh-Powell шляхом перерахунку порядку в процесі: на кожному кроці він фарбує неокрасене вершину з найвищою сатійною мірою — кількістьм різних кольорів, вже використаних серед її сусідів — розв’язуючи суперечки за допомогою ступеня у решті неокрашеного підграфа. Це адаптується до процесу фарбування, а не припускає фіксованого порядку наперед, і це доведено як оптимальне для кількох важливих видів графів, включаючи біпартітні графи. На загальних графах воно все ще не гарантовано оптимальне, але в практиці постійно перевершує статичні алгоритми жадібного та Welsh-Powell порядку, тому воно є стандартним евристичним методом у більшості сучасних інструментів для фарбування.
Як близько - то ближче
Для багатьох реальних графів, особливо рідких або структурованих, DSatur приземляється на справжнє числом або в межах одного кольору від нього. Найважчі випадки – це щільні, нерегулярні графи без очевидної структури, яку можна було б використати, де навіть DSatur може приземлитися на кілька кольорів вище χ(G) і лише точний пошук (розгалуження та обмеження, або цілочисельне програмування) може підтвердити справжнє мінімальне значення — за обчислювальною вартістю, яка швидко зростає з розміром графа. Це практикова компромісна угода, яку робить кожний евристичний метод фарбування: DSatur обмінюється невеликим проміжком вище оптимального для часу виконання, який масштабується до графів із мільйонами вершин, де точні розв’язувачі взагалі не можуть працювати.
Frequently asked questions
Яка різниця між хроматичним числом і кількістю кольорів, яке використовує евристичний алгоритм?
Хроматичне число chi(G) – це мінімальна справжня кількість кольорів, яку може використовувати будь-яке допустиме забарвлення. Знайти його точно є NP-повною задачею. Евристичні методи, такі як жадібний алгоритм, Welsh-Powell або DSatur, генерують допустиме забарвлення швидко, але не гарантують, що воно відповідає chi(G); вони можуть використовувати більше кольорів, ніж необхідно.
Чому порядок фарбування вершин має таку велику важливість?
Жадібне забарвлення зобов’язується вибрати колір для кожної вершини в момент її відвідування, використовуючи лише кольори вже наявних сусідніх вершин для прийняття рішення. Поганий порядок може «змусити» граф у певну ситуацію, використовуючи значно більше кольорів, ніж потрібно, тоді як хороший порядок – наприклад, динамічний алгоритм DSatur, заснований на оцінці насиченості – зберігає більше можливостей для пізніших вершин, які важко забарвити.
Чи гарантує DSatur знаходження оптимального забарвлення?
Ні, на загальних графах – жодного відомого поліноміального алгоритму не існує. DSatur доводиться оптимальним на деяких структурованих класах графів, таких як бінарні графи, і в практиці він дуже близько відповідає оптимальному результату для більшості реальних графів, але лише точний експоненційний пошук може гарантувати справжнє хроматичне число на будь-якому незв’язаному графі.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте Graph Coloring і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію Graph Coloring