الگوریتم یافتن کوتاهترین مسیر سریعتر
الگوریتم یافتن کوتاهترین مسیر سریع تر (SPFA) را میتوان روشی برای بهبود الگوریتم بلمن-فورد معرفی کرد که با استفاده از آن کوتاهترین مسیر تک منبع در یک گراف وزندار و جهتدار بدست میآید. تحقیقات قبلی بر این باورند که این الگوریتم به خوبی روی گراف خلوت تصادفی کار میکند یا به صورت دقیقتر، برای گرافهایی که یالهای وزن-منفی دارند پرکاربرد است. با این حال، بدترین حالت پیچیدگی در SPFA همانند الگوریتم بلمن-فورد دارای نقص است که برای جبران الگوریتم Dijkstra برای گرافهای با وزن لبههای غیر منفی ترجیح داده میشود. الگوریتم SPFA برای اولین بار توسط ادوارد اف مور در سال ۱۹۵۹ معرفی شد و به چاپ رسید که خود باعث کلیت بخشیدن به الگوریتم جستجوی اول سطح شد. مشابه همان الگوریتم در سال ۱۹۹۴ توسط فندینگ دوان کشف شد.
الگوریتم
در حالت کلی و در یک گراف وزن دار و جهت دار
در زیر شبه کد از الگوریتم SPFA نشان داده شدهاست. ادر این الگوریتم
procedure Shortest-Path-Faster-Algorithm(G, s) 1 for each vertex v ≠ s in V(G) 2 d(v) := ∞ 3 d(s) := 0 4 push s into Q 5 while Q is not empty do 6 u := poll Q 7 for each edge (u, v) in E(G) do 8 if d(u) + w(u, v) < d(v) then 9 d(v) := d(u) + w(u, v) 10 if v is not in Q then 11 push v into Q
الگوریتم همچنین میتواند برای یک گراف بدون جهت به کار گرفته شود که در این حالت هر یک از یالهای بدون جهت با دو یال جهتدار با جهتهای معکوس جایگزین میشود.
مدت اجرا
در بدترین حالت یا غیربهینهترین زمان اجرا، الگوریتم عملکردی مشابه الگوریتم استاندارد بلمن-فورد ارائه میدهد.
روشهای بهینهسازی
عملکرد الگوریتم به شدت وابسته به ترتیبی است که رأسهای داوطلب ورودی توسط نظم تعیین میشود که در آن رأیهای داوطلب برای استراحت دیگر رأسها استفاده میشود. در واقع، اگر
اولین برچسب کوچک ( SLF) (اولین بار توسط Dimitri Bertsekas مطرح شد، Vol 23، ۱۹۹۳، pp. 703-709). تغییری که این روش در الگوریتم ایجاد میکند را میتوان با تغییر در خط ۱۱ بیان کرد. در خط ۱۱، به جای تلاش و تأکید بر انتقال همیشگی راس
procedure Small-Label-First(G, Q) if d(back(Q)) < d(front(Q)) then u := pop back of Q push u into front of Q
تکنیک بزرگ برچسب (LLL) (اولین بار توسط Bertsekas, Guerriero و Musmanno مطرح شد). در این روش، بعد از خط ۱۱ صف به روزرسانی شده به طوری که عنصر اول کوچکتر از میانگین بوده و هر عنصر بزرگتر از میانگین به انتهای صف منتقل میشود. شبه کد زیر توصیف مناسبی از این تکنیک ارائه میدهد:
procedure Large-Label-Last(G, Q) x := average of d(v) for all v in Q while d(front(Q)) > x u := pop front of Q push u to back of Q
منابع
- ↑ درباره الگوریتم به اصطلاح SPFA
- ↑ «SPFA 算法». بایگانیشده از اصلی در ۲ ژوئیه ۲۰۱۲. دریافتشده در ۲۵ آوریل ۲۰۱۹.
- ↑ Edward F. Moore (Publisher Bell Telephone System. , 1959). «The Shortest Path Through a Maze Volume 3523 of Bell Telephone System. Technical publications. monograph».
- ↑ Duan, Fanding (1994), "关于最短路径的SPFA快速算法", 西南交通大学学报 [Journal of Southwest Jiaotong University], 29 (2): 207–212
- ↑ «Computer Science Department at Princeton University» (PDF). www.cs.princeton.edu. دریافتشده در ۲۰۱۹-۰۴-۱۳.
- ↑ http://codeforces.com/blog/entry/16221
- ↑ Chisman, James A. "Review of:"Linear Network Optimization", Dimitri P. Bertsekas, MIT Press, Cambridge, MA, Year: 1991". IIE Transactions. 24 (4): 112–112. doi:10.1080/07408179208964239. ISSN 0740-817X.
- ↑ Bertsekas, D. P.; Guerriero, F.; Musmanno, R. "1996-02,Parallel asynchronous label-correcting methods for shortest paths". Journal of Optimization Theory and Applications. 88 (2): 297–320. doi:10.1007/bf02192173. ISSN 0022-3239.