Une chaîne reliant les mots 'ours' et 'cage'
Simulation :
Nous commencerons avec une liste de 110 mots de 4 lettres :
DICO = ["aime", "auge", "baie", "brie", "bris", "bure", "cage", "cale", "came", "cape",
"cime", "cire", "cris", "cure", "dame", "dime", "dire", "ducs", "dues", "duos",
"dure", "durs", "fart", "fors", "gage", "gaie", "gais", "gale", "gare", "gars",
"gris", "haie", "hale", "hors", "hure", "iris", "juge", "jure", "kart", "laie",
"lame", "lime", "lire", "loge", "luge", "mage", "maie", "male", "mare", "mari",
"mars", "mere", "mers", "mime", "mire", "mors", "muet", "mure", "murs", "nage",
"orge", "ours", "page", "paie", "pale", "pame", "pane", "pape", "pare", "pari",
"part", "paru", "pere", "pers", "pipe", "pire", "pore", "prie", "pris", "pues",
"purs", "rage", "raie", "rale", "rame", "rape", "rare", "rime", "rire", "sage",
"saie", "sale", "sape", "sari", "scie", "sure", "taie", "tale", "tape", "tare",
"tari", "tige", "toge", "tore", "tors", "tort", "trie", "tris", "troc", "truc"]
À faire : récupérer cette liste et l'écrire dans un script que vous aurez nommé : dico.py
Construction du graphe
Le graphe sera un dictionnaire dont les clés seront les mots de la liste et les valeurs les mots de la liste qui ne diffèrent que d'une lettre ( sans changer de place) de la clé.
À faire :
Écrire ce nouveau script, dans le même dossier que dico.py
Ce script crée le graphe souhaité
import dico
def distance(mot1,mot2,k):
# calcule la distance entre 2 mots de k lettres
i = 0
dist = 0
while i < k:
if mot1[i] != mot2[i]:
dist = dist + 1
i =i + 1
return dist
def creation():
# crée le dictionnaire des mots adjacents au mot de la liste
g={}
for element1 in dico.DICO:
liste=[]
for element2 in dico.DICO:
if distance(element1,element2,4) == 1:
liste.append(element2)
g[element1] = liste
return g
graphe=creation()
print(graphe['ours'])
pour le mot 'ours
' on obtient la liste :
['durs', 'murs', 'purs']
Le parcours du graphe
Nous avons deux parcours possibles : le parcours en profondeur et le parcours en largeur.
Avec un parcours en profondeur
Rappelons l'algorithme
fonction parcours_profondeur(graphe,sommet):
liste_visité <-- liste vide
liste_fermé <-- liste vide
p <-- pile
on empile p avec le sommet
on ajoute le sommet à la liste_visité
tant que la pile n'est pas vide:
tmp <-- le sommet de la pile
voisins <-- liste des voisins de tmp
si voisins n'est pas vide:
v <-- un voisin au hasard
on ajoute v à liste_visité
on empile v
sinon:
liste_fermé <-- tmp
on dépile p
retourner liste_fermé
On a donc besoin d'une pile
Il nous faudra mémoriser les sommets visités et leur parents
Il nous faudra également un moyen de savoir si on a trouvé une solution
Il faudra également afficher le résultat...
Pour la pile, il suffit de récupérer la classe pile.
Pour les sommets visités et leur parents, on utilisera un dictionnaire : clé un sommet et sa valeur son parent.
Une variable booléenne fera l'affaire pour savoir si on a trouvé ou pas
On affichera le résultat sous forme d'une liste allant du premier sommet au dernier.
Voici le script :
###########################################################
#rajouter votre classe pile ici
############################################################
def Solution(end, parents):
"""
"""
solution = []
courant = end
while courant != None:
solution = [courant] + solution
courant = parents[courant]
return solution
def solve(graphe,depart, arrivee):
"""
"""
candidats=Pile()
candidats.empiler(depart)
visite = dict()
visite[depart] = None
trouve = False
while candidats.vide()==False and not trouve:
courant = candidats.depiler()
if courant == arrivee:
trouve = True
else:
for value in graphe[courant]:
if not value in visite and not value in candidats.L:
visite[value] = courant
candidats.empiler(value)
if trouve:
return Solution(arrivee, visite)
else:
return None
solve(graphe,'ours','cage')
À faire :
Rajouter ce code à votre script ( n'oubliez pas d'y écrire votre classe pile)
et vérifier que la chaîne obtenue est :
['ours', 'purs', 'pers', 'pere', 'pore', 'tore', 'tors', 'mors', 'mars', 'mare', 'rare', 'rire', 'rime', 'lime', 'lame', 'pame', 'pape', 'tape', 'tale', 'sale', 'saie', 'gaie', 'gage', 'cage']
La solution obtenue n'est pas la plus courte puisque :
['ours', 'murs', 'mars', 'mare', 'mage', 'cage']
est une chaîne qui est bien plus courte ...
Simulation : Avec un parcours en largeur
À faire :
Modifier le script précédent pour y appliquer un parcours en largeur et trouver la chaîne la plus courte...
Simulation : Avec des mots de 6 lettres
Exercice
Sauriez-vous trouver l'échelle de mots la plus courte entre 'RENARD' et 'POULET' à partir du graphe se trouvant dans ce fichier : graphe6.py pour les pressés
Ou si vous n'êtes pas pressé depuis ce fichier qui contient la liste des mots de 6 lettres du dictionnaire du scrabble
Complément : Prolongement...Projets envisageables
S'intéresser au mots de 7 lettres
Trouver parmi les chaînes les plus courtes, la plus longue...