Graphes 10 : Choisir et vérifier un algorithme

Reconnaître un algorithme dans un cours est plus facile que choisir le bon devant une nouvelle situation. Un énoncé parle de routes, de câbles ou de livraisons ; il n'annonce pas toujours la quantité à optimiser. Ce dernier chapitre propose une méthode de décision. Nous partirons de la question, vérifierons les hypothèses, comparerons les ressources et construirons un petit certificat pour contrôler la réponse.

1. Écrire d'abord ce que signifie une solution

Objectif et contrainte. L'objectif est la quantité que l'on veut minimiser ou maximiser. Une contrainte décrit une condition obligatoire d'une solution acceptable. Deux problèmes utilisant le même graphe peuvent avoir des objectifs et des contraintes entièrement différents.

Pour une livraison, « trouver le meilleur trajet » reste trop vague. Cherche-t-on le moins de correspondances, la dépense minimale ou la visite de tous les clients ? Pour installer un réseau, veut-on minimiser les câbles, conserver des trajets rapides ou résister à une panne ? Chaque formulation demande un objet différent : un chemin, un ensemble d'arêtes, un ordre de tâches ou une répartition de quantités.

Une bonne phrase de départ précise l'entrée, la sortie et le critère de réussite. Par exemple : « Étant donnés des arcs de coûts non négatifs et une source, produire les coûts minimaux vers les sommets accessibles ». Cette phrase oriente vers Dijkstra et évite de lui demander implicitement une tournée complète.

Nommer l'objet de sortie avant de chercher le nom de l'algorithme : chemin, ordre, arbre, composantes ou flot.

2. Vérifier les hypothèses avant de comparer les vitesses

Précondition. Une précondition est une propriété que les données doivent satisfaire pour que les garanties annoncées s'appliquent. Un algorithme rapide mais utilisé hors de ses préconditions ne fournit pas une solution fiable.

BFS minimise un nombre de liaisons lorsque chaque liaison compte pareil. Dijkstra accepte des coûts positifs ou nuls. Bellman-Ford accepte les poids négatifs, mais doit signaler les sommets affectés par un circuit absorbant accessible. Floyd-Warshall produit toutes les paires et doit interpréter sa diagonale avant d'annoncer les distances.

Un ordre topologique exige un graphe orienté sans cycle. Un arbre couvrant minimal concerne un réseau non orienté ; si le réseau est déconnecté, on obtient une forêt. Un flot exige des capacités non négatives, une source et un puits distincts, ainsi que des contraintes de conservation. Ces conditions ne sont pas des détails que l'on ajoute après le calcul.

Vérifier toutes les données peut demander du travail, mais cette dépense est souvent linéaire dans leur taille. Elle évite une réponse plausible et fausse. Dans une application, le contrat d'entrée peut garantir certaines propriétés ; il faut alors savoir où elles sont contrôlées et ce qui se produit si elles deviennent invalides.

3. Utiliser une grille de choix

Choisir selon la question
QuestionMéthodeHypothèse
Nombre minimal de liaisonsBFSChaque liaison compte pareil
Explorer, détecter des cyclesDFSAdapter le test à l’orientation
Ordre de dépendancesDFS, fins inverséesGraphe orienté sans cycle
Coûts depuis une sourceDijkstraPoids non négatifs
Coûts avec poids négatifsBellman-FordDiagnostiquer les cycles accessibles
Toutes les pairesFloyd-WarshallInterpréter la diagonale
Installation minimaleKruskal ou PrimNon orienté, forêt si déconnecté
Débit maximalEdmonds-KarpCapacités et conservation

Le tableau est une aide, pas un détecteur automatique fondé sur quelques mots. Le mot « minimum » apparaît dans plusieurs problèmes. La question « relier tous les sites au moindre coût » peut désigner des câbles installés ou une tournée qui visite chaque site. Le premier cas correspond à un arbre couvrant minimal ; le second ne se résout généralement pas par Kruskal.

4. Lire les complexités avec leurs hypothèses de stockage

Borne asymptotique. Une borne en O décrit une croissance lorsque la taille des données augmente. Elle ne prédit pas à elle seule le temps réel. Ici, n désigne les sommets et m les liaisons ; les coûts affichés supposent les structures indiquées.
Synthèse des questions et des coûts des algorithmes.
Le tableau précise les structures et la mémoire. Cliquer pour agrandir.
Coûts asymptotiques : n sommets, m liaisons
AlgorithmeVarianteTempsMémoire auxiliaire
BFS / DFSListesO(n + m)O(n)
Tri topologique DFSListes, DAGO(n + m)O(n)
DijkstraTas à diminution de cléO((n + m) log n)O(n)
DijkstraMatrice, minimum linéaireO(n²)O(n)
Bellman-FordPassages sur les arcsO(nm) + O(n) initialisationO(n), sans historique
Floyd-WarshallMatriceO(n³)O(n²)
KruskalTri + union-findO(m log m) + O(m α(n)) + O(n)O(n), hors tri et arêtes
PrimTas à diminution de cléO((n + m) log n)O(n)
PrimMatriceO(n²)O(n)
Edmonds-KarpListes résiduellesO(nm²)O(n + m)

BFS et DFS exploitent des listes d'adjacence pour visiter le graphe en O(n + m). Une matrice peut faire passer ce travail à O(n²). Dijkstra et Prim profitent d'une file de priorité ; la version à sélection linéaire reste parfois simple et efficace sur un petit graphe dense. Kruskal paie principalement le tri de toutes les arêtes.

