web-dev-qa-db-fra.com

Approfondissement itératif vs recherche en profondeur d'abord

Je continue de lire sur l'approfondissement itératif , mais je ne comprends pas en quoi il diffère de la recherche en profondeur d'abord .

J'ai compris que la recherche en profondeur d'abord va de plus en plus profondément.

Dans l'approfondissement itératif, vous établissez une valeur d'un niveau, s'il n'y a pas de solution à ce niveau, vous incrémentez cette valeur et recommencez à zéro (la racine).

Ne serait-ce pas la même chose que la recherche en profondeur d'abord?

Je veux dire que vous continueriez à incrémenter et à incrémenter, en approfondissant jusqu'à ce que vous trouviez une solution. Je vois cela comme la même chose! Je descendrais la même branche, car si je recommençais à zéro, je descendrais la même branche qu'avant.

35
bb2

Dans une recherche en profondeur d'abord, vous commencez à un nœud du graphique et explorez de plus en plus profondément le graphique pendant que vous pouvez trouver de nouveaux nœuds que vous n'avez pas encore atteints (ou jusqu'à ce que vous trouviez la solution). Chaque fois que le DFS manque de mouvements, il revient au dernier point où il pourrait faire un choix différent, puis explore à partir de là. Cela peut être un problème grave si votre graphique est extrêmement volumineux et qu'il n'y a qu'une seule solution, car vous pourriez finir par explorer le graphique entier le long d'un chemin DFS uniquement pour trouver la solution après avoir regardé chaque nœud. Pire, si le graphique est infini (peut-être que votre graphique est composé de tous les nombres, par exemple), la recherche peut ne pas se terminer. De plus, une fois que vous avez trouvé le nœud que vous recherchez, vous pourriez ne pas avoir le chemin optimal vers celui-ci (vous auriez pu faire une boucle sur tout le graphique à la recherche de la solution même s'il était juste à côté du nœud de départ!)

Une solution potentielle à ce problème serait de limiter la profondeur de tout chemin emprunté par le DFS. Par exemple, nous pouvons effectuer une recherche DFS, mais arrêter la recherche si nous prenons un chemin de longueur supérieure à 5. Cela garantit que nous n'explorons jamais un nœud dont la distance est supérieure à cinq du nœud de départ, ce qui signifie que nous n'explorons jamais à l'infini ou (à moins que le graphique ne soit extrêmement dense), nous ne recherchons pas le graphique entier. Cependant, cela signifie que nous ne trouverons peut-être pas le nœud que nous recherchons, car nous n'explorons pas nécessairement le graphique entier.

L'idée de l'approfondissement itératif est d'utiliser cette deuxième approche mais de continuer à augmenter la profondeur à chaque niveau. En d'autres termes, nous pourrions essayer d'explorer en utilisant tous les chemins de longueur un, puis tous les chemins de longueur deux, puis de longueur trois, etc. jusqu'à ce que nous trouvions le nœud en question. Cela signifie que nous ne finissons jamais par explorer des chemins sans issue infinis, car la longueur de chaque chemin est limitée par une certaine longueur à chaque étape. Cela signifie également que nous trouvons le chemin le plus court possible vers le nœud de destination, car si nous n'avons pas trouvé le nœud à la profondeur d mais que nous l'avons trouvé à la profondeur d + 1, il ne peut pas y avoir de chemin de longueur d (ou nous l'aurait pris), donc le chemin de longueur d + 1 est en effet optimal.

La raison pour laquelle cela est différent d'un DFS est qu'il ne se heurte jamais au cas où il prend un chemin extrêmement long et détourné autour du graphique sans jamais se terminer. Les longueurs des chemins sont toujours plafonnées, donc nous ne finissons jamais par explorer des branches inutiles.

La raison pour laquelle cela est différent de BFS est que dans un BFS, vous devez conserver tous les nœuds marginaux en mémoire à la fois. Cela prend de la mémoire O (b), où b est le facteur de branchement. Comparez cela à l'utilisation de la mémoire O(d) de l'approfondissement itératif (pour conserver l'état de chacun des nœuds d dans le chemin actuel). Bien sûr, BFS n'explore jamais le même chemin plusieurs fois , tandis que l'approfondissement itératif peut explorer n'importe quel chemin plusieurs fois car il augmente la limite de profondeur. Cependant, asymptotiquement les deux ont le même temps d'exécution. BFS se termine en O (b) étapes après avoir considéré tous les O (b) nœuds à distance d. L’approfondissement itératif utilise O (b) temps par niveau, ce qui correspond à O (b) dans l'ensemble, mais avec un facteur constant plus élevé.

En bref:

  • DFS n'est pas garanti de trouver un chemin optimal; l'approfondissement itératif est.
  • DFS peut explorer l'ensemble du graphique avant de trouver le nœud cible; l'approfondissement itératif ne le fait que si la distance entre le nœud de début et de fin est le maximum dans le graphique.
  • BFS et l'approfondissement itératif s'exécutent tous deux en O (b), mais l'approfondissement itératif a un facteur constant plus élevé.
  • BFS utilise O (b), tandis que l'approfondissement itératif utilise uniquement O (d).

J'espère que cela t'aides!

78
templatetypedef

Il y a une page décente sur wikipedia à ce sujet.

L'idée de base que je pense que vous avez manquée est que l'approfondissement itératif est principalement une heuristique. Lorsqu'une solution est susceptible d'être trouvée près de la racine, l'approfondissement itératif la trouvera relativement rapide, tandis que la recherche directe en profondeur pourrait prendre une "mauvaise" décision et passer beaucoup de temps sur une branche profonde infructueuse.

(Ceci est particulièrement important lorsque l'arborescence de recherche peut être infinie. Dans ce cas, ils sont encore moins équivalents car DFS peut rester bloqué pour toujours pendant que BFS ou l'approfondissement itératif êtes sûr de trouver la réponse un jour si elle existe)

2
hugomg

Juste pour ajouter à ce qui est déjà là, mais voici quelques vidéos du Moving AI Lab de l'Université de Denver qui montrent les différences.

http://movingai.com/dfid.html

Vous pouvez voir dans leurs exemples l'approfondissement itératif gagne lorsque l'objectif est peu profond (profondeur de solution 3, profondeur d'arbre) et que la solution est à droite, mais DFS gagne peu importe si la solution est dans la dernière ligne.

Je suis entré dans cette lecture sur la programmation des échecs, ensuite je pensais à recherche de repos vérifiez si vous voulez en savoir plus sur les stratégies de recherche pour la programmation de l'IA.

1
Brett Rudder