
الگوریتم فروشنده دورهگرد (TSP): حل معمای سفر بهینه 🧳🗺️
مسئله فروشنده دورهگرد (Traveling Salesman Problem یا TSP) یک مسئله بهینهسازی کلاسیک در علوم کامپیوتر و ریاضیات است. هدف آن یافتن کوتاهترین مسیر برای بازدید از n شهر به گونهای است که:
-
هر شهر دقیقاً یک بار بازدید شود.
-
فروشنده به شهر شروع بازگردد.
این مسئله به ظاهر ساده، یکی از مشهورترین مسائل NP-Hard است که حل دقیق آن برای تعداد شهرهای زیاد، غیرممکن میشود.
📌 فرمولبندی ریاضی
فرض کنید:
-
n شهر با مختصات (xᵢ, yᵢ) داریم.
-
d(i,j) فاصله بین شهر i و j است.
-
هدف پیدا کردن جایگشت π = (π₁, π₂, ..., πₙ) است که کمینهسازی کند:
Total Distance = d(π₁, π₂) + d(π₂, π₃) + ... + d(πₙ, π₁)
⚙️ روشهای حل مسئله
۱. روشهای دقیق (Exact Algorithms)
روش | توضیح | محدودیت |
---|---|---|
Brute Force | بررسی تمام جایگشتهای ممکن | فقط تا n=10 عملی |
برنامهریزی پویا (Held-Karp) | استفاده از جدول برای ذخیره زیرمسئلهها | زمان اجرای O(n²2ⁿ) |
Branch and Bound | حذف شاخههای غیرامیدبخش با کرانگذاری | نیاز به حافظه زیاد |
۲. روشهای تقریبی (Heuristics)
روش | ایده اصلی | دقت | زمان اجرا |
---|---|---|---|
Nearest Neighbor | همیشه به نزدیکترین شهر بعدی برو | ~25% خطا | O(n²) |
Genetic Algorithm | تکامل جمعیتی از مسیرها با جهش و ترکیب | ~10% خطا | وابسته به پارامترها |
Ant Colony Optimization | شبیهسازی رفتار مورچهها در یافتن مسیر | ~15% خطا | O(n²ک) |
۳. روشهای تقریبی با تضمین (Approximation Algorithms)
-
الگوریتم کریستوفیدس (Christofides):
-
شرط: فاصلهها مثلثی باشند (Metric TSP).
-
ضریب تقریب: 1.5 برابر جواب بهینه.
-
مراحل:
-
ساخت درخت پوشای کمینه (MST).
-
پیدا کردن تطابق کمینه روی رأسهای فردالدرجه.
-
ساخت دور اویلری و حذف تکرارها.
-
-
📊 مثال عددی (۴ شهر)
فرض کنید شهرها به صورت زیر باشند:
شهر | مختصات (x,y) |
---|---|
A | (0,0) |
B | (1,2) |
C | (3,1) |
D | (4,3) |
محاسبه فاصلهها (فاصله اقلیدسی):
d(A,B) = √(1² + 2²) ≈ 2.24
d(B,C) = √(2² + 1²) ≈ 2.24
d(C,D) = √(1² + 2²) ≈ 2.24
d(D,A) = √(4² + 3²) = 5
d(A,C) = √(3² + 1²) ≈ 3.16
... (بقیه فواصل)
جواب بهینه: A → B → C → D → A با مجموع ≈ 2.24 + 2.24 + 2.24 + 5 = 11.72
💻 پیادهسازی در پایتون (الگوریتم Nearest Neighbor)
import numpy as np
def tsp_nearest_neighbor(dist_matrix):
n = len(dist_matrix)
unvisited = set(range(n))
path = [0]
unvisited.remove(0)
while unvisited:
current = path[-1]
nearest = min(unvisited, key=lambda x: dist_matrix[current][x])
path.append(nearest)
unvisited.remove(nearest)
path.append(0)
total_distance = sum(dist_matrix[path[i]][path[i+1]] for i in range(n))
return path, total_distance
# مثال: ماتریس فاصله 4x4
dist_matrix = [
[0, 2.24, 3.16, 5],
[2.24, 0, 2.24, 3.61],
[3.16, 2.24, 0, 2.24],
[5, 3.61, 2.24, 0]
]
path, distance = tsp_nearest_neighbor(dist_matrix)
print(f"مسیر: {path}، مسافت کل: {distance:.2f}")
🌐 کاربردهای واقعی
-
بهینهسازی تحویل کالا: شرکتهایی مانند Amazon و UPS از TSP برای کاهش مسافت و مصرف سوخت استفاده میکنند.
-
طراحی مدارهای الکترونیکی: کمینهسازی مسیر مته در بردهای مدار چاپی.
-
زیستشناسی مولکولی: تحلیل توالیهای DNA.
-
نجوم: برنامهریزی حرکت تلسکوپهای فضایی.
🔥 چالشها و محدودیتها
-
پیچیدگی زمانی: الگوریتمهای دقیق برای n>20 غیرعملی هستند.
-
عدم قطعیت: در نسخه دینامیک TSP، موقعیت شهرها ممکن است تغییر کند.
-
ابعاد بالا: در مسائل واقعی با هزاران شهر، نیاز به روشهای هوشمندانهتر است.
🔮 آینده تحقیق در TSP
-
کامپیوترهای کوانتومی: الگوریتمهایی مانند الگوریتم گروور (Grover) برای سرعت بخشیدن به جستجو.
-
یادگیری عمیق: مدلهای ترانسفورماتور برای پیشبینی مسیرهای بهینه.
-
بهینهسازی چندهدفه: توامندسازی عواملی مانند زمان، هزینه و آلایندگی.
📚 منابع پیشنهادی
-
کتاب: "The Traveling Salesman Problem: A Computational Study" توسط David L. Applegate
-
مقاله: "A 1.5-Approximation Algorithm for the Metric TSP" (Christofides, 1976)
-
دوره آنلاین: Coursera: Discrete Optimization
سوال تفکربرانگیز:
آیا میتوانید راهکاری برای حل TSP با ۱۰۰۰ شهر در زمان معقول پیشنهاد دهید؟ ایدههای خود را به اشتراک بگذارید!

نویسنده
سیدهادی موسوی
Tags: #علمی #تئوری #برنامه_نویسی #مقاله