Bellman-Ford effectue plusieurs balayages des arcs. Floyd-Warshall paie un coût cubique même si beaucoup de liaisons sont absentes. Edmonds-Karp utilise BFS dans un réseau résiduel, mais ce BFS se répète après les augmentations : sa complexité globale n'est donc pas celle d'un seul parcours.

5. Construire des contrôles indépendants

Certificat et vérification croisée. Un certificat est une information permettant de contrôler une réponse. Une vérification croisée compare plusieurs méthodes indépendantes sur les mêmes données. Un accord est un contrôle utile ; il ne remplace pas une preuve générale de correction.

Pour un chemin annoncé, vérifiez que chaque liaison existe dans le bon sens et que la somme des poids correspond au coût publié. Pour BFS, les niveaux doivent respecter l'organisation par couches. Pour un ordre topologique, chaque arc doit pointer d'un sommet placé plus tôt vers un sommet placé plus tard.

Pour un arbre couvrant, contrôlez la présence de tous les sommets, l'absence de cycle, la connexité et le nombre d'arêtes. Kruskal et Prim doivent donner le même coût minimal, même si leurs choix diffèrent en cas d'égalité. Sur un tout petit graphe, on peut énumérer les candidats pour ajouter une vérification exhaustive.

Pour les distances positives, comparez Dijkstra à Bellman-Ford. Pour toutes les paires, comparez chaque ligne de Floyd-Warshall à un calcul depuis la source correspondante. Pour un flot, vérifiez les capacités et la conservation, puis exhibez une coupe de capacité égale à la valeur trouvée. Cette dernière égalité prouve directement l'optimalité.

6. Tester les cas qui exposent les erreurs

Cas limite. Un cas limite est une donnée simple ou particulière qui met en évidence une hypothèse oubliée. Il aide à détecter les erreurs que de grands exemples peuvent masquer sous beaucoup de résultats.

Essayez un sommet isolé, un graphe déconnecté, des poids nuls, plusieurs solutions de même coût et des arcs à sens unique. Pour les poids négatifs, testez séparément un arc négatif sans cycle, un cycle accessible et un cycle situé hors de la zone accessible. Ces situations demandent des statuts différents.

Le contre-exemple S → A de poids 2, S → B de poids 5 et B → A de poids −4 vérifie réellement l'échec de Dijkstra classique : A est figé à 2 alors que le coût minimal vaut 1. Un exemple contenant simplement une valeur négative ne suffit pas à montrer un échec ; il faut exécuter la version précise de l'algorithme.

7. Présenter une solution que l'on peut relire

Décrire les sommets, les liaisons et les unités
Formuler la sortie et l'objectif
Vérifier les préconditions
Choisir représentation et algorithme
Exécuter en conservant une trace utile
Contrôler la réponse par un certificat
Annoncer temps, mémoire et situations impossibles

La trace utile dépend de la question. Pour Dijkstra, montrez les finalisations et les améliorations. Pour Kruskal, montrez les arêtes acceptées ou refusées et les groupes. Pour un flot, montrez les chemins augmentants, leurs goulots et la coupe finale. Une liste de nombres sans convention ni état initial est difficile à vérifier, même si chaque nombre est exact.

À retenir. Le choix part de l'objectif et des préconditions. Le stockage détermine une partie des coûts. Les résultats doivent être accompagnés d'une interprétation et d'un contrôle. Un sommet inaccessible, un cycle négatif ou un graphe déconnecté sont des réponses à expliquer, pas des nombres à inventer.
Réponse valide : contraintes satisfaites ; certificat : optimalité justifiée.

Exercices corrigés

Exercice 1 : Identifier l'objectif

On veut le moins de correspondances entre deux stations, chaque liaison comptant une étape. Quel outil convient ?

Voir le corrigéMasquer le corrigé

BFS convient : il minimise le nombre de liaisons. Il faut suivre le sens des arcs si certaines liaisons sont à sens unique. Les prix éventuels sont hors de l'objectif ; les minimiser demanderait un problème pondéré distinct.

Exercice 2 : Préparer de nombreuses requêtes

Un petit réseau orienté doit répondre à des coûts entre tous les couples. Certains arcs sont négatifs. Quel calcul proposer ?

Voir le corrigéMasquer le corrigé

Floyd-Warshall est adapté à un résultat toutes paires de taille raisonnable. Il faut vérifier la diagonale et signaler les couples affectés par un cycle négatif. Une matrice finie ne doit pas masquer un coût non borné.

Exercice 3 : Contrôler une installation

Deux programmes renvoient des arbres différents de même coût. Est-ce nécessairement une erreur ?

Voir le corrigéMasquer le corrigé

Non. Des égalités de poids peuvent produire plusieurs arbres minimaux. Vérifiez que chaque sortie couvre tous les sommets, est connexe et sans cycle, puis comparez les coûts à une borne ou à une méthode indépendante.

Exercice 4 : Refuser une fausse conclusion

Un flot laisse de la place sur un arc arrivant au puits. Peut-on conclure que le flot n'est pas maximal ?

Voir le corrigéMasquer le corrigé

Non. Il faut un chemin augmentant complet depuis la source. Dans notre réseau, BT garde une unité libre, mais la coupe sortant de S est déjà saturée à 15. Cette coupe prouve qu'aucune augmentation globale n'est possible.

Voir le programme complet · Faire les 30 exercices du TD

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
★ ★ ★ ★ ★
2 votes. Moyenne 5 sur 5.

Ajouter un commentaire

Anti-spam