تحلیل مساله کوتاهترین مسیر در گراف جهت دار
اگر یک گراف جهت دار باشد فرض کنید هر لبه با وزن مشخص می گردد و هزینه رفتن مستقیم از گره i به j را مشخص میسازد بزودی الگوریتم دایجسترا را که برای یافتن کوتاهترین مسیر در گراف با وزن های مثبت کاربرد دارد را بیان میکنیم . در این بخش و بخش بعدی دو مساله مرتبط با گراف را بیان خواهیم کرد .
1 ) گراف G را در نظر بگیرید ( وزن دار ) اگر این گراف دارای سیکل منفی باشد آنگاه یک سیکل جهت دار c مثل :
2) اگر گراف شامل هیچ دوره ( سیکل) منفی نباشد یافتن مسیری به نام p از گره آغازی s و گره پایانی t با کمترین هزینه : باید کمترین باشد به ازای هر مسیر از s به t . این مساله به هر دو نام مسیر با کمترین هزینه و کوتاهترین مسیر نامیده می شود .
طراحی و آنالیز الگوریتم :
اکنون با شروع تعریف مجدد الگوریتم دایجسترا که برای یافتن کوتاهترین مسیر در گراف هایی که وزن منفی ندارند شروع میکنیم .
در این گراف یک مسیر از s به t با ملاقات چندین دفعه دوره ( سیکل ) C بدست می آید .
کوتاهترین مسیر با شروع از گره آغازین s به هر نود v در یک گراف اصولا یک الگوریتم حریصانه است . ایده اصلی از یک مجموعه S تشکیل شده است که کوتاهترین مسیر از هر نود s به هر نود داخل مجموعه S شناخته شده است . در این شکل این الگوریتم را نشان می دهیم با شروع میکنیم . ما میدانیم کوتاهترین مسیر از s به s دارای هزینه صفر است زمانیکه هیچ لبه با وزن منفی نداشته باشیم . سپس این عنصر را به طور حریصانه به مجموعه اضافه میکنیم . در طی مرحله اول الگوریتم حریصانه ما کمترین هزینه لبه های گره s را تشکیل خواهیم داد . بعبارت دیگر یعنی : . یک نکته مهم با توجه به الگوریتم دایجسترا این است که کوتاهتری مسیر از s به v با یک یال نمایش داده می شود بنابراین بلافاصله نود v را به مجموعه S اضافه میکنیم . پس مسیر مسلما کوتاهترین مسیر به v است اگر هیچ یالی با هزینه منفی نداشته باشیم . مسیر های دیگر از s به v باید از یک یال خارج شده از s که حداقل هزینه بیشتری نسبت به لبه (s,v) داشته باشند شروع میشوند .
این ایده همواره صحیح نیست بویژه زمانی که دارای لبه های با وزن منفی هستیم .
یک ایده برنامه نویسی پویا :
یک روش برنامه نویسی پویا سعی بر حل این مساله برای یافتن کوتاهترین مسیر از s به t زمانیکه لبه با وزن منفی داشته باشیم اما سیکل ( دوره ) با طول منفی نداشته باشیم . زر مساله i می تواند کوتاهترین مسیر را تنها بوسیله استفاده از i گره اولیه پیدا کند . این ایده بلافاصله جواب نمی دهد بلکه با اعمال اندکی تغییرات جواب دلخواه را به ما میدهد . الگوریتم Bellman-Ford algorithm این الگوریتم را بوسیله برنامه نویسی پویا مطرح کرده و حل کرده اند .
(6.22)
اگر G دورهای منفی نداشته باشد؛ پس کوتاهترین مسیر ساده از S به t وجود دارد.(یعنی گره ها تکرار نمی شوند.) و از اینرو در نهایت n-1 یال دارد.
اثبات: تا زمانی که هر دور هیچ هزینه منفی نداشته باشد؛ کوتاهترین مسیر P از s به t با بیشترین تعداد از یالها هیچ راس v را مرور نمی کند. اگر P ؛ راس v را تکرار کند؛ ما می توانیم بخش مابین عبورهای متوالی از v را حذف کنیم. که این عمل هزینه کمینه و یال بیشینه را نتیجه می دهد.
اجازه دهید OPT(i,v) را برای تفکیک کمترین هزینه یک مسیر v-t با استفاده از بیشترین یال i مورد استفاده قرار دهیم. مطابق مساله (6.22) اصی ترین مشکل؛ محاسبه OPT(n-1.s) است.(ما می توانیم به جای ساخت الگوریتم؛ زیر مسائل مرتبط با کمینه هزینه مسیر s-v را با استفاده از بیشترین یالi جایگزین کنیم. این یک موازی طبیعی با الگوریتم دایجسترا شکل خواهد داد. اما در پروتوکل های مسیر یابی که بعدا شرح خواهیم داد؛ این یک روش طبیعی نخواهد بود.)
اکنون راه ساده ای را برای بیان OPT(i,v) با استفاده از زیرمسائل کوچکتر نیازداریم. ما دیداه طبیعی تری که نکات بسیاری حالات مختلف را در بر می گیرد را مرور خواهیم کرد؛ این مثال دیگری است از اصل "انتخابهای چند مسیره" که در الگوریتم مساله کوچکترین مربعات بخش شده خواهیم دید.
اجازه دهید؛ مسیر بهینه p OPT(i,v) را که در شکل 6.22 نمایش داده شده است را اثبات کنیم.
• اگر مسیر p در حداکثر i-1 مورد استفاده قرار گیرد؛ در اینصورت خواهیم داشت:
OPT(i, v) = OPT(i −1, v)
• اگر مسیر p ؛ i یال را مورد استفاده قرار دهد و اولین یال (v,w) باشد؛ در اینصورت:
OPT(i, v) = cvw + OPT(i − 1, w)
این موارد ما را به فرمول بازگشتی زیر می رساند:
(6.23) If i > 0 then
OPT(i, v) = min(OPT(i − 1, v), min
w∈V
(OPT(i − 1, w) + cvw)).
با استفاده از فرمول بازگشتی؛ ما الگوریتم برنامه نویسی پویای زیر را برای محاسبه هزینه OPT(n-1) خواهیم داشت:
Shortest-Path(G, s, t)
n = number of nodes in G
Array M[0 . . . n − 1, V]
Define M[0, t] = 0 and M[0, v] = ∞ for all other v ∈ V
For i = 1, . . . , n − 1
For v ∈ V in any order
Compute M[i, v] using the recurrence (6.23)
Endfor
Endfor
Return M[n − 1, s]
صحت متد بصورت مستقیم از استقراء (6.23) پیروی می کند. ما می توانیم زمان اجرای برنامه را محدود کنیم. جدول M؛ n به توان دو ورودی دارد؛ و هر ورودی می تواند O(n) زمان محاسبه داشته باشد؛ پس حداکثر n گره w ∈ V برای مرور کردن وجود دارد.
(6.24) متد "کوتاهترین مسیر" به درستی کمترین هزینه یک مسیر s-t را در گرافی که فاقد دور منفی است محاسبه می کندو و در زمان O(n3) اجرا می کند. داده جدول M که هزینه های معین زیربرنامه ها را دربردارد کوتاهترین مسیر را با استفاده از حداکثر i یال با O(in) بدست می دهد که این عمل با تراک بک در کوتاهترین زیربرنامه ها حاصل می شود.
بعنوان یک مثال؛ مرور گراف در شکل 6.22؛ جایی که هدف؛ یافتن کوتاهترین مسیر از هر گره به t است؛ جدول سمت راست آرایه M و ورودی های مطابق با هزینه های M[i,v] از الگوریتم را نمایش می دهد.
چنانچه ما اجازه دهیم مسیر از بیشترین شمار یالها استفاده کند؛ یک تک ردیف از جدول؛ مطابق با کوتاهترین مسیر از یک گره خاص به t است.
به عنوان مثال؛ کوتاهترین مسیر از گره d به t چهار بار به روز شده است؛ یعنی از d-t؛ به d-a-t به d-a-b-e-t و در نهایت به d-a-b-e-c-t انجام می شود.