Est-ce que l'algorithme de recherche gourmand best-first est différent de l'algorithme best-first search?
La page wiki a un paragraphe séparé sur Greedy BFS mais ce n'est pas clair.
Ma compréhension est que Greedy BFS est juste BFS où le "meilleur nœud de OPEN" dans l'algorithme de wikipedia est une fonction heuristique que l'on calcule pour un nœud. Donc, implémenter ceci:
OPEN = [initial state]
CLOSED = []
while OPEN is not empty
do
1. Remove the best node from OPEN, call it n, add it to CLOSED.
2. If n is the goal state, backtrace path to n (through recorded parents) and return path.
3. Create n's successors.
4. For each successor do:
a. If it is not in CLOSED: evaluate it, add it to OPEN, and record its parent.
b. Otherwise: change recorded parent if this new path is better than previous one.
done
avec "meilleur nœud de OPEN" étant une fonction heuristique estimant à quelle distance le nœud est proche de l'objectif, est en fait Greedy BFS. Ai-je raison?
EDIT: Commentaire sur la réponse d'Anonymouse:
Donc, essentiellement, un BFS gourmand n'a pas besoin d'une "liste OUVERTE" et devrait baser ses décisions uniquement sur le nœud actuel? Est-ce que cet algorithme GBFS:
1. Set START as CURRENT node
2. Add CURRENT to Path [and optinally, to CLOSED?]
3. If CURRENT is GOAL, exit
4. Evaluate CURRENT's successors
5. Set BEST successor as CURRENT and go to 2.
"Meilleur en premier" pourrait permettre révision la décision, alors que, dans un algorithme gourmand, les décisions devraient être définitives et non révisées.
Par exemple, A * -search est la meilleure recherche en premier, mais elle n'est pas gourmande.
Cependant, notez que ces termes ne sont pas toujours utilisés avec les mêmes définitions. "Gourmand" signifie généralement que la décision n'est jamais révisée, acceptant finalement des solutions sous-optimales au profit d'améliorations du temps d'exécution. Cependant, je parie que vous trouverez des situations où "gourmand" est utilisé pour la combinaison de "meilleur premier + profondeur d'abord" comme dans "essayez d'élargir la meilleure étape suivante jusqu'à ce que nous atteignions une impasse, puis revenez à l'étape précédente et continuez avec le prochain meilleur là-bas "(que j'appellerais une" profondeur prioritaire en premier ").
Cela dépend également du niveau d'abstraction dont vous parlez. Un * n'est pas avide de "construire un chemin". C'est bien de garder un grand nombre de chemins ouverts autour. Il est cependant gourmand en "élargissant l'espace de recherche" vers le vrai chemin le plus court.
BFS est une instance de recherche d'arborescence et recherche de graphe algorithmes dans lequel un nœud est sélectionné pour l'expansion en fonction de la fonction d'évaluation f(n) = g(n) + h(n)
, où g(n)
est la longueur du chemin de la racine à n
et h(n)
est une estimation de la longueur du chemin de n
au noeud d'objectif. Dans un algorithme BFS, le nœud avec l'évaluation la plus faible (c'est-à-dire la plus basse f(n)
) est sélectionné pour l'expansion.
Greedy BFS utilise la fonction d'évaluation suivante f(n) = h(n)
, qui est juste la fonction heuristique h(n)
, qui estime la proximité de n
avec l'objectif. Par conséquent, BFS gourmand essaie d'étendre le nœud qui est considéré comme le plus proche de l'objectif, sans prendre en compte les connaissances précédemment collectées (c'est-à-dire g(n)
).
Pour résumer, la principale différence entre ces méthodes de recherche (similaires) est la fonction d'évaluation.
En guise de remarque, l'algorithme A * est un algorithme de recherche de premier ordre dans lequel la fonction heuristique h
est une heuristique admissible (c'est-à-dire que h
est toujours une sous-estimation de la fonction heuristique parfaite h*
, Pour tous n
). A * n'est pas un algorithme BFS dégoûtant car sa fonction d'évaluation est f(n) = g(n) + h(n)
.
Pour autant que je sache, la "meilleure recherche en premier" n'est qu'un nom collectif d'une technique de recherche particulière dans laquelle vous utilisez une fonction d'évaluation heuristique h (n). Ainsi, A * et la recherche best-first gourmande sont des algorithmes qui entrent dans cette catégorie.