مقدمه
برای درک راحتتر مقاله حل مسئله فروشنده دوره گرد با روش شاخه و حد، مروری کوتاه بر مسئله فروشنده دوره گرد خواهیم داشت. این مسئله امروزه به یکی از بنیادیترین مسائل مسیریابی و برنامه ریزی حمل و نقل کشورهای پیشرفته تبدیل شده است اما کاربرد آن فقط در صنعت حمل و نقل نیست. به خاطر دارم که در سال گذشته، یک دانشجوی سال آخر پزشکی عمومی که برای آزمون دکتری آماده میشد؛ به دفتر بنده، برای مشاوره تحصیلی مراجعه کرد و دغدغه اصلی او، داشتن برنامه زمانبندی شده تحصیلی در کنار برنامه تفریحی بود.
با توجه به اولویت رعایت زمانبندی، بنده تصمیم گرفتم از مسئله فروشنده دوره گرد برای برنامه تفریحات او استفاده کنم. به طوری که در طول روز فقط یک بار به محل موردنظر برود و کوتاهترین مسیر را انتخاب کند. به این ترتیب، هم در زمان و هم در هزینه این فرد صرفهجویی میشد و از برنامه تحصیلی خود نیز عقب نمیماند.
برای توضیحات بیشتر در مورد مسئله فروشنده دوره گرد، مقاله مفصلی در مورد تاریخچه نحوه پیدایش، صورت مسئله و انواع روشهای کدینگ مسئله فروشنده دوره گرد در سایت ما یعنی پی استور منتشر شده است که برای مشاهده آن میتوانید روی لینک زیر کلیک کرده و آن را مطالعه کنید
روش شاخه و حد چیست؟
روشهای ابتکاری زیادی برای حل این مسئله مطرح شدهاند. ممکن است از خود بپرسید که چرا روش شاخه و حد یا روش تحدید و انشعاب را برای حل این مسئله NP-Hard بررسی میکنیم؟ بله. تعجب نکنید! نام دیگر روش شاخه و حد، تحدید و انشعاب است و در سال ۱۹۶۰ با حمایت بریتیش پترولیوم، آن هم در هنگام تحقیقات پیشنهاد گردیده و از آن زمان، در بین برنامه نویسان و ریاضیدانان محبوب واقع شده است. باید بگویم که ما هم با تکیه به سه اصل، از الگوریتم ابتکاری برای حل مسئله فروشنده دوره گرد با روش شاخه و حد، استفاده کردهایم که در ادامه آن سه اصل را بیان میکنیم.
- در روش شاخه و حد، آزاد هستیم تا از هر نوع پیمایش سیستماتیک یا هر روش دیگر خلاقانه استفاده کنیم و در این زمینه هیچ محدودیتی وجود ندارد.
- روش شاخه و حد برای بهینه سازی بسیار مناسب بوده و به قول افراد کوچه و بازار، خوراک مسائل بهینه سازی است.
- این الگوریتم، راه حلهای موجود در فرآیند حل مسئله را بررسی کرده و شمارش میکند؛ با حذف نویزها و دادههای پرت و با روش تخمین مرزهای بالا و پایین یافتههای عددی موجود، پاسخ بهینه را ارائه میدهد.
حال با در نظر گرفتن توضیحات بالا و قبل از رفتن به سراغ حل مسئله، بیایید نگاهی اجمالی به انتخاب جواب بهینه در روش شاخه و حد داشته باشیم. گراف چهار راسی زیر را در نظر بگیرید. میخواهیم تمام حالتهای ممکن پیمایش این گراف را مشاهده کنیم.
برای پیمایش از راس ۱ و عبور از تمام رئوس راههای زیادی وجود دارد ولی روش بهینه این است که مسیری با حداقل هزینه را بیابیم. در تصویر زیر، تمام مسیرهایی که ممکن است شخص فروشنده دوره گرد طی کند؛ یعنی تمام حالتهای ممکن که امکان دارد اتفاق بیوفتند؛ آورده شده است.
در حل مسئله فروشنده دوره گرد با روش شاخه و حد، این الگوریتم با بررسی تمام احتمالات و برای به دست آوردن جواب بهینه، از پیمایش سطح یک استفاده کرده و هنگام ایجاد هر کدام از گرهها، هزینه پیمایش هر کدام را هم به طور همزمان محاسبه میکند. به این ترتیب، اگر هزینه هر کدام از گرهها بیشتر از حد بالا باشد؛ آن گره حذف میشود و میتوان نتیجه گرفت که الگوریتم پیشنهادی مقاله حل مسئله فروشنده دوره گرد با روش شاخه و حد، فقط گره های مفید را تولید خواهد نمود.
به این ترتیب، پاسخ بهینه را از میان تمام احتمالات، انتخاب کرده و در اختیار کاربر قرار میدهد و به راحتی نتیجه مطلوب یعنی حل مسئله در ۳ گام حاصل میشود.
در زیر پاورپوینت مسئله فروشنده دوره گرد قرار داده شده است که یکی از مسائل مهم و پرکاربرد در علوم کامپیوتر می باشد که به بررسی و حل یک مسئله ریاضی می پردازد. این مسئله به گونهای است که باید از هر مسیر با کمترین هزینه یکبارعبور کرد. این محصول در ۱۸ اسلاید در قالب PPT یا PPTX با قابلیت ویرایش برای ارائه کلاسی طراحی شده که آماده دانلود می باشد.در لینک زیر پاورپوینت مسئله فروشنده دوره گرد قرار داده شده است این پاورپوینت آماده در ۱۸ اسلاید در قالب ppt. یا pptx. با قابلیت ویرایش برای ارائه درسی آماده دانلود میباشد.
صورت مسئله روش شاخه و حد
با توجه به گراف زیر، مسئله به این صورت است که در مسیر پیمایش گراف، ما باید از هر راس، فقط یک بار عبور کنیم و درنهایت به نقطه شروع برگردیم. در گراف زیر، معمولا از راس شماره ۱ شروع به پیمایش میکنیم و با عبور از رئوس ۲، ۳، ۴ و ۵ دوباره به راس شماره ۱ برمیگردیم.
اولین قدم در پیمایش گراف، تشکیل ماتریس مجاورت و به دست آوردن اطلاعات ریاضی مسئله است. پس باتوجه به توضیحات گفته شده، ماتریس مجاورت موجود، به این ترتیب خواهدبود.
اکنون در ادامه مقاله حل مسئله فروشنده دوره گرد با روش شاخه و حد، با در دست داشتن ماتریس مجاورت و گراف فرضی، خواهید دید که روش شاخه و حد چگونه کوتاهترین مسیر را به شما پیشنهاد داده و مسئله را حل خواهد کرد. با ما همراه باشید.
حل مسئله فروشنده دوره گرد با روش شاخه و حد
در صورت مسئله حل مسئله فروشنده دوره گرد با روش شاخه و حد، با بررسی ماتریس مجاورت مشاهده میکنیم که ۱۰ حداقل مقدار در ردیف اول، ۲ حداقل مقدار در ردیف دوم، ۲ حداقل مقدار در ردیف سوم، ۳ حداقل مقدار در ردیف سوم است. ۳ حداقل مقدار در ردیف چهارم و ۴ حداقل مقدار در ردیف پنجم است. برای یافتن بهینهترین مسیر با کمترین هزینه گامهای زیر را دنبال کنید.
۱- گام اول – حداقل کردن مقادیر سطر ها
در قدم اول حل مسئله فروشنده دوره گرد با روش شاخه و حد، با در دست داشتن حداقل مقادیر، ماتریس را کاهش میدهیم یعنی حداقل مقدار را با تمام عناصر یک سطر کم کرده و این عمل را تا رسیدن به بهترین جواب ممکن ادامه میدهیم.
عملیات پیاده سازی تغییرات گفته شده در ردیف اول به شرح زیر خواهدبود.
When i = 0, j =0 M[0][0] = ∞-۱۰= ∞; When i = 0, j = 1 M[0][1] = 20 - 10 = 10; When i = 0, j = 2 M[0][2] = 30 - 10 = 20; When i = 0, j = 3 M[0][3] = 10 - 10 = 0; When i = 0, j = 4 M[0][4] = 11 - 10 = 1;
در ادامه تشریح مراحل کوچک کردن ماتریس، عملیات پیاده سازی تغییرات گفته شده در ردیف یا سطر دوم هم به شرح زیر است.
When i = 1, j =0 M[1][0] = 15-2= 13; When i = 1, j = 1 M[1][1] = ∞ - ۲= ∞; When i = 1, j = 2 M[1][2] = 16 - 2 = 14; When i = 1, j = 3 M[1][3] = 4 - 2 = 2; When i = 1, j = 4 M[1][4] = 2 - 2 = 0;
همانند ردیف دوم، عملیات پیاده سازی تغییرات در سطر سوم نیز به شرح زیر خواهدبود.
When i = 2, j =0 M[2][0] = 3-2= 1; When i = 2, j = 1 M[2][1] = 5 - 2= 3; when i = 2, j = 2 M[2][2] = ∞ - ۲ = ∞; When i = 2, j = 3 M[2][3] = 2 - 2 = 0; When i = 2, j = 4 M[2][4] = 4 - 2 = 2;
در مرحله چهارم یا مرحله ماقبل آخر، سطرهای تولید شده به شرح زیر به دست میآیند.
When i = 3, j =0 M[3][0] = 19-3= 16; When i = 3, j = 1 M[3][1] = 6 - 3= 3; When i = 3, j = 2 M[3][2] = 18 - 3 = 15; When i = 3, j = 3 M[3][3] = ∞ - ۳ = ∞; When i = 3, j = 4 M[3][4] = 3 - 3 = 0;
جا دارد یک “خسته نباشید” عرض کنم به شما کاربران عزیز و بگویم که دادههای سطر و ستون مرحله آخر را در زیر مشاهده خواهیدکرد.
When i = 4, j =0 M[4][0] = 16-4= 12; When i = 4, j = 1 M[4][1] = 4 - 4= 0; When i = 4, j = 2 M[4][2] = 7 - 4 = 3; When i = 4, j = 3 M[4][3] = 16 - 4 = 12; When i = 4, j = 4 M[4][4] = ∞ - ۴ = ∞;
و به این ترتیب ماتریس کاهش یافته نسبت به سطرها نهایی میشود اما این پایان الگوریتم نیست و در ادامه مراحل دیگری نیز خواهندبود که حتما باید انجام شوند تا ما را به بهترین راه حل برای حل مسئله فروشنده دوره گرد با روش شاخه و حد برسانند.
در این بخش فیلم آموزشی حل مسئله TSP با الگوریتم ژنتیک GA در متلب قرار داده شده است که یکی از الگوریتم های پرکاربرد و محبوب برای حل مسائل سخت می باشد. این الگوریتم به دلیل مفهوم آسان و قابل درک در زمینه های الگوریتم تکاملی پرکاربرد می باشد. برای دانلود این فیلم آموزشی میتوانید به لینک زیر مراجعه کنید.
۲- گام دوم – حداقل کردن مقادیر ستون ها
در قدم دوم حل مسئله فروشنده دوره گرد با روش شاخه و حد، ماتریس را نسبت به ستونها کاهش میدهیم. البته قبل از کاهش ماتریس، ابتدا همانند گام قبل، حداقل مقادیر ستونها را باید بیابیم. حداقل مقدار ستون اول ۱، حداقل مقدار ستون دوم ۰، حداقل مقدار ستون سوم ۳، حداقل مقدار ستون چهارم ۰ و حداقل مقدار ستون پنجم ۰ است. حال که حداقل مقادیر را در دست داریم؛ عملیات کاهش ماتریس را به ترتیب مراحل زیر، پیاده سازی میکنیم.
از آنجایی که حداقل مقدار ستون اول و سوم غیر صفر است، ما فقط ستون اول و سوم را ارزیابی خواهیم کرد. اگر ستون اول را درنظر گرفته و محاسبات کاهش را برروی آن انجام دهیم، دادههای زیر را خواهیم داشت.
When i = 0, j =0 M[0][0] = ∞-۱= ∞; When i = 1, j = 0 M[1][0] = 13 - 1= 12; When i = 2, j = 0 M[2][0] = 1 - 1 = 0; When i = 3, j = 0 M[3][0] = 16 - 1 = 15; When i = 4, j = 0 M[4][0] = 12 - 1 = 11;
حال با در نظر گرفتن ستون سوم نتایج زیر تولید میشوند.
When i = 0, j =2 M[0][2] = 20-3= 17; When i = 1, j = 2 M[1][2] = 13 - 1= 12; When i = 2, j = 2 M[2][2] = 1 - 1 = 0; When i = 3, j = 2 M[3][2] = 16 - 1 = 15; When i = 4, j = 2 M[4][2] = 12 - 1 = 11;
به این ترتیب ماتریس کاهش یافته کامل برای حل مسئله فروشنده دوره گرد با روش شاخه و حد یا حل مسئله در ۳ گام، تولید شد. در این ماتریس حداقل مقدار سطرها ۲۱ و حداقل مقدار ستونها ۴ است. به عبارت دیگر میتوان گفت که حداقل مقادیر کل برابر با ۲۵ میباشد. اکنون برای ساخت فضای حالت از راس شماره ۱، همان طور که در تصویر زیر نشان داده شده است؛ میتوان به هر راس دیگر رفت.
هزینه گره ۱ برابر با ۲۵ است و ۲۵ را به عنوان حد بالا درنظر گرفته میشود. در ابتدا کران بالا بینهایت خواهد بود. در تصویر زیر، دیگر هزینهها نیز محاسبه شدهاند.
حالا گره ۲ را در نظر گرفته و فرض کنید از گره ۱ به گره ۲ میرویم. سطر اول و ستون دوم در ماتریس زیر، بینهایت خواهندبود. نکته این که هنگامی که از گره ۱ به گره ۲ حرکت میکنیم؛ نمیتوانیم به گره ۱ برگردیم. بنابراین، باید ۲ به ۱ را به بینهایت، در ماتریس زیر ایجاد کنیم.
از آنجایی که در این ماتریس، هر سطر و ستون حاوی حداقل یک مقدار صفر است؛ میتوان گفت که ماتریس فوق، کاهش یافته میباشد. هزینه کاهش گره ۲ c(1, 2) + r + r` = 10 + 25 + 0 = 35 است. در ادامه حداقل مقدار هر ستون از ماتریس کاهش یافته جدید را خواهیم یافت. حداقل مقدار ستون اول ۱۱ و حداقل مقدار سه ستون دیگر ۰ است.
حالا گره ۳ را در نظر بگیرید. یعنی از گره ۱ به گره ۳ می رویم. اگر سطر اول و ستون سوم را به صورت بینهایت در ماتریس زیر ایجاد کنید؛ هزینه کاهش گره ۳، c(1, 3) + r + r` = 17 + 25 + 11 = 53 خواهد بود. به همین ترتیب هزینه گره ۴ هم c(1, 4) + r + r` = 0 + 25 + 0 = 25 و هزینه گره ۵ هم c(1, 5) + r + r` = 1 + 25 + 5 = 31 به دست میآید. مشخص است که کمترین هزینه مربوط به گره شماره ۴ میباشد پس در ادامه کمترین مقدار یعنی گره ۴ را برای عملیات کاهش مورد بررسی قرار میدهیم.
از رأس ۴، میتوانیم به راس ۲، ۳ یا ۵ برویم پس باید هزینه مسیر را از راس ۴ تا ۲ و راس ۴ به ۳ و راس ۴ تا ۵ را محاسبه کرده و برای درک بهتر از ماتریس گره ۴ برای یافتن هزینه گرهها استفاده کنیم. از آنجایی که تمام سطرها و ستون ها حداقل یک مقدار صفر دارند. بنابراین، می توان گفت که این ماتریس در حال حاضر کاهش یافته است و کاهش هزینه وجود نخواهد داشت. هزینه کاهش گره ۲ c(4, 2) + r + r` = 3 + 25 + 0 = 28 میباشد.
در ادامه مقاله حل مسئله فروشنده دوره گرد با روش شاخه و حد یا حل مسئله در ۳ گام، اکنون باید هزینه مسیر از راس ۴ تا راس ۳ را محاسبه کنیم. ردیف چهارم و ستون سوم مقدار بینهایت میگیرند. از آنجایی که نمی توانیم از راس ۳ به ۱ حرکت کنیم، بنابراین عدد ۳ به ۱ را مقدار بینهایت در ماتریس ایجاد کرده و بررسی خواهیم کرد که آیا هر سطر و ستون حداقل یک مقدار صفر دارد یا خیر؟! از آنجایی که ردیف سوم مقدار صفر ندارد؛ ابتدا حداقل مقدار ردیف سوم را پیدا میکنیم.
حداقل مقدار ردیف سوم ۲ است بنابراین از تمام عناصر ردیف سوم ۲ کم می کنیم. عناصر ردیف سوم در زیر آورده شده است.
A[2][0] = ∞ - ۲ = ∞; A[2][1] = 3 - 2 = 1; A[2][2] = ∞ - ۲ = ∞; A[2][3] = ∞ - ۲ = ∞; A[2][4] = 2 - 2 = 0;
ردیف سوم حاوی یک مقدار صفر است ولی متاسفانه ستون اول حاوی مقدار صفر نیست. حداقل مقدار ستون اول ۱۱ است پس از تمام عناصر ستون اول ۱۱ کم می کنیم. عناصر ستون اول به شرح زیر خواهد بود.
A[0][0] = ∞ - ۱۱ = ∞; A[1][0] = 12 - 11 = 1; A[2][0] = ∞ - ۱۱= ∞; A[3][0] = ∞ - ۱۱= ∞; A[4][0] = 11 - 11 = 0;
در ستون اول دارای یک مقدار صفر به دست آمد و حداقل هزینه کل ۱۳ است. هزینه کاهش گره ۳ c(4, 3) + r + r` = 12 + 25 + 13 = 50 محاسبه میگردد. حالا هزینه مسیر را از راس ۴ تا ۵ محاسبه میکنیم. ردیف چهارم و ستون پنجم را مقدار بینهایت کرده و از آنجایی که نمیتوانیم از گره ۵ به ۱ برگردیم؛ ماتریس را نیز به صورت ۱ به ۵ بررسی میکنیم. ردیف دوم حاوی مقدار صفر نیست پس حداقل مقدار ردیف دوم را پیدا میکنیم. حداقل مقدار ۱۱ است بنابراین از تمام عناصر ردیف دوم ۱۱ کم می کنیم. عناصر ردیف دوم عبارتند از:
A[1][0] = 12 - 11 = 1; A[1][1] = ∞ - ۱۱ = ∞; A[1][2] = 11 - 11 = 0; A[1][3] = ∞ - ۱۱ = ∞; A[1][4] = ∞ - ۱۱ = ∞;
ردیف دوم حاوی یک مقدار صفر است پس هزینه کاهش گره ۵ c(4, 5) + r + r` = 0 + 25 + 11 = 36 خواهدبود.
حالا اگر هزینه تمام گرهها را با هم مقایسه کنید؛ خواهید دید که هزینه حداقل ۲۵ است بنابراین نوبت به بررسی این گره رسیده است و گره با هزینه ۲۸ را می توان به گره های ۳ و ۵ گسترش داد.
اکنون باید هزینه هر دو گره یعنی ۳ و ۵ را محاسبه کنیم. ابتدا مسیر گره ۲ تا گره ۳ را در نظر میگیریم. ماتریس گره ۲ را در نظر بگیرید. سطر دوم و ستون سوم را مقدار بینهایت، مقداردهی میکنیم همچنین چون نمیتوانیم از گره ۳ به گره ۱ برگردیم؛ ۳ به ۱ را بینهایت مقداردهی کرده و بررسی میکنیم که آیا هر ردیفی دارای مقدار صفر است یا خیر؟! از آنجایی که ردیف سوم حاوی هیچ مقدار صفر نیست؛ حداقل مقدار ردیف سوم را خواهیم یافت. حداقل مقدار ردیف سوم ۲ است بنابراین از تمام عناصر ردیف سوم ۲ کم میکنیم.
عناصر ردیف سوم عبارتند از:
A[2][0] = ∞ - ۲ = ∞; A[2][1] = ∞ - ۲ = ∞; A[2][2] = ∞ - ۲ = ∞; A[2][3] = ∞ - ۲ = ∞; A[2][4] = 2 - 2 = 0;
از آنجایی که ردیف پنجم حاوی هیچ مقدار صفر نیست؛ حداقل مقدار ردیف پنجم را خواهیم یافت. حداقل مقدار ردیف پنجم ۱۱ است بنابراین از تمام عناصر ردیف پنجم آن را کم میکنیم.
A[4][0] = 11 - 11 = 0; A[4][1] = ∞ - ۱۱ = ∞; A[4][2] = ∞ - ۱۱ = ∞; A[4][3] = ∞ - ۱۱ = ∞; A[4][4] = ∞ - ۱۱ = ∞;
حداقل هزینه کل (۱۱ + ۲) برابر با ۱۳ است. هزینه کاهش گره ۳ c(2, 3) + r + r` = 11 + 28 + 13 = 52 خواهدبود.
مسیر گره ۲ تا گره ۵ را در نظر گرفته و سطر چهارم و ستون سوم را بینهایت مقداردهی کنید. از آنجایی که نمیتوانیم از گره ۵ به گره ۱ برگردیم؛ ۱ تا ۵ را نیز مانند قبل، بینهایت ایجاد کنید. از آنجایی که هر سطر و ستون حاوی یک مقدار صفر است؛ ماتریس فوق، ماتریس کاهش یافته میباشد. هزینه کاهش گره ۵ c(2, 5) + r + r` = 0 + 28 + 0 = 28 است. مشاهده میکنید که گره ۵ با هزینه ۲۸ حداقل است بنابراین گره ۵ را برای کاوش بیشتر انتخاب کرده و متوجه شدیم که گره ۵ را می توان بیشتر به گره ۳ گسترش داد.
در ادامه مبحث حل مسئله فروشنده دوره گرد با روش شاخه و حد یا حل مسئله در ۳ گام، از ماتریس گره ۵ با هزینه ۲۸ استفاده میکنیم. مسیر گره ۵ تا گره ۳ را در نظر بگیرید. ردیف پنجم و ستون سوم را بی نهایت مقداردهی کنید. از آنجایی که نمیتوانیم از گره ۳ به گره ۱ برگردیم، ۱ تا ۵ را نیز مانند ماتریس زیر بینهایت ایجاد کنید. از آنجایی که هر سطر و ستون حاوی یک مقدار صفر است. بنابراین، ماتریس فوق، ماتریس کاهش یافته بوده و هزینه کاهش گره ۳ c(5, 3) + r + r` = 0 + 28 + 0 = 28 است.
۳- گام سوم – بررسی نهایی و حذف گرههای اضافی
در انتهای مبحث حل مسئله در ۳ گام، تمام گرهها را پیمایش میکنیم تا بررسی نهایی صورت گیرد. در این پیمایش، مقدار کران بالا از بینهایت به ۲۸ به روز شده و بررسی میکنیم که آیا هر گره برگ مقداری کمتر از ۲۸ دارد یا خیر؟! از آنجایی که هیچ گره برگ حاوی مقدار کمتر از ۲۸ نیست؛ همه گره های برگ را از درخت دور میاندازیم و مسیر نهایی بر طبق آموزشهای مقاله حل مسئله فروشنده دوره گرد با روش شاخه و حد ۱->4->2->5->3 خواهد بود. به این ترتیب، کوتاهترین مسیر با کمترین هزینه انتخاب شده و مسئله فروشنده دوره گرد با الگوریتم ابتکاری پیشنهادی حل میشود.
حل مسئله فروشنده دوره گرد TSP با الگوریتم گرگ خاکستری GWO در متلب — کلیک کنید.
سخن آخر در مورد حل مسئله فروشنده دوره گرد با روش شاخه و حد
در پست حل مسئله فروشنده دوره گرد با روش شاخه و حد، ملاحظه کردید که روش شاخه و حد چگونه به آسانی ما را به جواب بهینه رساند؛ شما میتوانید با امتحان کردن انواع الگوریتمها و پیاده سازی هرکدام، در مورد چگونگی حل مسائل NP-Hard و بکارگیری آنها در زندگی شخصی تحقیق کرده و نتایج مطالعات خود را با دیگران به اشتراک بگذارید. درنظر داشته باشید که میتوانید انتقادات و پیشنهادات خود را هم با ما در میان گذاشته و همواره با ما در ارتباط باشید.