الگوریتم ادمون

از testwiki
نسخهٔ تاریخ ۱۸ مهٔ ۲۰۲۲، ساعت ۱۵:۱۸ توسط imported>ParvizPioneer (growthexperiments-addlink-summary-summary:2|0|0)
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)
پرش به ناوبری پرش به جستجو

در نظریه گراف، شاخه‌ای از ریاضیات، الگوریتم ادمون برای پیدا کردن انشعاب بهینهٔ بیشینه یا کمینه به کار می‌رود. زمانی که راس‌ها با یال‌های وزن دار و جهت دار به یکدیگر متصل شده باشند، دیگر نمی‌توانیم از الگوریتم درخت پوشای کمینه استفاده کنیم. بنابراین از الگوریتم انشعاب بهینه استفاده می‌کنیم که در سال ۱۹۶۷ توسط ادمون ارائه شد. برای یافتن مسیر با طول بیشینه، ابتدا یال‌ها بر اساس وزن شان مرتب می‌شوند. از بزرگترین یال شروع کرده و آن یال بین دو راس قرار می‌گیرد. بعد از آن به سراغ یال بزرگتر بعدی رفته و همین کار برای باقی یال‌ها نیز انجام می‌شود. اگر یالی باعث ایجاد دور در گراف شود، آن یال حذف می‌شود. برای پیدا کردن مسیر با طول کمینه نیز، یال‌ها از کوچک به بزرگ مرتب می‌شوند و کار با یال کوچکتر شروع می‌شود.

زمان اجرا

زمان اجرای این الگوریتم برابر با O(EV) است. پیاده‌سازی سریعتری از این الگوریتم، توسط روبرت تارجان ارائه شد که زمان اجرای آن برای یک گراف نا متراکم O(ElogV) و برای گراف متراکم برابر با O(V2) است. زمان اجرای آن به تندی الگوریتم پریم، برای یافتن درخت پوشای کمینهٔ بدون جهت است. بعدها در سال ۱۹۸۶، گابو، گلیل، اسپنسر، و تارجان پیاده‌سازی سریعتری را ارائه کردند که زمان اجرای آن برابر است با O(E+VlogV).

الگوریتم

تابعی مانند f را در نظر می‌گیریم که به عنوان ورودی، یک گراف وزن دار و جهت دار D و یک راس r به عنوان ریشه می‌گیرد و به عنوان خروجی، یک درخت فراگیر ریشه دار، با ریشهٔ r، به ما می‌دهد.الگو:سخ توصیف دقیق الگوریتم در ادامه آمده‌است. با گرفتن یک گراف وزن دار و جهت دار مانند D، با ریشهٔ r، به این صورت عمل می‌کنیم که در ابتدا، مجموعهٔ یال‌های موازی(یال‌هایی که بین دو راس یکسان قرار دارند و دارای یک جهت می‌باشند) را با یک یال که وزن آن برابر با مینیمم مقدار وزن آن یال‌های موازی است، جایگزین می‌کنیم.

توصیف

