Adloun

Une marche au hasard sur un graphe

Exercice d'entraînement · niveau 3 (difficile) · mathématiques appliquées (ECG 1re année), chapitre 3 — Théorie des graphes · Graphes en Python

Énoncé

On se promène sur un graphe non orienté connexe : à chaque étape, on passe du sommet courant à l'un de ses voisins, tiré au hasard de façon équiprobable. Écrire une fonction marche(A, depart, N) qui effectue pas et renvoie les fréquences de visite des sommets. Les comparer, sur le graphe d'arêtes , aux quotients .

Corrigé

Le programme.

import numpy.random as rd

def voisins(A, s):
    return [j for j in range(len(A)) if A[s][j] == 1]

def marche(A, depart, N):
    n = len(A)
    visites = [0] * n
    s = depart
    for _ in range(N):
        v = voisins(A, s)
        s = v[rd.randint(0, len(v))]   # entier tire dans 0, 1, ..., len(v)-1
        visites[s] = visites[s] + 1
    return [visites[i] / N for i in range(n)]

rd.randint(0, k) tire un entier dans : chaque voisin a donc la probabilité d'être choisi, ce qui est bien l'équiprobabilité demandée.

Le graphe de l'énoncé. Les degrés valent , , , , de somme avec . Les quotients valent donc , , et . En numérotant les sommets de à , la matrice est [[0,1,1,0],[1,0,1,0],[1,1,0,1],[0,0,1,0]].

Ce qu'on observe. Pour , les fréquences renvoyées sont proches de ces quatre valeurs, à quelques millièmes près : le sommet , le plus connecté, est le plus visité ; le sommet , au bout de sa branche, le moins. Une simulation ne démontre rien — elle détecte les erreurs de modèle. Si le graphe n'était pas connexe, la marche resterait enfermée dans sa composante et les autres sommets auraient une fréquence nulle quel que soit .

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.