جستجوی عمق اول ژرفایش تکراری

**جستجوی عمق اول ژرفایش تکراری** ،  یا **جستجوی عمق-اول با ژرفایش تکراری** یا **جستجوی عمق-اول تعمیق تکراری** یک استراتژی جستجوی فضای حالت است که در آن یک جستجوی عمق محدود، بارها و بارها اجرا می‌شود که با هر تکرار حد عمق را افزایش می‌دهد، تا زمانی که به مقدارِ D -عمق کم عمق‌ترین حالت-نهایی برسد. آی‌دی‌دی‌اف‌اس، مشابه جستجوی اول سطح است با این تفاوت که حافظهٔ کمتری را اشغال می‌کند؛ در هر تکرار، گره‌هایی را که در درخت جستجو در همان سطح از جستجوی عمق اول هستند را می‌بیند، اما مرتبهٔ تجمعی برای هر گره که اولین بار دیده می‌شود، بدون هرس در نظر بگیرید-، اول سطح است.

## الگوریتم برای گراف‌های جهت‌دار
شبه‌کد زیر آی‌دی‌دی‌اف‌اس را نشان می‌دهد که براساس یک دی‌اف‌اس محدودعمق بازگشتی (به نام DLS) برای نمودارهای جهت‌دار پیاده‌سازی شده‌است. این پیاده‌سازی آی‌دی‌دی‌اف‌اس برای گره‌هایی که قبلاً بازدید شده‌اند حساب نمی‌کند و بنابراین برای گراف‌های بدون‌جهت کارنمی‌کند.

  

 **function** IDDFS(root) **is**
     **for** depth **from** 0 **to** ∞ **do**
         found, remaining ← DLS(root, depth)
         **if** found ≠ **null** **then**
             **return** found
         **else if** not remaining **then**
             **return** **null**
 
 **function** DLS(node, depth) **is**
     **if** depth = 0 **then**
         **if** node is a goal **then**
             **return** (node, **true**)
         **else**
             **return** (**null**, **true**)    *(Not found, but may have children)*
 
     **else if** depth > 0 **then**
         any_remaining ← **false**
         **foreach** child **of** node **do**
             found, remaining ← DLS(child, depth−1)
             **if** found ≠ null **then**
                 **return** (found, **true**)   
             **if** remaining **then**
                 any_remaining ← true    *(At least one node found at depth, let IDDFS deepen)*
         **return** (**null**, any_remaining)

اگر گره هدف پیدا شود، DLS بازگشتی را بازمی‌کند و بدون تکرار بیشتر بازمی‌گردد. در غیر این صورت، اگر حداقل یک گره در آن سطح از عمق وجود داشته باشد، پرچم باقی مانده به آی‌دی‌دی‌اف‌اس اجازه ادامه کار را می‌دهد.

۲-رتبیک به عنوان مقدار بازگشتی برای سیگنال آی‌دی‌دی‌اف‌اس برای ادامه عمیق‌شدن یا توقف مفید هستند، در صورتی که عمق درخت و عضویت هدف از قبل ناشناخته باشد. راه حل دیگری می‌تواند به جای آن از مقادیر نگهبان برای نمایش نتایج سطح پیدا نشده یا باقیمانده استفاده کند.

## مشخصات
جستجوی عمق اول ژرفایش تکراری کارایی-فضایی الگوریتم جستجوی عمق-اول و الگوریتم جستجوی سطح اول (وقتی ضریب انشعاب متناهی است)، را ترکیب می‌کند. این روش وقتی بهینه است که یک تابع هزینهٔ مسیر بک تابع غیرنزولی از عمق گره باشد. اگر راه حلی وجود داشته باشد، مسیر راه حلی با کمترین کمان را پیدا می‌کند.

پیچیدگی فضا در این روش از O(bd) است، که در آن b ضریب انشعاب و d عمق گرهٔ هدف با کمترین عمق است. از آنجایی که الگوریتم جستجوی ژرفایش تکراری حالت‌ها را چندین بار ملاقات می‌کند به نظر زمان را هدر می‌دهد. ولی در حقیقت جندان هزینه بر نیست، زیرا اکثر گره‌های یک درخت تولید شده، در پایین‌ترین سطح قرار دارند، بنابراین اهمیت چندانی ندارد که گره‌های بالایی چندین بار ملاقات شوند.

