الگوریتم بلمن–فورد
الگوریتم بلمن-فورد الگوریتم پیمایش گراف است که مسئلهٔ کوتاهترین مسیر از مبدأ واحد را برای گرافهای وزنداری که وزن یالها ممکن است منفی باشد حل میکند.
الگوریتم دَیکسترا مسئلهٔ مشابهی را در زمان اجرای کمتر حل میکند، اما در آن الگوریتم میبایست وزن یالها اعداد نامنفی باشند. بنابراین در عمل الگوریتم بلمن-فورد فقط برای گرافهایی که یال با وزن منفی دارند استفاده میشود.
قبل از توضیح الگوریتم لازم به ذکر است که اگر گراف دوری با مجموع وزن منفی داشته باشد که از مبدأ قابل دستیابی باشد، مسئلهٔ کوتاهترین مسیر جوابی نخواهد داشت، چراکه با پیمایش آن دور به هر تعداد بار دلخواه، مسیرهایی با وزن کمتر و کمتر حاصل خواهد شد.
محتویات |
[ویرایش] چگونه کار میکند؟
ساختار اصلی الگوریتم بلمن-فورد مشابه الگوریتم دایکسترا است. اجرای الگوریتم 1-|V| دنبالهٔ
چنان تعریف میشود که برای هر رأس
، مقدار
در پایان مرحلهٔ
ام برابر وزن کوتاهترین گذر از مبدأ به
است با این شرط اضافه که تعداد یالهای این گذر حداکثر
باشد. بنابراین در پایان مرحلهٔ (1-|V|)ام
برابر وزن کوتاهترین مسیر از مبدأ به
خواهد بود (در واقع چون دور با مجموع وزن منفی نداریم، کوتاهترین گذر با حداکثر 1-|V| یال از مبدأ به
، همان کوتاهترین مسیر از مبدأ به
در گراف خواهد بود).
اساس کار الگوریتم آزادسازی (Relaxation) همهٔ یالهای گراف در هر مرحلهاست. آزادسازی یال
به این معناست که اگر
آنگاه قرار میدهیم
. با این اوصاف اگر آزادسازی همهٔ یالها را برای بار |V|ام هم تکرار کنیم و بعد از این مرحله هم دنبالهٔ
تغییر کند، آنگاه میتوان نتیجه گرفت که گراف دور منفیای دارد که از مبدأ قابل دستیابی است. بنابراین الگوریتم بلمن-فورد توانایی تشخیص دور منفی را نیز دارد.
[ویرایش] الگوریتم
همانطور که گفته شد الگوریتم بلمن-فورد توانایی تشخیص دور منفی را نیز دارد. بنابر این الگوریتم را به گونهای پیادهسازی میکنند که در صورت تشخیص دور منفی مثلاً مقدار بولی True برگرداند.
[ویرایش] پیادهسازی
یک پیادهسازی نوعی به این شرح است:
1 Algorithm Bellman-Ford(G,s) 2 Input : G=(V,E), s(the source vertex) 3 Output : Sequence d and a boolean return value 4 begin 5 for all vertices w do 6=
8
= 0 9 for i = 1 to |V|-1 do 10 for all edge (u,v) in E do 11 if
then 12
=
13 for all edge (u,v) in E do 14 if
then 15 return False 16 return True 17 end
[ویرایش] پیچیدگی زمانی
مشخص است که در 1-|V| مرحله، در هر مرحله |E| عملیات بر روی یالها انجام میشود. پس (|O(|V|×|E پیچیدگی زمانی الگوریتم بلمن-فورد خواهد بود.
[ویرایش] کاربردها
[ویرایش] پیوند به بیرون
[ویرایش] مراجع
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7.
- Udi Manber. Introduction to Algorithms — A Creative Approach. MIT Press and Addison-Wesley, 1989. ISBN 0-201-12037-2.
- Donald E. Knuth. The Art Of Computer Programming Vol 1., Third Edition. Addison-Wesley, 1997. ISBN 0-201-89683-4.
- Douglas B. West. Introduction to Graph Theory, Second Edition. Prentice Hall, 2001. ISBN 0-13-014400-2.
=
8
= 0
9 for i = 1 to |V|-1 do
10 for all edge (u,v) in E do
11 if
13 for all edge (u,v) in E do
14 if