Sujets Spéciaux en informatique II PIF6004
Contenu du cours Algorithmes de recherche dans un graphe pour la résolution de problèmes Introduction Définition d’un problème Algorithme de résolution de problème simple Recherche non-informée Recherche heuristique LECTURES: Chapitres 3 Russell & Norvig Notes de cours (site ftp UQTR)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Introduction Un agent réflexe base ses actions sur un mappage direct des états vers les actions. Ces agents ne peuvent fonctionner correctement dans des environnements pour lesquels ce mappage État/Actions est trop volumineux et ne peut être stocké et dont l’apprentissage est trop long. Les agents Goal-based, considèrent les actions futures et l’utilité de leurs conséquences sur les environnements. Les agents goal-based sont aussi appelés agent de résolution de problème (problem-solving agent). Les agents Problem-solving utilisent des représentations atomiques de telle sorte que les états du monde sont considérés chacun dans leur ensemble (comme un tout).
Algorithmes de recherche dans un graphe pour la résolution de problèmes Introduction (exemples)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Définition d’un problème Un problème sera défini par cinq éléments: Un état initial Un ensemble d’actions possibles Une fonction de successeur, qui définit l’état résultant de l’exécution d’une action dans un état Un ensemble d’états buts Une fonction de coût, associant à chaque action un nombre positif (le coût associé à l’action)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Définition d’un problème Un problème est donc vu comme un graphe orienté où les noeuds sont des états accessibles depuis l’état initial et où les arcs sont des actions. Ce graphe est donc l’espace des états. Une solution sera un chemin à partir de l’état initial à un état but. Une solution est optimale si la somme des coûts des actions du chemin est minimale parmi toutes les solutions du problème.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Définition d’un problème (exemple : Chemin le plus court) Les problèmes de planification sont courants dans la vie de tous les jours. Par exemple, le problème de trouver le chemin le plus court pour atteindre une destination. Maintenant des GPS dédiés à ce genre de tâche sont largement utilisés. Citons aussi les systèmes de planification de voyage qui cherchent des itinéraires en transports en commun, en train ou en avion.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Définition d’un problème (exemple: Chemin le plus court) Formalisation possible de ce problème : États: Chaque état est composé d’un aéroport et la date et l’heure actuelle. Etat initial: L’aéroport de départ, la date de départ souhaitée, et l’heure à partir de laquelle le client peut partir. Actions: Ce sont des vols d’un aéroport à un autre. Fonction de successeur: Les actions possibles sont des vols qui partent de l’aéroport de l’état actuel, plus tard que l’heure actuelle (en fait, nous devrons aussi exiger une certaine durée entre l’arrivée dans un aéroport et le prochain vol, sinon le client risque de rater sa correspondance). Test de but: Les états où le client est à l’aéroport destination.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Définition d’un problème (exemple: Chemin le plus court) Formalisation possible de ce problème : Coût des actions: Dépend des préférences du client. Pourrait être 1 pour chaque action (pour minimiser la nombre de connections), ou la durée des vols (pour minimiser la durée du voyage), ou le prix des trajets (pour trouver le voyage le moins cher).
Algorithmes de recherche dans un graphe pour la résolution de problèmes Définition d’un problème (exemple: Chemin le plus court) C(In(Arad),Go(Sibiu), In(Sibiu)) S G
Algorithmes de recherche dans un graphe pour la résolution de problèmes Définition d’un problème (exemple: Chemin le plus court) Formalisation possible de ce problème : États: Chaque état est composé d’une ville. Etat initial: ex: In(ARAD) . Actions: Étant donné s (état actuel), ACTIONS(s) retourne l’ensemble d’actions pouvant être exécutées sur s. Chaque action est donc applicable sur s. (ex: à partir de l’état In(Arad), les actions applicables sont: {Go(Sibiu), Go(Timisoara), Go(Zerind)}. Fonction de successeur: Le modèle de transition (successeur) (RESULT(s, a)) retourne l’état résultant de l’action a sur s. (ex: RESULT(In(Arad),Go(Zerind)) = In(Zerind))
Algorithmes de recherche dans un graphe pour la résolution de problèmes Définition d’un problème (exemple: Chemin le plus court) Formalisation possible de ce problème : Test de but: Le but à atteindre est l’ensemble singleton {In(Bucharest )}. Coût des actions: Le coût d’un chemin pourrait être sa longueur (km) et donc la somme du coût de chaque action individuelle permettant de passer d’une ville à l’autre sur ce chemin. Le coût individuel de l’action a sur l’état s pour passer à l’état s’ est donné par c(s, a, s’).
Algorithmes de recherche dans un graphe pour la résolution de problèmes Algorithme de résolution de problème simple (forme générale)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Algorithme générique de résolution de problème simple (fonction Search())
Algorithmes de recherche dans un graphe pour la résolution de problèmes Algorithmes de recherche (recherche dans les arbres/graphes) Arbre de recherche partiel
Algorithmes de recherche dans un graphe pour la résolution de problèmes Algorithmes de recherche (recherche dans les arbres/graphes)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Algorithmes de recherche (recherche dans les graphes) Nœud ne pouvant plus être étendu ces successeurs étant déjà dans l’ensemble des nœuds explorés
Algorithmes de recherche dans un graphe pour la résolution de problèmes Algorithmes de recherche (structure de données requise pour représenter un noeud) n.STATE: l’état dans l’espace des états associé au noeud; n.PARENT: le noeud dans l’arbre de recherche ayant généré ce noeud; n.ACTION: l’action appliquée au parent permettant de générer ce noeud; n.PATH-COST: le coût g(n), du chemin pour atteindre ce noeud à partir du noeud initial.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée Ces algorithmes ne disposent pas d’informations supplémentaires pour pouvoir distinguer des états prometteurs (ce ne peux pas être le cas par exemple des programmes joueurs d’échecs qui ne peuvent explorer toutes les possibilités, et se concentrent donc à chaque étape sur un petit nombre de coups qui leur semblent être les meilleurs). En l’absence d’informations, ces algorithmes font une recherche exhaustive de tous les chemins possibles depuis l’état initial.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (parcours en largeur) Ce type d’algorithme de recherche examine d’abord l’état initial, puis ses successeurs, puis les successeurs des successeurs, etc. Tous les noeuds d’une certaine profondeur sont examinés avant les noeuds de profondeur supérieure. Pour implémenter cet algorithme, il suffit de placer les nouveaux noeuds systématiquement à la fin de la liste de noeuds à traiter (FIFO). Parcours en largeur dans un arbre binaire
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (parcours en largeur: algorithme)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (parcours en largeur: algorithme) Le parcours en largeur est un algorithme de recherche complet à condition que le nombre de successeurs de chaque état soit toujours fini (ce qui est souvent le cas dans les problèmes courants). Pour voir pourquoi, soit d le nombre minimal d’actions nécessaires pour atteindre un état but depuis l’état initial. Comme nous examinons les noeuds profondeur par profondeur, et qu’il n’y a qu’un nombre fini b de noeuds à chaque profondeur (ce ne serait pas le cas si un noeud pouvait avoir un nombre infini de successeurs), nous atteindrons forcément le niveau d.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (parcours en largeur: algorithme) Ce parcours trouve toujours un état but de plus petite profondeur possible. Donc si nous cherchons une solution quelconque, ou une solution avec le moins d’actions possibles, le parcours en largeur est optimal. Ce parcours est optimal quand le coût du chemin ne dépend que du nombre d’actions de ce chemin. Par contre le parcours en largeur n’est pas optimal dans le cas général.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (parcours en largeur: algorithme) La complexité de cet algorithme. Supposons que chaque état possède b successeurs et que d soit le nombre minimal d’actions pour relier l’état initial à un état but. Dans le pire des cas, nous allons examiner tous les noeuds de profondeur au plus d afin de trouver l’état but qui se trouve à cette profondeur. Nous allons alors produire: b0 + b1 + b2 + b3 + …. + bd-1 + bd = O(bd) nœuds. Nous aurons alors O(bd−1) noeuds dans l’ensemble explored et O(bd) noeuds dans l’ensemble de la frontière.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (recherche à coût uniforme) Quand chaque étape d’un parcours sont à coût égal, la recherche en largeur est optimale puisqu’à chaque état c’est le noeud le moins profond non étendu qui est étendu. Pour être optimale avec n’importe quelle fonction de coût (step-cost function). Plutôt que d’étendre le noeud le moins profond non étendu, une recherche à coût uniforme étendra le noeud n avec le chemin à coût minimum g(n). Ce qui est possible en stockant les noeuds frontière dans une liste triée selon g(n).
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (recherche à coût uniforme: algorithme)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (recherche à coût uniforme: algorithme) En plus d’ordonner la liste des noeuds frontière selon g(n), il y a deux autres différences avec le parcours en largeur: 1) Le test de but (goal test) est effectué à un noeud lors de sa sélection pour l’expansion plutôt que lorsqu’il est généré. La raison découle du fait que quand le premier noeud but (goal node) qui est généré peut être sur un chemin non optimal. 2) Un test est ajouté dans le cas ou un meilleur chemin est trouvé vers un noeud déjà sur la frontière.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (recherche à coût uniforme: algorithme) Ces deux modifications sont observables dans l’exemple où le problème consiste à se rendre de Sibiu à Bucharest. Les successeurs de Sibiu sont Rimnicu Vilcea et Fagaras, avec des coûts de 80 de 99, respectivement. Le noeud à coût minimum, Rimnicu Vilcea, est alors étendu, ajoutant Pitesti avec comme coût 80 + 97=177. Le noeud à coût minimum est alors Fagaras, qui est ensuite étendu, ajoutant Bucharest au coût de 99+211=310.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (recherche à coût uniforme: algorithme) Un noeud cible (Bucharest) vient alors d’être généré mais la recherche se poursuit, Pitesti étant choisi pour être étendu et ajoutant alors un second chemin vers Bucharest avec un coût de 80+97+101= 278. L’algorithme vérifie si ce nouveau chemin est meilleur que le plus ancien; si il l’est l’ancien est éliminé. Bucharest ayant un coût g() de 278, est sélectionnée pour être étendu et la solution est retournée.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (recherche à coût uniforme: algorithme)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (parcours en longueur) Le parcours en profondeur suit le chemin courant le plus longtemps possible. Il est facile à implémenter : il faut tout simplement mettre les successeurs du noeud courant au début de la liste de noeuds à traiter (LIFO).
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (parcours en longueur)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (parcours en longueur) Le parcours en profondeur n’est pas complet parce que l’algorithme peut continuer sur un chemin infini, ignorant complètement un état but qui se trouve sur un autre chemin. Si par contre, nous n’avons qu’un nombre fini de chemins possibles (ce qui n’est pas souvent le cas), le parcours en profondeur sera complet. L’algorithme n’est pas optimal : il n’y a rien qui garantie que le premier état but trouvé sera le bon. La complexité sera pour s successeurs et une profondeur maximale de m actions, dans le pire des cas nous aurions besoin d’examiner tous les sm noeuds pour trouver une solution.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche non-informée (parcours en longueur) Ce parcours n’est pas optimal mais sa complexité en espace est raisonnable. Pour un problème ayant s successeurs et un profondeur maximal de m actions, 1+(m*(s−1)) nœuds sont conservés en mémoire (correspondant au chemin actuellement en développement plus les successeurs de profondeur 1 que nous n’avons pas encore traités, les successeurs de profondeur 2 que nous n’avons pas encore traités, etc.). La complexité en espace est donc de O(s*m).
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique Les algorithmes de recherche non-informés font une recherche exhaustive de tous les chemins possibles, ce qui les rend inefficaces voire inutilisables pour résoudre des problèmes de grande taille. Les algorithmes de recherche heuristiques utilisent des informations supplémentaires pour pouvoir mieux orienter la recherche. Une fonction d’évaluation f() permet de déterminer l’ordre dans lequel les noeuds sont traités : la liste de nœuds à traiter est organisée en fonction du f() des noeuds, avec les nœuds de plus petite valeur en tête de liste.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique Une fonction heuristique h() où h(n) = coût estimé du chemin de moindre coût reliant n à un état but. h(n) = 0 pour n étant un nœud but. Pour trouver la distance la plus courte entre Arad et Bucarest, h(n) pourrait être la distance à vol d’oiseau entre la ville n et Bucarest. Distance euclidienne entre une ville et Bucarest
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (Best-First/meilleur d’abord) L’algorithme “best-first search” est d’examiner les noeuds qui semblent les plus proches d’un état but, pour tenter d’atteindre le plus vite possible la solution. Consiste à utiliser la fonction heuristique h() comme fonction d’évaluation (f(n) = h(n)).
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (Best-First/meilleur d’abord) Chemin trouvé entre Arad et Bucarest
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (Best-First/meilleur d’abord) Chemin trouvé entre Arad et Bucarest: Best-first n’est ni complet ni optimal. N’est pas complet car l’algorithme peut tourner en boucle et ce même s’il existe une solution. Il n’est pas optimal, puisque le chemin trouvé (Arad, Sibiu, Fagaras, Bucarest) retourné par l’algorithme est plus long que le chemin (Arad, Sibiu, Rimnicu Vilcea, Pitesti, Bucarest). Pour une profondeur maximale de p et s successeurs, la complexité en temps et en espace O(sp) dans les pire des cas, même si la complexité dépend en pratique de la qualité de la fonction heuristique.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (A*) Best-first search prévilégie les noeuds dont les états semblent les plus proche d’un état but, mais il ne prend pas en compte les coûts des chemins reliant l’état initial à ces noeuds. Cette information importante est le coût f(n) d’un chemin passant par un noeud n est la somme du coût du chemin entre l’état initial et n et le coût du chemin reliant n à un état but. Dans cette fonction de coût g(n) est le coût du chemin entre l’état initial et n. La fonction d’évaluation utilisée par la recherche A* est donnée par: f(n) = g(n) + h(n)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (A*) L’algorithme de recherche A* est complet et optimal s’il y a un nombre fini de successeurs et si la fonction h(n) est admissible, c’est à dire que la valeur h(n) ne doit jamais être supérieure au coût réel du meilleur chemin entre n et un état but. L’heuristique utilisant les distances à vol d’oiseau est un exemple d’une fonction heuristique admissible parce que cette distance (la valeur heuristique) n’est jamais supérieure à la distance sur la route (le vrai coût).
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (A*) Pour éliminer les nœuds redondants possibles (permettant alors de ne garder que le premier chemin amenant à un état), il faut alors placer une restriction plus forte sur la fonction heuristique h(n) pour ainsi garantir l’optimalité: la fonction doit être cohérente. Une fonction heuristique est cohérente si pour tout noeud n et tout successeur n’ obtenu à partir de n en faisant l’action a, nous avons l’inégalité suivante : h(n) <= c(n, a, n’) + h(n’)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (A*) Les fonctions heuristiques cohérentes sont toujours admissibles, mais les fonctions heuristiques admissibles sont très souvent, cohérentes. La complexité de la recherche A* dépend de la fonction heuristique utilisée. En général, la complexité en temps et en espace est grande, ce qui rend la recherche A* mal adapté pour les problèmes de grande taille.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (RBFS) Recursive best-first search (RBFS) est un algorithme récursif simple similaire à la recherche best-first, mais qui est linéaire pour l’utilisation de la mémoire. Sa structure est similaire à celle utilisée pour la recherche récursive depth-first, mais plutôt que de continuer indéfiniment en profondeur dans le chemin courant, une variable f limit est utilisée pour monitorer la f-value du meilleur chemin alternatif émanent d’un des parents du noeud courant. Si la f-value excède cette limite, la récursion revient en arrière sur le meilleur chemin alternatif. Durant un retour en arrière, RBFS remplace la f-value de chaque noeud sur ce chemin avec la meilleure f-value parmis ses enfants. RBFS mémorise la f-value du meilleur noeud feuille dans le sous arbre ignoré et pourrait décider ultérieurement de réétendre ce sous arbre.
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (RBFS: algorithme)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (RBFS: exemple) f-limit f-cost
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (RBFS: exemple)
Algorithmes de recherche dans un graphe pour la résolution de problèmes Recherche heuristique (RBFS: exemple)