وبـســايــت هر بــــــــــــــــــــرنامه نــــــــــــــــــويس
| با عضويت رايگان در خبرنامه الگوريتم نويس مطالب و اخبار جديد سايت را هر هفته در ايميل خود دريافت كنيد. |
| الگوریتم بلمن-فورد |
| آموزش الگوريتم نويسي - آموزش سطح متوسط |
| نوشته شده توسط محمد حسين سعادت فر |
|
الگوریتم بلمن-فورد الگوریتم پیمایش گراف است که مسئلهٔ کوتاهترین مسیر از مبدأ واحد را برای گرافهای وزنداری که وزن یالها ممکن استن منفی باشد حل میکند. الگوریتم دَیکسترا مسئلهٔ مشابهی را در زمان اجرای کمتر حل میکند، اما در آن الگوریتم میبایست وزن یالها اعداد نامنفی باشند. بنابراین در عمل الگوریتم بلمن-فورد فقط برای گرافهایی که یال با وزن منفی دارند استفاده میشود. قبل از توضیح الگوریتم لازم به ذکر است که اگر گراف دوری با مجموع وزن منفی داشته باشد که از مبدأ قابل دستیابی باشد، مسئلهٔ کوتاهترین مسیر جوابی نخواهد داشت، چراکه با پیمایش آن دور به هر تعداد بار دلخواه، مسیرهایی با وزن کمتر و کمتر حاصل خواهد شد. چگونه کار میکند؟ساختار اصلی الگوریتم بلمن-فورد مشابه الگوریتم دایجکسترا است. اجرای الگوریتم 1-|V| دنبالهٔ d چنان تعریف میشود که برای هر رأس v، مقدار dv در پایان مرحلهٔ iام برابر وزن کوتاهترین گذر از مبدأ به v است با این شرط اضافه که تعداد یالهای این گذر حداکثر i باشد. بنابراین در پایان مرحلهٔ (1-|V|)ام dv برابر وزن کوتاهترین مسیر از مبدأ به v خواهد بود (در واقع چون دور با مجموع وزن منفی نداریم، کوتاهترین گذر با حداکثر 1-|V| یال از مبدأ به v، همان کوتاهترین مسیر از مبدأ به v در گراف خواهد بود). اساس کار الگوریتم آزادسازی (Relaxation) همهٔ یالهای گراف در هر مرحلهاست. آزادسازی یال (u,v) به این معناست که اگر du + weight(u,v) < dv آنگاه قرار میدهیم du + weight(u,v) = dv. با این اوصاف اگر آزادسازی همهٔ یالها را برای بار |V|ام هم تکرار کنیم و بعد از این مرحله هم دنبالهٔ d تغییر کند، آنگاه میتوان نتیجه گرفت که گراف دور منفیای دارد که از مبدأ قابل دستیابی است. بنابراین الگوریتم بلمن-فورد توانایی تشخیص دور منفی را نیز دارد. الگوریتمهمانطور که گفته شد الگوریتم بلمن-فورد توانایی تشخیص دور منفی را نیز دارد. بنابر این الگوریتم را به گونهای پیادهسازی میکنند که در صورت تشخیص دور منفی مثلاً مقدار بولی True برگرداند. پیادهسازیيک پیادهسازی نوعی به این شرح است: 1 Algorithm Bellman-Ford(G,s) پیچیدگی زمانیمشخص است که در 1-|V| مرحله، در هر مرحله |E| عملیات بر روی یالها انجام میشود. پس پیچیدگی زمانی الگوریتم بلمن-فورد (|O(|V|×|E است. منبع:ويكيپديا |