From bd195195e7dddca125ed84fc6629bbf95d5dccd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Pelletier?= Date: Sun, 3 Feb 2019 22:01:12 -0500 Subject: [PATCH] ajout solution a* --- search/search.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/search/search.py b/search/search.py index db5957c..a65998a 100644 --- a/search/search.py +++ b/search/search.py @@ -204,6 +204,46 @@ def nullHeuristic(state, problem=None): def aStarSearch(problem, heuristic=nullHeuristic): """Search the node that has the lowest combined cost and heuristic first.""" "*** YOUR CODE HERE ***" + maFileEtat = util.PriorityQueue() + # Je fais une 2e file parce que sinon je ne peux pas comparer le cout + # si je le met dans le meme tuple que le chemin + maFileChemin = util.PriorityQueue() + maListeFermee = [] + # Verifier si le depart est un but + if problem.isGoalState(problem.getStartState()): + return [] + # Mettre le premier noeud dans la file + maFileEtat.push(problem.getStartState(),0) + # Extraire le noeud courant + listeDirections = [] + + while (not maFileEtat.isEmpty()): + noeudCourant = maFileEtat.pop() + #print "Noeud courant: ", noeudCourant + # La marquer comme visite + if noeudCourant not in maListeFermee: + maListeFermee.append(noeudCourant) + # Verifier si c'est un but + if(problem.isGoalState(noeudCourant)): + #print "Nous avons atteint le but !" + return listeDirections + # Effectuer la recherche de successeurs + for s in problem.getSuccessors(noeudCourant): + # Decomposer le tuple pour faciliter la lecture + succNoeudCourant, succDirection, succCost = s + # Verifier si le noeud n'est pas deja visite + if (succNoeudCourant not in maListeFermee+[i[0] for i in maFileEtat.heap]): + # obtenir le cout total du chemin + succCostChemin = problem.getCostOfActions(listeDirections+[succDirection])+heuristic(succNoeudCourant,problem) + # Si le noeud est encore dans la file, mettre a jour la priorite si elle devient inferieure + #print "Ajout du noeud a la file: ", succNoeudCourant + maFileEtat.push(succNoeudCourant,succCostChemin) + # Ajouter le nouveau chemin dans la file avec son cout + maFileChemin.push(listeDirections+[succDirection],succCostChemin) + elif (succNoeudCourant in [i[0] for i in maFileEtat.heap]): + maFileEtat.update(succNoeudCourant,succCostChemin) + listeDirections = maFileChemin.pop() + print "pas de solution" util.raiseNotDefined()