الگوریتم بلمن - فورد الگوریتم پیمایش گراف است که مسئلهٔ کوتاهترین مسیر از مبدأ واحد را برای گراف های وزن داری که وزن یال ها ممکن است منفی باشد حل می کند.
الگوریتم دَیکسترا مسئلهٔ مشابهی را در زمان اجرای کمتر حل می کند، اما در آن الگوریتم می بایست وزن یال ها اعداد نامنفی باشند. بنابراین در عمل الگوریتم بلمن - فورد فقط برای گراف هایی که یال با وزن منفی دارند استفاده می شود.
قبل از توضیح الگوریتم لازم به ذکر است که اگر گراف دوری با مجموع وزن منفی داشته باشد که از مبدأ قابل دست یابی باشد، مسئلهٔ کوتاهترین مسیر جوابی نخواهد داشت، چراکه با پیمایش آن دور به هر تعداد بار دلخواه، مسیرهایی با وزن کمتر و کمتر حاصل خواهد شد.
ساختار اصلی الگوریتم بلمن - فورد مشابه الگوریتم دایکسترا است. اجرای الگوریتم 1 - |V| دنبالهٔ d چنان تعریف می شود که برای هر رأس v ، مقدار d v در پایان مرحلهٔ i ام برابر وزن کوتاهترین گذر از مبدأ به v است با این شرط اضافه که تعداد یال های این گذر حداکثر i باشد. بنابراین در پایان مرحلهٔ ( 1 - |V| ) ام d v برابر وزن کوتاهترین مسیر از مبدأ به v خواهد بود ( در واقع چون دور با مجموع وزن منفی نداریم، کوتاهترین گذر با حداکثر 1 - |V| یال از مبدأ به v ، همان کوتاهترین مسیر از مبدأ به v در گراف خواهد بود ) .
اساس کار الگوریتم آزادسازی ( Relaxation ) همهٔ یال های گراف در هر مرحله است. آزادسازی یال ( u , v ) به این معناست که اگر d u + w e i g h t ( u , v ) < d v آنگاه قرار می دهیم d v = d u + w e i g h t ( u , v ) . با این اوصاف اگر آزادسازی همهٔ یال ها را برای بار |V|ام هم تکرار کنیم و بعد از این مرحله هم دنبالهٔ d تغییر کند، آنگاه می توان نتیجه گرفت که گراف دور منفی ای دارد که از مبدأ قابل دست یابی است. بنابراین الگوریتم بلمن - فورد توانایی تشخیص دور منفی را نیز دارد.
همانطور که گفته شد الگوریتم بلمن - فورد توانایی تشخیص دور منفی را نیز دارد. بنابراین الگوریتم را به گونه ای پیاده سازی می کنند که در صورت تشخیص دور منفی مثلاً مقدار بولی 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 d w = ∞ 8 d s = 0 9 for i = 1 to |V| - 1 do 10 for all edge ( u, v ) in E do 11 if d u + w e i g h t ( u , v ) < d v then 12 d v = d u + w e i g h t ( u , v ) 13 for all edge ( u, v ) in E do 14 if d u + w e i g h t ( u , v ) < d v then 15 return False 16 return True 17 end اثبات درستی می توان درستی را با استفاده از استقرای ریاضی نشان داد.
این نوشته برگرفته از سایت ویکی پدیا می باشد، اگر نادرست یا توهین آمیز است، لطفا گزارش دهید: گزارش تخلفالگوریتم دَیکسترا مسئلهٔ مشابهی را در زمان اجرای کمتر حل می کند، اما در آن الگوریتم می بایست وزن یال ها اعداد نامنفی باشند. بنابراین در عمل الگوریتم بلمن - فورد فقط برای گراف هایی که یال با وزن منفی دارند استفاده می شود.
قبل از توضیح الگوریتم لازم به ذکر است که اگر گراف دوری با مجموع وزن منفی داشته باشد که از مبدأ قابل دست یابی باشد، مسئلهٔ کوتاهترین مسیر جوابی نخواهد داشت، چراکه با پیمایش آن دور به هر تعداد بار دلخواه، مسیرهایی با وزن کمتر و کمتر حاصل خواهد شد.
ساختار اصلی الگوریتم بلمن - فورد مشابه الگوریتم دایکسترا است. اجرای الگوریتم 1 - |V| دنبالهٔ d چنان تعریف می شود که برای هر رأس v ، مقدار d v در پایان مرحلهٔ i ام برابر وزن کوتاهترین گذر از مبدأ به v است با این شرط اضافه که تعداد یال های این گذر حداکثر i باشد. بنابراین در پایان مرحلهٔ ( 1 - |V| ) ام d v برابر وزن کوتاهترین مسیر از مبدأ به v خواهد بود ( در واقع چون دور با مجموع وزن منفی نداریم، کوتاهترین گذر با حداکثر 1 - |V| یال از مبدأ به v ، همان کوتاهترین مسیر از مبدأ به v در گراف خواهد بود ) .
اساس کار الگوریتم آزادسازی ( Relaxation ) همهٔ یال های گراف در هر مرحله است. آزادسازی یال ( u , v ) به این معناست که اگر d u + w e i g h t ( u , v ) < d v آنگاه قرار می دهیم d v = d u + w e i g h t ( u , v ) . با این اوصاف اگر آزادسازی همهٔ یال ها را برای بار |V|ام هم تکرار کنیم و بعد از این مرحله هم دنبالهٔ d تغییر کند، آنگاه می توان نتیجه گرفت که گراف دور منفی ای دارد که از مبدأ قابل دست یابی است. بنابراین الگوریتم بلمن - فورد توانایی تشخیص دور منفی را نیز دارد.
همانطور که گفته شد الگوریتم بلمن - فورد توانایی تشخیص دور منفی را نیز دارد. بنابراین الگوریتم را به گونه ای پیاده سازی می کنند که در صورت تشخیص دور منفی مثلاً مقدار بولی 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 d w = ∞ 8 d s = 0 9 for i = 1 to |V| - 1 do 10 for all edge ( u, v ) in E do 11 if d u + w e i g h t ( u , v ) < d v then 12 d v = d u + w e i g h t ( u , v ) 13 for all edge ( u, v ) in E do 14 if d u + w e i g h t ( u , v ) < d v then 15 return False 16 return True 17 end اثبات درستی می توان درستی را با استفاده از استقرای ریاضی نشان داد.

wiki: الگوریتم بلمن–فورد