الگوریتم ادموندز کارپ

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

الگوریتم ادموندز کارپ (به انگلیسی: Edmonds-Karp algorithm): در علوم کامپیوتر و نظریه گراف الگوریتمEdmonds_Karp پیاده سازی ای برای الگوریتم فورد–فالکرسون برای محاسبهٔ مسئله بیشینه جریان در شبکه شاره در زمان o(VE^2) است. این الگوریتم از الگوریتم ارسال-برچسب که در زمان o(v^3) انجام می‌شود سریع تر است. این الگوریتم اولین بار توسط دانشمند شوروی Yefim (Chaim) Dinic در سال ۱۹۷۰[۱] منتشر شد. و به طور مستقل توسط Jack Edmond و ریچارد کارپ در سال ۱۹۷۲[۲] با کاهش زمان الگوریتم قبلی به o(VE^2) انتشار یافته‌است.

الگوریتم[ویرایش]

در این اگوریتم می‌خواهیم بیشینه شاره را از مبدا s تا مقصد t پیدا کنیم این الگوریتم شبیه به الگوریتم الگوریتم فورد–فالکرسون است و تفاوتش این است که در این الگوریتم محدودیت الگوریتم فورد–فالکرسون بهبود می‌یابد چرا که که محاسبهٔ مسیر افزایشی را با breadth-first search پیاده سازی می‌کنیم. حال آنکه در الگوریتم فورد–فالکرسون dfs را اجرا می‌‌کردیم و به محدودیت زمانی بیشتری نیاز داشت. مسیر پیدا شده باید کوتاه ترین مسیر باشد که ظرفیت آماده‌ای دارد. که توسط جست و جوی breadth_first پیدا می‌شود. که ما اجازه می‌دهیم یال‌ها اندازهٔ واحدی داشته باشند. بیشترین شاره معادل با min cut است. ویژگی دیگر این الگوریتم این است که طول کوتاه ترین مسیر هر سری افزایش می‌یابد. اثبات را می‌توان ار منبع ذکر شده مشاهده کرد[۳] کاری که در این الگوریتم می‌کنیم این است که با bfs مسیر افزایشی را می‌یابیم و هر سری اگر که مسیر افزایشی(مسیری که یال پر ندارداین مسئله هم در کد bfs ای که در زیر آمده مشخص است) داشتیم کمترین ظرفیت را پیدا می‌کند و مینیمم ظرفیت را به جریان همهٔ یال هااضافه می‌کند و از آن کم می‌کند. به این صورت بیشینه شار بین مبدا و مقصد را پیدا می‌کند که معادل با min cut است. در کد زیر نحوهٔ انجام این الگوریتم نشان داده می‌شود. ورودی الگوریتم: ورودی این الگوریتم یک گراف است که یک راس مبدا s دارد و یک راس مقصد t و روی همهٔ یال‌ها ظرفیت هر یال نوشته شده‌است. خروجی الگوریتم: بیشترین جریان از s به t تا زمانی که مسیر افزایشی با ویژگی‌های بالا وجود دارد.

پیچیدگی الگوریتم[ویرایش]

زمان اجرای این الگوریتم o(VE^2) است. به این علت که هر مسیر در زمان اجرای o(E) بدست می‌آید. در هر زمان حداقل یکی از E یال سیر می‌شوند. که فاصله از یال سیر شده تا مبدا باید طولانی تر از آخرین باری باشد که سیر شده و این طول حداکثر برابر با V تعداد راس‌ها است.

پیاده سازی[ویرایش]

