diff --git a/search/search.py b/search/search.py index 960d758..db5957c 100644 --- a/search/search.py +++ b/search/search.py @@ -130,12 +130,12 @@ def breadthFirstSearch(problem): while (not maFile.isEmpty()): # Extraire le noeud courant noeudCourant, listeDirections = maFile.pop() - print "Noeud courant: ", noeudCourant + #print "Noeud courant: ", noeudCourant # La marquer comme visite maListeFermee.append(noeudCourant) # Verifier si c'est un but if(problem.isGoalState(noeudCourant)): - print "Nous avons atteint le but !" + #print "Nous avons atteint le but !" return listeDirections # Effectuer la recherche de successeurs for s in problem.getSuccessors(noeudCourant): @@ -144,7 +144,7 @@ def breadthFirstSearch(problem): # Verifier si le noeud n'est pas deja visite et n'est pas dans la file if (succNoeudCourant not in maListeFermee+[i[0] for i in maFile.list]): # Dans ce cas, ajouter le noeud et le chemin pour s'y rendre a la file - print "Ajout du noeud a la file: ", succNoeudCourant + #print "Ajout du noeud a la file: ", succNoeudCourant maFile.push((succNoeudCourant,listeDirections+[succDirection])) print "pas de solution" util.raiseNotDefined() @@ -152,6 +152,46 @@ def breadthFirstSearch(problem): def uniformCostSearch(problem): """Search the node of least total cost 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]) + # 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() def nullHeuristic(state, problem=None):