جستجوی عمق اول عمیقکننده تکراری
جستجوی عمق اول عمیقکننده تکراری (به انگلیسی: Iterative deepening depth-first search)، (به اختصار IDDFS) یک استراتژی جستجوی فضای حالت است که در آن یک جستجوی عمق محدود، بارها و بارها اجرا میشود که با هر تکرار حد عمق را افزایش میدهد، تا زمانی که به مقدار ِD -عمق کم عمقترین حالت نهایی- برسد. IDDFS، مشابه جستجوی اول سطح است با این تفاوت که حافظهٔ کمتری را اشغال میکند؛ در هر تکرار، گرههایی را که در درخت جستجو در همان سطح از جستجوی عمق اول هستند را میبیند، اما مرتبهٔ تجمعی برای هر گره که اولین بار دیده میشود، -بدون هرس در نظر بگیرید-، اول سطح است.
رده | الگوریتم جستجو |
---|---|
ساختمان داده | درخت (ساختار داده)، گراف (ساختار داده) |
کارایی بدترین حالت | , where is the branching factor and is the depth of the shallowest solution |
پیچیدگی فضایی | :5 |
پیمایش گراف و پیمایش درخت |
---|
هرس آلفا بتا |
جستار وابسته |
برنامهریزی پویا |
مشخصات
الگوریتم جستجوی عمیقکنندهٔ تکراری کارایی الگوریتم جستجوی اول عمق در فضا را با کامل بودن الگوریتم جستجوی اول سطح (وقتی ضریب انشعاب متناهی است)، ترکیب میکند.این روش وقتی بهینه است که یک تابع هزینهٔ مسیر بک تابع غیرنزولی از عمق گره باشد.
پیچیدگی فضا در این روش از است، که در آن b ضریب انشعاب و d عمق گرهٔ هدف با کمترین عمق است. از آنجایی که الگوریتم جستجوی عمیقکنندهٔ تکراری حالتها را چندین بار ملاقات میکند به نظر زمان را هدر میدهد. ولی در حقیقت جندان هزینه بر نیست، زیرا اکثر گرههای یک درخت تولید شده، در پایینترین سطح قرار دارند، بنابراین اهمیت چندانی ندارد که گرههای بالایی چندین بار ملاقات شوند.
مهمترین خصوصیت IDDFS در جستجوی درخت بازی این است که روشهای پیشین جستجو سعی میکردند با استفاده از توابع شهودی و ابتکار جستجو را انجام دهند، مانند killer heuristic یا alpha-beta pruning، بهطوریکه تخمین بهتر از گرهها در آخرین جستجوی عمیق میتوانست اتفاق بیفتد، و جستجو از آن جایی که در زمان کمتری انجام میشود سریع تر پیش خواهد رفت.
دومین خصوصیت این روش حساسیت آن به الگوریتم میباشد. از آن جایی که تکرارهای اولیه از مقادیر کوچک d استفاده میکردند بسیار سریع پایان می پذیرفتند. این به الگوریتم این اجازه را میدهد که نشانههای جواب را تقریباً در هر لحظه با پالایش، در حالی که d کاهش میابدعرضه کند. در هنگام استفاده از یک مدل تعاملی مثل یک برنامهٔ شطرنج، این امکان به ما اجازه میدهد که برنامه در هر لحظه بازی کند در هر زمانی با بهترین حرکت که تا این لحظه در جستجویی که تا این لحظه به دست آمده یافت شدهاست. با الگوریتم جستجوی اول عمق سنتی چنین چیزی میسر نبود.
پیچیدگی زمانی IDDFS یک درخت بسیار متعادل از است.
در یک جستجوی عمق اول عمیقکنندهٔ تکراری، گرههای سطح زیرین یک بار گسترش میابند، آنهایی که در سطح بعدی قرار دارند دو بار گسترش میابند، و تا جایی که تا ریشهٔ درخت، d+1 بار گسترش خواهد یافت. پس تعداد گسترشها در یک جستجوی عمیقکنندهٔ تکراری چنین خواهد بود:
در هر حال، یک جستجوی عمیقکنندهٔ تکراری از عمق صفر تا عمق d فقط 11% گره بیشتر از یک جستجوی اول سطح یا یک جستجوی اول عمق با عمق d وقتی b=10 است گسترش میابد.هر چه ضریب انشعاب بزرگ تر باشد، در نهایت جمع کلی هزینه روی حالتهای در حال گسترش کم تر میشود، ولی حتی وقتی که ضریب انشعاب 2 است، جستجوی عمیقکنندهٔ تکراری تنها دو برابر یک جستجوی اول سطح زمان میگیرد. این بدان معنی است که پیچیدگی زمانی یک الگوریتم عمیقکنندهٔ تکراری هنوز همان است، و پیچیدگی فضا همان است. به صورت کلی جستجوی عمیقکنندهٔ تکراری نسبت به روشهای دیگر جستجو وقتی یک فضای بزرگ برای جستجو داریم و عمق نیز نامعلوم است ارجحیت دارد.
الگوریتم
شبه برنامه زیر نشان میدهد IDDFS را با استفاده از DFS عمق محدود بازگشتی(DLS) اجرا شدهاست.
IDDFS(root, goal) { depth = 0 repeat { result = DLS(root, goal, depth) if (result is a solution) return result depth = depth + 1 } }
جستجوی عمق محدود میتواند به صورت بازگشتی انجام شود. توجه کنید تنها لازم است گره هدف برای depth==0 چک شود، چون وقتی depth>0 باشد، DLS گرههایی را که در تکرار قبلی IDDFS دیده شدهاند را گسترش میدهد.
DLS(node, goal, depth) { if (depth == 0 and node == goal) return node else if (depth> 0) for each child in expand(node) DLS(child, goal, depth-1) else return no-solution }