Compter les chemins de longueur donnée
Exercice d'entraînement · niveau 3 (difficile) · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Graphes
Énoncé
Soit la matrice d'adjacence d'un graphe non orienté à sommets. Le coefficient de compte les chemins de longueur de à . Écrire puissance(A, k) avec np.dot, puis vérifier à la main sur le graphe d'arêtes , , , .
Corrigé
Le code.
import numpy as np
A = np.array([[0, 1, 0, 0],
[1, 0, 1, 1],
[0, 1, 0, 1],
[0, 1, 1, 0]])
def puissance(A, k):
n = np.shape(A)[0]
P = np.eye(n) # matrice identite : A puissance 0
for _ in range(k):
P = np.dot(P, A)
return P
print(puissance(A, 2))
Le résultat.
Vérification à la main de trois coefficients.
- : le seul chemin de longueur de à est , puisque est l'unique voisin de .
- : les chemins , et — le sommet a trois voisins.
- : aucun chemin de longueur ne joint à . Ils sont voisins, donc à distance ; un chemin de longueur devrait repasser par un sommet, or le seul voisin de est lui-même.
Pourquoi la formule est vraie. Par définition du produit matriciel,
Chaque terme vaut si est voisin à la fois de et de , et sinon : la somme compte donc exactement les sommets intermédiaires réalisant un chemin . Le raisonnement se poursuit par récurrence sur : , et l'on décompose un chemin de longueur en un chemin de longueur suivi d'une arête.
Deux points de vigilance. D'abord, np.dot(P, A) est le produit matriciel — l'opération P * A de numpy multiplierait coefficient par coefficient, ce qui n'a rien à voir et ne provoque aucune erreur. Ensuite, « chemin » s'entend ici au sens large : un même sommet peut être revisité, comme dans .
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.