پروژه حرفه ای پیاده سازی الگوریتم دایکسترا با سی شارپ

- پروژه حرفه ای پیاده سازی الگوریتم دایکسترا با سی شارپ

پروژه حرفه ای پیاده سازی الگوریتم دایکسترا با سی شارپ

نحوه پیاده سازی الگوریتم در پروژه :

ابتدا برای ایجاد گره در مکان دلخواه دوبار کلیک کنید تا گره مورد نظر ایجاد شود سپس برای ایجاد یال یا همان ارتباط بین گره ها 

ابتدا روی گره اول کلیک کنید سپس روی گره دوم که میخواهید با آن ارتباط داشته باشد کلیک کنید تا بین آنها ارتباط ایجاد شود.

الگوریتم دایکسترا جیست؟؟

الگوریتم دایکسترا (دیکسترا، دایجسترا – Dijkstra) یک راهکار حریصانه برای یافتن کوتاهترین مسیر از مقصد ثابت (تک منبعبه سایر گره‌های گراف وزن‌دار استاین گراف می‌تواند معرف مسیرهای یک شهر و تقاطع‌های آن باشد که انبار شرکت در یک گره آن قرار داشته و هدف یافتن کوتاهترین مسیر به هر محل دیگر از این انبار استطبیعتا این الگوریتم در یافتن کوتاهترین مسیر بین دو گره مشخص نیز کاربرد داردتنها شرط لازم برای استفاده از این الگوریتم نامنفی بودن وزن یال‌های گراف است.

الگوریتم دایکسترا به صورت حریصانه عمل کرده و در تکرارهای متوالی طول کوتاهترین مسیر از مبدأ به یکی از گره‌های گراف را به دست می‌آورددر این الگوریتم از سه مجموعه استفاده می‌شود:

  • مجموعه‌ی DD که اعضای آن به صورت didi نمایش داده شده و بیانگر کوتاهترین مسیر از مبدأ به گره vivi در پایان هر تکرار الگوریتم استاین مقادیر در ابتدا به ازای تمامی گره‌ها برابر  است.
  • مجموعه‌ی PP که اعضای آن به صورت pipi نمایش داده شده و در پایان هر تکرار گره پیشین گره vivi را که گره مبدأ از طریق آن به این گره در کوتاهترین مسیر دسترسی دارد، مشخص می‌کنداین مقادیر در ابتدا برای هیچ‌کدام از گره‌ها تعریف شده نبوده و در تکرارهای آن مقداردهی می‌شوند.
  • مجموعه‌ی UU که اعضای آن گره‌های بررسی نشده در الگوریتم استاین مجموعه در ابتدا شامل تمامی گره‌های گراف است.

مراحل الگوریتم دایکسترا برای یافتن کوتاهترین مسیر از گره v0v0 به سایر گره‌ها به این شرح است:

1- گره v0v0 را به عنوان گره جاری از UU‌ حذف کرده، مقدار d0d0 را برابر صفر قرار داده و مراحل 2 تا 4 را تکرار کن.

2- به ازای هر یال خروجی از گره جاری (vjvjبه یک گره از مجموعه‌ی UU مانند vkvk مقدار dj+ejkdj+ejk را محاسبه کرده و اگر مقدار آن از dkdk کوچکتر باشد، جایگزین کنمنظور از ejkejk اندازه‌ی یال از گره vjvj به vkvk استدر صورت جایگزین شدن مقدار جدید، مقدار pkpk نیز برابر با گره vjvj می‌شود.

3- از مجموعه گره‌های عضو UU گره با کوچکترین dd (غیر را به عنوان گره جاری انتخاب و از مجموعه‌ی UU‌ حذف کن.

4- اگر UU‌ تهی است یا در مرحله‌ی 3 هیچ گرهی برای انتخاب به عنوان گره جاری جدید وجود نداشت، برو به مرحله‌ی 5.

5- مقدار didi برای گره vivi‌ کوتاهترین مسیر از مبدأ به آن گره را مشخص کرده است که از طریق گره pipi برای گره مبدأ در دسترس است.

به عنوان مثال برای یافتن کوتاهترین مسیر از گره شماره‌ی 1 به سایر گره‌ها در گراف زیر:

  

  

ابتدا گره‌های مجاور گره شماره‌ی 1 بررسی شده:

  

  

و گره با کمترین dd انتخاب می‌شود:

  

  

و به همین ترتیب الگوریتم تا انتخاب تمامی گره‌ها پیش می‌رود.

  

  

نکتهدر مرحله‌ی سوم اگر مقدار تمامی didiها برای گره‌های موجود در UU برابر  باشد، به معنای آن است که هیچ مسیری از مبدأ به آن گره‌ها وجود ندارد و اجرای الگوریتم با مشخص شدن مسیرهای ممکن به سایر گره‌ها خاتمه پیدا می‌کنددر مورد گراف‌های بدون جهت می‌توان نتیجه گرفت که چنین گرافی ناهمبند استاما در مورد گراف جهت‌دار لزوما اینگونه نیست و تنها می‌توان ادعا داشت که قویا همبند نیستبه عنوان مثال در گراف همبند زیر مسیری از گره 1 به گره 5 وجود ندارد:

 

  

  

نکته: خروجی الگوریتم دایکسترا یک درخت است که گره مبدأ در ریشه قرار دارداگر گراف همبند باشد، درخت تولید شده یک درخت پوشا خواهد بوددر مورد گراف‌های ناهمبند نیز درخت پوشای هر مؤلفه‌ی همبندی تولید می‌شوددر حالت کلی چنین درختی لزوما درخت پوشای کمینه نیستبه عنوان مثال در گراف زیر، درخت تولید شده توسط الگوریتم دایکسترا با شروع از گره شماره‌ی 1 نمی‌تواند یک درخت پوشای کمینه برای گراف باشد:

 

  

 

 

برای دانلود کلیک کنید