AlgoVerse

مسیر بحرانی (شبکه‌ی AOE)

در شبکه‌ی فعالیت‌ها، زودترین و دیرترین زمان هر رویداد را حساب می‌کند و فعالیت‌هایی را پیدا می‌کند که هیچ تأخیری نمی‌پذیرند.

در شبکه‌ی AOE (فعالیت روی یال) هر یال یک فعالیت با مدت‌زمان است و هر گره یک رویداد («همه‌ی فعالیت‌های ورودی تمام شده‌اند»). سؤال‌ها:

ادامه‌ی توضیح ↓
ورودی:
V=9 · E=11 · src=0خروجی PDF

نه رویداد و یازده فعالیت؛ طول پروژه ۱۸ است و دو مسیر بحرانی از 0 به 8 هست.

  1. def critical_path(graph, src):
  2. # The project starts at time 0; src is ignored.
  3. seen = set()
  4. order = []
  5. for s in graph:
  6. if s not in seen:
  7. topo(graph, s, seen, order)
  8. order.reverse()
  9. early = {v: 0 for v in graph}
  10. for u in order:
  11. for v, w in graph[u]:
  12. if early[u] + w > early[v]:
  13. early[v] = early[u] + w
  14. finish = max(early.values())
  15. late = {v: finish for v in graph}
  16. for u in reversed(order):
  17. for v, w in graph[u]:
  18. if late[v] - w < late[u]:
  19. late[u] = late[v] - w
  20. critical = []
  21. for u in graph:
  22. for v, w in graph[u]:
  23. if early[u] + w == late[v]:
  24. critical.append((u, v, w))
  25. return finish, critical
  26. def topo(graph, u, seen, order):
  27. seen.add(u)
  28. for v, _ in graph[u]:
  29. if v not in seen:
  30. topo(graph, v, seen, order)
  31. order.append(u)

ناوردا: early[v] زودترین زمانی است که همه‌ی فعالیت‌های منتهی به v تمام شده‌اند و late[v] دیرترین زمانی است که v می‌تواند رخ دهد بی‌آنکه پروژه دیر شود.

شروع اجرا

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

درخت فراخوانی‌های بازگشتی

نارنجی پر = فراخوانی در حال اجرا · حاشیه‌ی نارنجی = هنوز روی پشته · خاکستری = تمام شده

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

src'0'

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

graph dict
  • '0': [('1', 6), ('2', 4), ('3', 5)]
  • '1': [('4', 1)]
  • '2': [('4', 1)]
  • '3': [('5', 2)]
  • '4': [('6', 9), ('7', 7)]
  • '5': [('7', 4)]
  • '6': [('8', 2)]
  • '7': [('8', 4)]
  • '8': []

Call stack

  1. critical_path()خط 1
گام ۱ از ۲۴۲
خط سیاه = length · خط نارنجی = گام کلیدیtopo_ready: 0/1 · forward: 0/11 · later: 0/10 · length: 0/1 · backward: 0/11 · sooner: 0/8 · slack: 0/11 · critical: 0/6

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

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

    • forward
    • backward
    • ورودی فعلی (n=9)
    0204060481216202428n = تعداد گره‌هاforwardbackward
    نمایش به شکل جدول
    nforwardbackward
    45.25.2
    813.813.8
    1220.820.8
    162828
    2035.435.4
    2437.237.2
    2847.247.2
    توضیح

    ایده

    در شبکه‌ی AOE (فعالیت روی یال) هر یال یک فعالیت با مدت‌زمان است و هر گره یک رویداد («همه‌ی فعالیت‌های ورودی تمام شده‌اند»). سؤال‌ها:

    • پروژه حداقل چقدر طول می‌کشد؟
    • کدام فعالیت‌ها بحرانی‌اند، یعنی هر تأخیرشان کل پروژه را عقب می‌اندازد؟

    دو گذر

    1. رو به جلو (به ترتیب توپولوژیک): early[v] = max(early[u] + w) روی یال‌های ورودی. بزرگ‌ترین early طول پروژه است. این همان طولانی‌ترین مسیر است.
    2. رو به عقب (به ترتیب برعکس): late[u] = min(late[v] − w) روی یال‌های خروجی.

    فعالیت u → v با مدت w اگر early[u] + w = late[v] باشد زمان شناوری ندارد و بحرانی است. مسیرهای بحرانی از یال‌های بحرانی ساخته می‌شوند.

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

    • عدد کنار هر گره early آن است؛ late در پنل حافظه است.
    • یال‌های رنگی فعالیت‌های بحرانی‌اند.