Python中的深度优先迭代深化(DFID)算法

561 阅读3分钟

各位读者大家好,这篇文章让我们了解到底什么是深度优先迭代深化(DFID),也被称为迭代深化搜索(IDS)。它的优点、应用以及在python中的实现。

什么是深度第一迭代深化搜索?

深度优先迭代深化是一种迭代搜索技术,结合了深度优先搜索(DFS)和广度优先搜索(BFS)的优点。

在图中搜索一个特定的节点时,广度优先搜索需要大量的空间,因此增加了空间的复杂性,而深度优先搜索需要更多的时间,因此这种搜索策略有很多的时间复杂性,而且深度优先搜索并不总是找到最便宜的路径。为了克服深度优先搜索和广度优先搜索的所有这些缺点,实施了深度优先迭代深化搜索。

DFIDS是如何工作的?

DFID在扩展更大深度的任何节点之前,先扩展给定深度的所有节点。因此,它能保证找到从开始到目标状态的最短路径或最优解决方案。DFID算法的工作原理如图所示

Dfid

在任何时候,它都在执行DFS,而且搜索的深度永远不会超过'd'。因此,它使用的空间是O(d)。DFID的缺点是它在达到目标深度之前进行了浪费的编译。

  • INPUT:START和GOAL状态
  • 本地变量。发现
  • 方法
    • 初始化d = 1,FOUND = False
    • while (FOUND = False) do
      • 从开始到深度d执行DFS。
      • 如果获得目标状态,则FOUND = True,否则丢弃在深度为d的搜索中产生的节点。
      • d = d + 1
    • 如果FOUND = true,则返回深度。
    • 停止

在Python中实现深度优先的迭代深化

实现图

class Node:
    def __init__(self, val=None):
        self.val = val
        self.left = None
        self.right = None


def get_root():
    values = iter([3, 8, 6, 9, None, None, 11, 10, None, None,
              12, None, None, 7, None, None, 4, 5, None, None, 13, None, None])

    def tree_recur(itr):
        val = next(itr)
        if val is not None:
            node = Node(val)
            node.left = tree_recur(itr)
            node.right = tree_recur(itr)
            return node

    return tree_recur(values)

DFIDS的函数

def dfids():
    root = get_root()
    res = float("inf")

    def dfids_search(node, depth, limit):
        if depth <= limit and node is not None:
            val = node.val
            if val == 12:
                nonlocal res
                res = min(res, depth)
            else:
                dfids_search(node.left, depth + 1, limit)
                dfids_search(node.right, depth + 1, limit)

    for limit in range(1,5):
        dfids_search(root, 0, limit)
        if res < float("inf"):
            return res
    return -1

if __name__ == "__main__":
   print("\nShortest Depth: ", dfids())

深度优先迭代深化的应用

深度优先迭代深化搜索是用来寻找最优解或给定问题陈述的最佳路径的。当提供了一个大的状态空间,并且没有提到解决方案的深度信息时,最好使用这种搜索策略。以下是DFIDS的一些应用

  • 人工智能和数据科学--分析网络
  • 用独特的解决方案解决难题(例如:数独)。
  • 检测图中的周期。
  • 对有向无环图(DAG)进行排序
  • N- Queens问题

总结

在这篇文章中,我们已经彻底研究了深度第一迭代深化搜索,它的重要性和它的实现。