AlgoVerse

رنگ‌آمیزی حریصانه‌ی گراف

گره‌ها را به ترتیب درجه (ولش–پاول) برمی‌دارد و به هر کدام کوچک‌ترین رنگی را می‌دهد که همسایه‌هایش ندارند.

رنگ‌آمیزی گراف یعنی به هر گره رنگی بدهیم که هیچ دو همسایه‌ای هم‌رنگ نباشند (مثلاً زمان‌بندی امتحان‌ها: درس‌هایی که دانشجوی مشترک دارند هم‌زمان نباشند). پیدا کردن کمترین تعداد رنگ (عدد رنگی) NP-سخت است؛ روش حریصانه سریع است ولی همیشه بهینه نیست.

ادامه‌ی توضیح ↓
ورودی:
V=7 · E=10 · src=Aخروجی PDF

هفت گره؛ گره‌های پرهمسایه اول رنگ می‌شوند و سه رنگ کافی است.

  1. def greedy_coloring(graph, src):
  2. # Welsh-Powell: colour the nodes with the most neighbours first.
  3. order = sorted(graph, key=lambda v: -len(graph[v]))
  4. color = {v: 0 for v in graph}
  5. for u in order:
  6. used = set()
  7. for v, _ in graph[u]:
  8. if color[v] != 0:
  9. used.add(color[v])
  10. c = 1
  11. while c in used:
  12. c = c + 1
  13. color[u] = c
  14. return color

ناوردا: هیچ دو گره‌ی همسایه‌ای که هر دو رنگ گرفته‌اند هم‌رنگ نیستند.

شروع اجرا

ABCDEFG
  • گره‌ی جاری (u)
  • درخت کوتاه‌ترین مسیر تا اینجا
  • یالِ در حال بررسی

متغیرهای محلی

src'A'

نارنجی = در همین گام عوض شد

graph dict
  • 'A': [('B', 1), ('C', 1)]
  • 'B': [('A', 1), ('C', 1), ('D', 1)]
  • 'C': [('A', 1), ('B', 1), ('D', 1), ('E', 1)]
  • 'D': [('B', 1), ('C', 1), ('F', 1)]
  • 'E': [('C', 1), ('F', 1), ('G', 1)]
  • 'F': [('D', 1), ('E', 1), ('G', 1)]
  • 'G': [('E', 1), ('F', 1)]

Call stack

  1. greedy_coloring()خط 1
گام ۱ از ۱۱۳
خط سیاه = pick · خط نارنجی = گام کلیدیorder: 0/1 · pick: 0/7 · look: 0/20 · paint: 0/7 · next_color: 0/8

    رشد تعداد عملیات با اندازه‌ی ورودی

    میانگین ۵ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.

    • look
    • ورودی فعلی (n=7)
    050100481216202428n = تعداد گره‌هاlook
    نمایش به شکل جدول
    nlook
    410.4
    827.6
    1241.6
    1656
    2070.8
    2474.4
    2894.4
    توضیح

    ایده

    رنگ‌آمیزی گراف یعنی به هر گره رنگی بدهیم که هیچ دو همسایه‌ای هم‌رنگ نباشند (مثلاً زمان‌بندی امتحان‌ها: درس‌هایی که دانشجوی مشترک دارند هم‌زمان نباشند). پیدا کردن کمترین تعداد رنگ (عدد رنگی) NP-سخت است؛ روش حریصانه سریع است ولی همیشه بهینه نیست.

    الگوریتم

    1. گره‌ها را به ترتیب درجه، از زیاد به کم، مرتب کن (ولش–پاول).
    2. هر گره را به ترتیب بردار و کوچک‌ترین رنگی را بده که هیچ همسایه‌ی رنگ‌شده‌اش ندارد.

    حداکثر Δ + 1 رنگ مصرف می‌شود (Δ بیشترین درجه است).

    در trace به چه چیزی نگاه کنی

    • عدد کنار هر گره شماره‌ی رنگ آن است (۰ یعنی هنوز رنگ نشده).
    • ورودی «ترتیب بد» را ببین: گرافی که با دو رنگ رنگ می‌شود، با ترتیب بد چهار رنگ می‌گیرد.