algorithm EdmondsKarp
     input:
         C[1..n, 1..n] (Capacity matrix)
         E[1..n, 1.. ?](Neighbour lists)
         s            (Source)
         t             (Sink)
    output:
         f            (Value of maximum flow)
         F             (A matrix giving a legal flow with the maximum value)
     f:= 0 (Initial flow is zero)
     F:= array(1..n, 1..n) ''(Residual capacity from u to v is C[u,v] - F[u,v])
     forever
         m, P:= BreadthFirstSearch(C, E, s, t, F)
         if m = ۰
            break
         f:= f + m
        (Backtrack search, and write flow)
         v:= t
        while v ≠ s
             u:= P[v]
             F[u,v]:= F[u,v] + m
             F[v,u]:= F[v,u] - m
             v:= u
    return (f, F)
 
 algorithm BreadthFirstSearch
     input:
         C, E, s, t, F
     output:
         M[t]         (Capacity of path found)
         P            (Parent table)
     P:=array(1..n)
    for u in 1..n
         P[u]:= -۱
     P[s]:= -2(make sure source is not rediscovered)
     M:=array(1..n)(Capacity of found path to node)
     M[s]:= ∞
     Q:= queue()
     Q.push(s)
     while Q.size() > ۰
         u:= Q.pop()
        for v in E[u]
            (If there is available capacity, and v is not seen before in search)
             if C[u,v] - F[u,v] > 0 and P[v] = -۱
                 P[v]:= u
                 M[v]:= min(M[u], C[u,v] - F[u,v])
                if v ≠ t
                     Q.push(v)
                else
                     'return M[t], P
    return 0, P

مثال[ویرایش]

در شکل زیر گرافی داده شده‌است که روی یال‌هایش ظرفیت هر یالی قرار دارد و جریان اولیهٔ گذر کرده از یال‌ها برابر با ۰ است می‌خواهیم جریان بیشینه که از A به G می‌رود را پیدا کنیم.

Edmonds-Karp flow example 0.svg

در شکل‌های زیر مراحل مختلف الگوریتم قرار گرفته و در هر شکل یک مسیر با ویژگی‌های ذکر شده با bfs پیدا شده و در زیر هر شکل مراحل مختلف مربوط به آن قرار گرفته. در زیر هر شکل ظرفیت باقیمانده محاسبه شده که برابر با (cf(u,v) = c(u,v) − f(u,v است و طبق الگوریتم بالا بین ظرفیت‌های باقی ماندهٔ یال‌های الگوریتم min گرفته می‌شود.

ظرفیت مسیر
شبکهٔ راس‌ها
min(c_f(A,D),c_f(D,E),c_f(E,G)) =

min(3-0,2-0,1-0) =
min(3,2,1) = ۱

A,D,E,G
Edmonds-Karp flow example 1.svg
min(c_f(A,D),c_f(D,F),c_f(F,G)) =

min(3-1,6-0,9-0) =
min(2,6,9) = ۲

A,D,F,G
Edmonds-Karp flow example 2.svg
min(c_f(A,B),c_f(B,C),c_f(C,D),c_f(D,F),c_f(F,G)) =

min(3-0,4-0,1-0,6-2,9-2) =
min(3,4,1,4,7) = ۱

A,B,C,D,F,G
Edmonds-Karp flow example 3.svg
min(c_f(A,B),c_f(B,C),c_f(C,E),c_f(E,D),c_f(D,F),c_f(F,G))=

min(3-1,4-1,2-0,0--1,6-3,9-3)=
min(2,3,2,1,3,6) = ۱

A,B,C,E,D,F,G
Edmonds-Karp flow example 4.svg

در آخر می‌خواهیم بیشینه جریان را پیدا کینم می‌دانیم که max flow برابر با Min cut است در این شکل یک min cut وجود دارد که راس‌ها را به راس‌های A B C E وو D F G تقسیم می‌کند با ظرفیت زیر: c(A,D)+c(C,D)+c(E,G)=3+1+1=۵

منابع[ویرایش]

  1. ^ E. A. Dinic (1970). "Algorithm for solution of a problem of maximum flow in a network with power estimation". Soviet Math. Doklady (Doklady) 11: 1277–1280
  2. ^ Jack Edmonds and Richard M. Karp (1972). "Theoretical improvements in algorithmic efficiency for network flow problems". Journal of the ACM 19 (2): 248–264. doi:10.1145/321694.321699.
  3. ^ Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein (2001). "26.2". Introduction to Algorithms (second ed.). MIT Press and McGraw–Hill. pp. 660–663. ISBN 0-262-53196-8.

پیوند به بیرون[ویرایش]