algo de recherche en profondeur
Bonjour,
Je dois programmer une "IA" permettant de donner les solutions à un petit jeu avec un personnage qui part de la case en haut à gauche de la grille pour aller en bas à droite de cette dernière en se déplaçant entre les éventuels blocs que le personnage peut pousser lors de son déplacement.
Comme état pour ce problème j'ai considéré la configuration de la grille à un instant donné. Ainsi, j'ai commencé par implémenter l'algorithme de recherche en profondeur d'abord pour résoudre ce problème. Tout marche bien et j'obtiens bien une solution.
J'utilise une matrice à 2 dimensions pour stocker la grille . Compte tenu de la place importante prise en mémoire par ce stockage je me demande quelle est la meilleure solution pour ressortir la solution au problème.
J'hésite entre construire le graphe d'état correspondant durant la recherche en profondeur d'abord ( en liant le père au fils et le fils au père pour pouvoir en partant du père afficher facilement les différentes configurations possibles)
ET entre stocker les déplacements possibles dans une liste que je mets à jour au fur et à mesure de la recherche en profondeur d'abord.
Bien sur, je n'aurais pas le même résultat dans les deux cas puisque d'un côté je pourrais afficher les différents configurations de la grille avec les déplacements et dans l'autre solution juste la liste des déplacements ayant conduits à la grille solution.
Mais ce n'est pas un problème, mon problème ça serait de savoir ce qui serait le mieux au niveau de la place occupée en mémoire notamment.
Qu'en pensez vous ? et si vous avez une idée d'une meilleure solution, n'hésitez pas.
merci d'avance.
Re: algo de recherche en profondeur
Citation:
Envoyé par sylsau
Bien sur, je n'aurais pas le même résultat dans les deux cas puisque d'un côté je pourrais afficher les différents configurations de la grille avec les déplacements et dans l'autre solution juste la liste des déplacements ayant conduits à la grille solution.
Mais ce n'est pas un problème, mon problème ça serait de savoir ce qui serait le mieux au niveau de la place occupée en mémoire notamment.
Qu'en pensez vous ? et si vous avez une idée d'une meilleure solution, n'hésitez pas.
merci d'avance.
Heu.. Pourquoi tu pourrait pas afficher la grille ? Je veux dire, ça se calcule... Et dans tous les cas, tu doit calculer l'état suivant pour vérifier si la solution est trouvée ou non.
Donc le soucis qui implique tout le compromis temps/espace, c'est au moment du backtrack. Si tu stocke les déplacements dans une liste, il te suffit de supprimer le dernier déplacement (très rapide et pas besoin d'empiler les états succéssifs de cette dernière, si j'ai bien compris c'est ça ton idée).
Par contre tu aura une grille courante qui te permet d'évaluer la situation. Que tu sera obligé de retransformer à l'inverse (et celà est-il toujours possible ?) ce qui est coûteux en temps de calcul. Si le temps n'est pas un soucis, alors tu peux faire comme ça.
Sinon, il faut se poser les questions : quelle est la profondeur maximale d'une branche de l'arbre ? Multipliée par la taille max de la grille, ça donne quoi ? De quelle mémoire je dispose ?
Moi en fait ce qui me turlupine, c'est que tu utilise une méthode de résolution exacte sur un problème NP-complet. C'est plus de l'IA :roll: (stricto-sensus, ça l'est, mais à mon goût...).
Si tu n'as pas besoin de TOUTES les solutions possibles, à ta place j'aurais plutôt opté pour une heuristique, utilisant une "perception locale" de l'environnement par l'agent (le p'tit bonhomme qui pousse).
PS : Trap D aura sûrement une solution, mais il est spécialisé dans le poussage de boules de pierres, exclusivement :wink: