Exercice 2 : Parcours de graphes et complexité
🌐 Énoncé du problème / Étude de cas
Section titled “🌐 Énoncé du problème / Étude de cas”On s’intéresse à la modélisation et à l’analyse de réseaux de communication à grande échelle, par exemple l’interconnexion de centres de données (datacenters) mondiaux. Un tel réseau est modélisé par un graphe orienté , où représente l’ensemble des serveurs () et l’ensemble des liaisons haut débit orientées ().
Dans le cadre d’une transition énergétique et d’une optimisation des coûts d’infrastructure, l’opérateur du réseau souhaite acheminer un flux de données critique entre un serveur source et un serveur destination en minimisant la consommation énergétique globale, tout en évitant la saturation des liaisons.
Chaque liaison est caractérisée par :
- Sa capacité maximale de transmission (exprimée en ).
- Sa fonction de coût énergétique par unité de flux . Pour des raisons de simplification du modèle, on supposera dans un premier temps que le coût est constant et égal à .
Cependant, les ingénieurs alertent sur le fait que le modèle théorique d’un graphe statique omet la variabilité temporelle de la charge et la dégradation thermique des serveurs, qui introduisent des incertitudes majeures.
❓ Questions progressives
Section titled “❓ Questions progressives”-
Représentation et complexité spatiale Justifier le choix de la structure de données pour représenter le graphe en mémoire sachant que le réseau est généralement creux (c’est-à-dire que le nombre de liaisons est très inférieur à , typiquement ). Évaluer la complexité spatiale de cette représentation.
-
Parcours en largeur (BFS) et accessibilité On souhaite déterminer s’il existe un chemin du serveur vers le serveur en ignorant les capacités et les coûts. Écrire en OCaml une fonction
est_accessibleutilisant un parcours en largeur (BFS) qui renvoie un booléen indiquant si est atteint depuis . Préciser sa complexité temporelle et spatiale en fonction de et . -
Recherche de plus court chemin (Dijkstra) On suppose désormais que les liaisons possèdent un coût strictement positif . On souhaite trouver un chemin minimisant la somme des coûts entre et . Rappeler le principe de l’algorithme de Dijkstra. Quel est l’impact de l’utilisation d’un tas binaire (file de priorités) sur la complexité temporelle de l’algorithme ? Expliciter cette complexité.
-
Analyse critique et limites du modèle énergétique Question d’ingénierie et de modélisation : Le coût énergétique d’une liaison a été supposé constant. En réalité, la consommation électrique d’un équipement réseau ne croît pas de manière linéaire avec le flux en raison de coûts fixes d’allumage et de rendements non-linéaires à forte charge. Discuter des limites de la modélisation par plus court chemin classique dans ce contexte et proposer une modification qualitative de l’approche algorithmique.
💡 Pistes & Indications
Section titled “💡 Pistes & Indications”- Q1 : Penser à la différence entre matrice d’adjacence et listes d’adjacence pour un graphe creux.
- Q2 : Le BFS nécessite une file (queue) pour stocker les sommets à visiter et un tableau de booléens (ou une table de hachage) pour marquer les sommets visités afin d’éviter les boucles.
- Q3 : Rapporer que l’extraction du minimum dans un tas binaire se fait en et la mise à jour d’une clé en .
- Q4 : Si le coût marginal dépend du flux total traversant l’arête (fonctions convexes ou non-linéaires), l’algorithme de Dijkstra (basé sur l’optimalité sous-structurelle de chemins à coûts additifs indépendants du flux) ne s’applique plus directement. Il faut se tourner vers des flots à coût minimum.
📋 Corrigé détaillé et analyse des résultats
Section titled “📋 Corrigé détaillé et analyse des résultats”1. Représentation et complexité spatiale
Section titled “1. Représentation et complexité spatiale”Puisque le graphe est creux (), une matrice d’adjacence de taille occuperait un espace mémoire de , ce qui est prohibitif pour des réseaux de grande taille ( serveurs). On privilégie donc les listes d’adjacence, où chaque sommet associe la liste de ses voisins sortants.
- Complexité spatiale : . Pour un graphe creux, cela se réduit à , ce qui est optimal.
2. Parcours en largeur (BFS) en OCaml
Section titled “2. Parcours en largeur (BFS) en OCaml”(* On représente le graphe par un tableau de listes d'adjacence (sommets numérotés de 0 à n-1) *)let est_accessible (graphe : int list array) (s : int) (t : int) : bool = let n = Array.length graphe in let visite = Array.make n false in let file = Queue.create () in
Queue.push s file; visite.(s) <- true;
let trouve = ref false in while not (Queue.is_empty file) && not !trouve do let u = Queue.pop file in if u = t then trouve := true else List.iter (fun v -> if not visite.(v) then begin visite.(v) <- true; Queue.push v file end ) graphe.(u) done; !trouve- Complexité temporelle : car chaque sommet est enfilé/défilé au plus une fois, et chaque arête est examinée une fois (dans les graphes orientés).
- Complexité spatiale : pour le tableau de marquage
visiteet lafile.
3. Plus court chemin (Dijkstra)
Section titled “3. Plus court chemin (Dijkstra)”L’algorithme de Dijkstra maintient une estimation des distances minimales depuis vers tous les autres sommets en relaxant progressivement les arêtes à partir d’un sommet non visité de distance minimale.
- Avec un tas binaire, chaque sommet est inséré et extrait du tas une fois (), et chaque arête entraîne au plus une mise à jour de priorité dans le tas ().
- Complexité temporelle totale : .
4. Analyse critique et limites du modèle énergétique
Section titled “4. Analyse critique et limites du modèle énergétique”- Limites du modèle : Supposer constant revient à ignorer la convexité réelle de la consommation énergétique des équipements réseau (loi d’Ohm généralisée, dissipation thermique, seuils d’activation des ventilateurs). De plus, si le coût d’une liaison dépend du volume de données déjà routé (saturation progressive), le principe d’optimalité de Bellman utilisé par Dijkstra (un sous-chemin d’un plus court chemin est lui-même un plus court chemin) est violé.
- Piste corrective : Il convient de modéliser le problème comme un problème de flot à coût minimum (Minimum Cost Flow Problem). Si les fonctions de coût sont convexes et différentiables, des méthodes de programmation linéaire ou des algorithmes de dualité (comme le prefetch de push-relabel généralisé) doivent être employés, au prix d’une complexité algorithmique plus élevée (). L’ingénieur doit donc arbitrer entre la fidélité du modèle énergétique et la tratabilité algorithmique en temps réel.