################################################################################# print "Chargement du module objet et noeud pour la recherche" ################################################################################# import math import copy class Element: ## Constructeur ## @param nom le nom de l'objet ATTENTION Utilisez comme identificateur!!!! ## @param posX la position sur l'axe X ## @param posY la position sur l'axe Y def __init__(self, nom, posX, posY): self.nom = nom self.posX = posX self.posY = posY self.voisins = [] ## ajoute un voisin à la liste ## @param voisin le voisin à ajouter def ajouteVoisin(self,voisin): self.voisins.append(voisin) ## verfie si un objet a un nom egale a un_nom ## @param un_nom le lnom que l'on veut verifier ## @ret true <=> self a un nom = a un_nom def verifieNom(self,un_nom): return un_nom == self.nom ## retourne la distance euclidienne entre self et un object passé en parametre ## @param objet l'object eu question ## @ret distance euclidienne entre self et objet def distanceEuclidienne(self,other): return math.sqrt(pow(self.posX-other.posX, 2)+pow(self.posY-other.posY,2)) class Noeud: ## Constructeur ## @param refElementt une reference à un element qui represente le noeud ## @param coutC le cout c(n) ## @param coutF le cout c(n)+h(n) ## compare deux objets def __init__(self, refElement, coutC=0,coutF=0): self.refElement = refElement self.coutC = coutC self.coutF = coutF ## retourne une representation en string def __str__(self): return ("noeud <%s,%s,%s>" % (self.refElement.nom, self.coutC, self.coutF)) ## compare deux objets def __cmp__(self, n2): return cmp(self.coutF, n2.coutF) ## test si un noeud est une solition ## @param refElement l'element reference equivalent à la destination final ## @ret true <=> self est l'objet final def estUneSolution(self,refElement): return self.refElement == refElement ## met à jour le cout c(n) du noeud passée en parametre ## @param succ le noeud à mettre à jour def metAJourCoutC(self,succ): succ.coutC = self.coutC + self.refElement.distanceEuclidienne(succ.refElement) ## met à jour le cout f(n)=c(n)+h(n) du noeud passée en parametre ## h(n)=distance euclidienne entre self et le but ## @param succ le noeud à mettre à jour def metAJourCoutF(self,succ): succ.coutF = succ.coutC + self.refElement.distanceEuclidienne(succ.refElement) ## retourne tous les voisins du noeud ## param but la ville de dstination def successeurs(self,but): l = [] for ro in self.refElement.voisins: n = Noeud(ro) self.metAJourCoutC(n) but.metAJourCoutF(n) l.append(n) return l