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*")