Newer
Older
ai / lab5 / recherche.py
@Andreas Jaggi Andreas Jaggi on 1 May 2006 3 KB Added lab 5
# -*- 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*")