diff --git a/lab5/carte.py b/lab5/carte.py new file mode 100644 index 0000000..b25811c --- /dev/null +++ b/lab5/carte.py @@ -0,0 +1,56 @@ +###------------------------------------------------------------------- +## Les villes. +###------------------------------------------------------------------- +villes=Villes() +villes.construitVille("A", 0, 16) +villes.construitVille("B", 5, 13) +villes.construitVille("C", 0, 10) +villes.construitVille("D", 5, 8) +villes.construitVille("E", 11, 18) +villes.construitVille("F", 15, 13) +villes.construitVille("G", 29, 18) +villes.construitVille("H", 26, 0) +villes.construitVille("I", 12, 10) +villes.construitVille("J", 17, 7) +villes.construitVille("K", 11, 3) +villes.construitVille("L", 22, 16) +villes.construitVille("M", 25, 12) +villes.construitVille("N", 24, 6) +villes.construitVille("O", 20, 0) +villes.construitVille("P", 5, 0) +print "\tVilles ajoutees" +###------------------------------------------------------------------- +## Les routes. +###------------------------------------------------------------------- + +villes.construitRoute("A","B") +villes.construitRoute("A","E") +villes.construitRoute("B","C") +villes.construitRoute("B","E") +villes.construitRoute("B","D") +villes.construitRoute("C","D") +villes.construitRoute("C","P") +villes.construitRoute("D","I") +villes.construitRoute("D","K") +villes.construitRoute("E","F") +villes.construitRoute("E","L") +villes.construitRoute("F","I") +villes.construitRoute("F","L") +villes.construitRoute("F","M") +villes.construitRoute("G","H") +villes.construitRoute("G","L") +villes.construitRoute("G","M") +villes.construitRoute("I","J") +villes.construitRoute("J","K") +villes.construitRoute("J","N") +villes.construitRoute("K","O") +villes.construitRoute("K","P") +villes.construitRoute("M","N") +villes.construitRoute("N","O") +villes.construitRoute("B","I") +villes.construitRoute("B","F") +villes.construitRoute("P","O") +print "\tRoutes ajoutees" +###------------------------------------------------------------------- +### FIN DU FICHIER +###------------------------------------------------------------------- diff --git a/lab5/libRecherche.py b/lab5/libRecherche.py new file mode 100644 index 0000000..c16535d --- /dev/null +++ b/lab5/libRecherche.py @@ -0,0 +1,83 @@ +################################################################################# +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 diff --git a/lab5/personne.py b/lab5/personne.py new file mode 100644 index 0000000..2629147 --- /dev/null +++ b/lab5/personne.py @@ -0,0 +1,57 @@ +# -*- encoding: iso-8859-15 -*- +class Personne: + def __init__(self,nom,age): + self.nom = nom + self.age = age + + def anniversaire(self): + self.age+=1 + +class Retourner: + def __init__(self, object): + self.object = object + + def __getattr__(self, name): + def proxy(*args, **kwds): + getattr(self.object, name)(*args, **kwds) + return self.object + return proxy + +class Etudiant(Personne): + + def __init__(self,nom,age,section): + Personne.__init__(self,nom,age) # heritage + self.section=section + + def __str__(self): + out = "Etudiant %s a %d et est en section: %s\n" % (self.nom, self.age,self.section) + return out + + def __cmp__(self,e2): + return cmp(self.age,e2.age) + + def changeSection(self, nouvelleSection): + self.section=nouvelleSection + +etudiants=[] + +def afficheEtudiants(): + print "Listes des �tudiants:\n" + for etud in etudiants: + print "\t", etud + +toto = Etudiant("Toto",23,"SSC") +print toto +toto.anniversaire() +toto.changeSection("INF") +print toto + +titi = Etudiant("Titi",22,"SSC") +tata = Etudiant("Tata",25,"SSC") + +etudiants=[toto,titi,tata] +print etudiants.sort() + +etudiants=[toto,titi,tata] +etudiants = Retourner(etudiants).sort() +afficheEtudiants() diff --git a/lab5/recherche.py b/lab5/recherche.py new file mode 100644 index 0000000..7883025 --- /dev/null +++ b/lab5/recherche.py @@ -0,0 +1,128 @@ +# -*- encoding: iso-8859-15 -*- +import libRecherche +import copy +################################################################################# +print "Chargement du module de recherche" +################################################################################# +class VILLE_PAS_TROUVE(Exception): + def __init__(self,nom): + self.nom=nom + +ECHEC='echec' + +CARTE={} + + +class Ville(libRecherche.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 + ## @param voisins autre object accesible depuis self par un arc + def __init__ (self, nom, posX, posY): + libRecherche.Element.__init__(self, nom, posX, posY) + + ## retourne une representation en string + def __str__ (self): + return ("ville <%s, %d, %d>" % (self.nom, self.posX, self.posY)) + +class retourner: + + def __init__(self, object): + self.object = object + + def __getattr__(self, name): + def proxy(*args, **kwds): + getattr(self.object, name)(*args, **kwds) + return self.object + return proxy + + +class Villes: + ## Constructeur + ## instantie un attribut villes qui sera un dictionnaire avec la clef=ville.nom et valeur=objet_ville + def __init__(self): + CARTE = {} + + ## Construit et ajoute la ville au dictionnaire villes + ## param nom le nom de la ville + ## @param posX la position de la ville sur l'axe X + ## @param posY la position de la ville sur l'axe Y + def construitVille(self,nom, posX, posY): + v = Ville(nom, posX, posY) + CARTE[nom] = v + + ## chereche et retourne la ville associ� a un nom + ## @param nom le nom de la ville + ## @ret la ville se elle est dans le dictionnaire; sinon -1 + def chercheVille(self,nom): + return CARTE.get(nom, VILLE_PAS_TROUVE) + + ## definit une route ( un arc) entre deux villes + ## @param nom_ville1 le nom de la ville no 1 + ## @param nom_ville2 le nom la ville no 2 + def construitRoute(self,nom_ville1,nom_ville2): + a = self.chercheVille(nom_ville1) + b = self.chercheVille(nom_ville2) + a.ajouteVoisin(b) + b.ajouteVoisin(a) + + + ## imprime toutes less villes avec leur connection + def imprimeLesVilles(self): + for v in CARTE.itervalues(): + print v + +## Algorithm de recherche +## @param depart ville de depart +## @param but ville d'arrivee +## @param methode la m�thode utilisee (DFS,BFS,A*) +def recherche(depart, but, methode): + Q = [libRecherche.Noeud(depart)] + but = libRecherche.Noeud(but) + while Q: + n = Q.pop(0) + #print "working on: %s\n" % n + if n.refElement.nom == but.refElement.nom: + return n + else: + S = n.successeurs(but) + Q = ajouteSuccesseurs(Q,S,methode) + return ECHEC + +## Algorithm de recherche optimise +## Verifie chaque noeud ne soit visit� qu'une seule fois +## @param depart ville de depart +## @param but ville d'arrivee +## @param methode la m�thode utilisee (DFS,BFS,A*) +def rechercheOptimisee(depart, but, methode): + pass + + +## ajoute les succeseurs S a Q suivant la methode de recherche +## @param Q la liste initiale +## @param S la liste des successeurs +## @param methode la m�thode de recherche +def ajouteSuccesseurs(Q,S,methode): + if methode == "DFS": + return S + Q + if methode == "BFS": + return Q + S + if methode == "A*": + Q = Q + S + return Q.sort() + return ECHEC + + +execfile("carte.py") +villes=Villes() +villes.imprimeLesVilles() +start=villes.chercheVille("A") +print "D�but=", start +fin = villes.chercheVille("P") +print "But=", fin +print "Recherche avec DFS=\n", recherche(start,fin,"DFS") +print "Recherche avec BFS=\n", recherche(start,fin,"BFS") +print "Recherche optimis�e avec BFS=\n", rechercheOptimisee(start,fin,"BFS") +print "Recherche avec A*=\n", recherche(start,fin,"A*") +print "Recherche optimis�e avec A*=\n", rechercheOptimisee(start,fin,"A*")