Backtracking چیست؟
Backtracking: کاوش سیستماتیک همه راهحلها با انتخاب، کاوش و برگشت — الگوی سهگامی و هرس شاخهها
ایده اصلی
Backtracking (بازگشت به عقب) یعنی: همه گزینهها را سیستماتیک امتحان کن؛ هر جا راه بنبست شد، به عقب برگرد و گزینه بعدی را امتحان کن. مثل حل ماز با دست: تا ته میروی، بنبست که شد برمیگردی و راه دیگر!
الگوی سهگامی
def backtrack(مسیر, انتخابها):
if شرط_پایان:
ثبت جواب
return
for انتخاب in انتخابهای_معتبر:
۱) انتخاب را اعمال کن (به مسیر اضافه)
۲) backtrack(مسیر جدید, انتخابهای جدید)
۳) انتخاب را برگردان (Undo)!
مرحله ۳ (Undo) قلب Backtracking است — بدون آن، مسیرها آلوده میشوند!
درخت تصمیم
Backtracking = پیمایش درخت تصمیم: هر سطح یک انتخاب، هر مسیر یک راهحل کاندید. برگشت = بالا رفتن از شاخه بنبست.
هرس (Pruning) — کلید کارایی
بهجای کاوش کامل درخت، شاخههای بیآینده را زود حذف کن:
- «این انتخاب، شرط مسئله را نقض میکند؟» ← نرو!
- «حتی ادامه این مسیر، بهتر از بهترین فعلی نمیشود؟» ← نرو! (هرس بهینه)
هرس خوب، زمان نمایی را در عمل قابل تحمل میکند.
مسائل کلاسیک
| مسئله | انتخابها | هرس |
|---|---|---|
| N-Queen | ستون هر ردیف | تقاطع با قبلیها |
| جایگشتها | کاراکتر استفادهنشده | — |
| مجموع زیرمجموعهها | گرفتن/نگرفتن | عبور از هدف |
| مسیر در ماز | ۴ جهت | دیوار + بازدیدشده |
| Sudoku | ارقام ۱-۹ | قواعد سطر/ستون/جعبه |
پیچیدگی
بدون هرس معمولاً نمایی (O(2ⁿ) یا O(n!)) — طبیعت «همه حالتها» همین است. هرس، ثابتها را بهشدت کم میکند؛ و برای مسائل خاص (مثل N-Queen با هرس خوب) تا n=۲۵-۳۰ عملی است.
جمعبندی
- انتخاب ← کاوش ← Undo: چرخه Backtracking
- درخت تصمیم + برگشت از بنبستها
- هرس = حذف زودهنگام شاخههای بیآینده
- نمایی اما با هرس، عملی برای n متوسط
این مبحث بخشی از دوره آموزش کامل الگوریتمها است.