مهم‌ترین خصوصیت آی‌دی‌دی‌اف‌اس در جستجوی درخت بازی این است که روش‌های پیشین جستجو سعی می‌کردند با استفاده از توابع شهودی و ابتکار جستجو را انجام دهند، مانند چابک‌یابی قاتل ([//en.wikipedia.org/w/index.php?title=Killer_heuristic&oldid=380816104 killer heuristic]) یا هرس آلفا-بتا، به‌طوری‌که تخمین بهتر از گره‌ها در آخرین جستجوی عمیق می‌توانست اتفاق بیفتد، و جستجو از آن جایی که در زمان کمتری انجام می‌شود سریع تر پیش خواهد رفت.

دومین خصوصیت این روش حساسیت آن به الگوریتم می‌باشد. از آن جایی که تکرارهای اولیه از مقادیر کوچک d استفاده می‌کردند بسیار سریع پایان می‌پذیرفتند. این به الگوریتم این اجازه را می‌دهد که نشانه‌های جواب را تقریباً در هر لحظه با پالایش، درحالی‌که d کاهش‌می‌یابد عرضه کند. در هنگام استفاده از یک مدل تعاملی مثل یک برنامهٔ شطرنج، این امکان به ما اجازه می‌دهد که برنامه در هر لحظه بازی کند در هر زمانی با بهترین حرکت که تا این لحظه در جستجویی که تا این لحظه به دست آمده یافت شده‌است. با الگوریتم جستجوی اول عمق سنتی چنین چیزی میسر نبود.

## تحلیل مجانبی
### پیچیدگی زمانی
پیچیدگی زمانی آی‌دی‌دی‌اف‌اس یک درخت بسیار متعادل از O(b^d) است، که در آن b عامل انشعاب و d عمق هدف است.

#### اثبات
در یک جستجوی عمق اول ژرفایش تکراری، گره‌های سطح زیرین یک بار گسترش می‌یابند، آن‌هایی که در سطح بعدی قرار دارند دو بار گسترش می‌یابد، و تا جایی که تا ریشهٔ درخت، d+1 بار گسترش خواهد یافت. پس تعداد گسترش‌ها در یک جستجوی ژرفایش تکراری چنین خواهد بود:

{\displaystyle b^{d}+2b^{d-1}+3b^{d-2}+\cdots +(d-1)b^{2}+db+(d+1)=\sum _{i=0}^{d}(d+1-i)b^{i}}

که در آن {\displaystyle b^{d}} تعداد انبساط‌ها در عمق d, {\displaystyle 2b^{d-1}} تعداد انبساط‌ها در عمق d-1 و غیره است. فاکتورگیری {\displaystyle b^{d}} نتیجه پاین را می‌دهد

{\displaystyle b^{d}(1+2b^{-1}+3b^{-2}+\cdots +(d-1)b^{2-d}+db^{1-d}+(d+1)b^{-d})}

{\displaystyle x={\frac {1}{b}}=b^{-1}}

{\displaystyle b^{d}(1+2x+3x^{2}+\cdots +(d-1)x^{d-2}+dx^{d-1}+(d+1)x^{d})}

{\displaystyle b^{d}(1+2x+3x^{2}+4x^{3}+\cdots )=b^{d}\left(\sum _{n=1}^{\infty }nx^{n-1}\right)}

{\displaystyle b^{d}(1-x)^{-2}=b^{d}{\frac {1}{(1-x)^{2}}}}, for {\displaystyle abs(x)

{\displaystyle b^{d}(1+2x+3x^{2}+\cdots +(d-1)x^{d-2}+dx^{d-1}+(d+1)x^{d})\leq b^{d}(1-x)^{-2}}, for {\displaystyle abs(x)

از اینرو زمان اجرای جستجوی عمقی تکراری اول عمق O(b^d) است.

### پیچیدگی فضا
پیچیدگی فضای آی‌دی‌دی‌اف‌اس،  {\displaystyle O(d)}  است که d عمق هدف است.

#### اثبات
از آنجایی که آی‌دی‌دی‌اف‌اس، در هر نقطه‌ای، درگیر یک جستجوی عمقی است، فقط باید پشته‌ای از گره‌ها را ذخیره کند که نشان‌دهنده شاخه درختی است که در حال گسترش است. از آنجایی که راه حلی با طول بهینه پیدا می‌کند، حداکثر عمق این پشته d است و بنابراین حداکثر مقدار فضا  {\displaystyle O(d)} است.

به‌طور کلی، زمانی که فضای جستجوی زیادی وجود دارد و عمق راه حل مشخص نیست، عمیق کردن تکراری روش جستجوی ترجیحی است.

در هر حال، یک جستجوی ژرفایش تکراری از عمق صفر تا عمق d فقط ۱۱٪ گره بیشتر از یک جستجوی اول سطح یا یک جستجوی اول عمق با عمق d وقتی b=۱۰ است گسترش می‌یابد. هر چه ضریب انشعاب بزرگ‌تر باشد، در نهایت جمع کلی هزینه روی حالت‌های در حال گسترش کم‌تر می‌شود، ولی حتی وقتی که ضریب انشعاب ۲ است، جستجوی ژرفایش تکراری تنها دو برابر یک جستجوی اول سطح زمان می‌گیرد. این بدان معنی است که پیچیدگی زمانی یک الگوریتم ژرفایش تکراری هنوز همان O(bd) است به صورت کلی جستجوی ژرفایش تکراری نسبت به روش‌های دیگر جستجو وقتی یک فضای بزرگ برای جستجو داریم و عمق نیز نامعلوم است ارجحیت دارد.

## الگوریتم
شبه برنامه زیر نشان می‌دهد آی‌دی‌دی‌اف‌اس را با استفاده از دی‌اف‌اس عمق محدود بازگشتی(DLS) اجرا شده‌است.

 **IDDFS**(root, goal)
 {
  depth = 0
  repeat
  {
  result = **DLS**(root, goal, depth)
  if (result is a solution)
  return result
  depth = depth + 1
  }
 }

جستجوی عمق محدود می‌تواند به صورت بازگشتی انجام شود. توجه کنید تنها لازم است گره هدف برای depth==۰ چک شود، چون وقتی depth>0 باشد، DLS گره‌هایی را که در تکرار قبلی آی‌دی‌دی‌اف‌اس دیده شده‌اند را گسترش می‌دهد.

 **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
 }

## جستارهای وابسته
* الگوریتم جستجوی عمق اول
* الگوریتم ناآگاهانه

## منابع

## پیوند به بیرون
رده:الگوریتم‌های جستجو
رده:الگوریتم‌های گراف