این الگوریتم یک توصیف شهودی بازگشتی دارد. تابعی مانند f را در نظر می‌گیریم. این تابع به عنوان ورودی، گراف وزن دار و جهت دار D، با یک راس r به عنوان ریشه را می‌گیرد و به عنوان خروجی، یک درخت فراگیر ریشه دار، با کمترین هزینه، می‌دهد.الگو:سخ توصیف دقیق الگوریتم در ادامه آمده‌است. با گرفتن یک گراف وزن دار و جهت دار D با ریشهٔ r، در ابتدا به این صورت عمل می‌کنیم که مجموعه‌ای از یال‌های موازی (یال‌های بین دو راس یکسان که دارای یک جهت هستند)را با یک یال که وزن آن برابر با مینیمم مقدار وزن آن یال‌های موازی است، جایگزین می‌کنیم.الگو:سخ حالا برای هر راس v به جز ریشه، یال ورودی به آن راس که دارای کمترین هزینه‌است را علامت(به‌طور قراردادی) می‌زنیم. راسی که در سر دیگر این یال قرار دارد را با π(v) مشخص می‌کنیم. اگر یال‌های علامت زده شده، تشکیل یک SRT(درخت فراگیر ریشه دار) را می‌دادند، یعنی تابع f(D) این SRT را مشخص کرده‌است. در غیر این صورت، مجموعه یال‌های علامت زده شده، تشکیل حداقل یک دور را می‌دهند. یکی از دورها را (به صورت دلخواه) C بنامید. حالا ما یک گراف وزن دار و جهت دار D که دارای ریشه r است را تعریف می‌کنیم. به این صورت که، راس‌های D مانند راس‌های D هستند نه C، به اضافه یک راس جدید که با vC مشخص می‌شود.الگو:سخ اگر (u,v) یالی در D باشد، با این شرط که uC، یال e را به صورت شرح داده شده در زیر به D اضافه می‌کنیم.الگو:سخ اگر vC، e=(u,vC) و w(e)=w(u,v)w(π(v),v)الگو:سخ در غیر این صورت، اگر vC، e=(u,v) و and w(e)=w(u,v).الگو:سخ ما هیچ یال دیگری را به D اضافه نمی‌کنیم.الگو:سخ ریشهٔ r در D، همان ریشهٔ r در D. است.الگو:سخ با صدا کردن تابع f(D)، یک SRT در D می‌یابیم. در نظر داشته باشید که در این SRT، یال ورودی (یکتا) به vC، یال (u,vC) است. این یال می‌تواند از زوج مرتب‌هایی مانند (u,v) با شرط uC و vC باشد. علامت (π(v),v) را بردارید و (u,v) را علامت بزنید. حالا مجموعه یال‌های علامت زده شده، یک SRT می‌سازند که ما می‌توانیم آن را مقدار تابع f(D) در نظر بگیریم.الگو:سخ دقت کنید که تابع f(D) به وسیله تابع f(D) تعریف شده‌است. و تابع D که یک گراف وزن دار، جهت دار و ریشه دار است، نسبت به گراف D به شدت تعداد راس‌هایش کمتر است و استفاده از f(D) برای یک گراف تک راس، کاری بیهوده‌است.

پیاده سازی

BV را یک مجموعه‌ای برای رئوس و BE را مجموعه‌ای برای یال‌ها در نظر بگیرید. اگر V را یک راس در نظر بگیرید و e هم یالی با بیشترین وزن مثبت و متصل به V باشد، Ci یک دور خواهد بود. G۰ = (V۰,E۰) گراف اصلی است و ui یک راس جانشین برای Ci است.الگو:سخ الگو:چپ‌چین

BVBE
i=0الگو:سخالگو:سخ
A:
if BV=Vi then goto B
for some vertex vBV and vVi {
   BVBV{v}
   find an edge e=(x,v) such that w(e) = max{ w(y,v)|(y,v)  Ei}
   if w(e) ≤ 0 then goto A
}
if BE{e} contains a circuit {
   i=i+1
   construct Gi by shrinking Ci to ui
   modify BE, BV and some edge weights
}
BEBEe
goto Aالگو:سخالگو:سخ
B:
while i ≠ 0 {
   reconstruct Gi1 and rename some edges in BE
   if ui was a root of an out-tree in BE {
       BEBE{e|eCi and ee0i}
   }else{
       BEBE{e|eCi and ee~i}
   }
   i=i-1
}
Maximum branching weight = eBEw(e)

الگو:پایان چپ‌چین

منابع

الگو:پانویس

  • Y. J. Chu and T. H. Liu, "On the Shortest Arborescence of a Directed Graph", Science Sinica, vol. 14, 1965, pp.  1396–1400.
  • J. Edmonds, “Optimum Branchings”, J. Res. Nat. Bur. Standards, vol. 71B, 1967, pp.  233–240.
  • R. E. Tarjan, "Finding Optimum Branchings", Networks, v.7, 1977, pp.  25–35.
  • P.M. Camerini, L. Fratta, and F. Maffioli, "A note on finding optimum branchings", Networks, v.9, 1979, pp.  309–312.
  • Alan Gibbons Algorithmic Graph Theory, Cambridge University press, 1985 الگو:ISBN
  • H. N. Gabow, Z. Galil, T. Spencer, and R. E. Tarjan, “Efficient algorithms for finding minimum spanning trees in undirected and directed graphs,” Combinatorica 6 (1986), 109-122.

پیوند به بیرون