Vous êtes sur la page 1sur 6

�����������

����������
�����������������
�����������������������������

2e édition 2003

© Groupe Eyrolles, 1994, 2003,


ISBN : 2-212-11385-4
Avant-propos

Les graphes sont actuellement l’outil privilégié pour modéliser des ensembles structurés
complexes. Ils sont indispensables si on veut représenter et étudier des relations entre des
objets. Leurs applications sont très nombreuses : modélisation de l’évolution d’un système
dans le temps (en économie, en automatique), réseaux divers (électriques, routiers, ou
d’adduction d’eau), décomposition en tâches d’un projet (en informatique, dans le bâtiment
et les travaux publics), liens entre informations dans les bases de données, etc.
A la base, les graphes sont des objets mathématiques étudiés par la théorie des graphes,
une branche des mathématiques discrètes. Cette théorie s’intéresse peu aux applications et
aux questions algorithmiques. Or, les applications pratiques des graphes sont nombreuses et
nécessitent des algorithmes de calcul spécialisés. Les micro-ordinateurs actuels rendent
possible l’utilisation des algorithmes de graphes par le plus grand nombre.
Dans ce livre, nous nous efforçons de rendre accessible l’algorithmique des graphes aux
non-spécialistes. Notre expérience du domaine et de l’enseignement nous a montré que,
contrairement à la théorie des graphes, l’algorithmique des graphes est beaucoup plus
simple, à condition d’être introduite pédagogiquement. La discipline est passionnante et ne
nécessite qu’une culture scientifique générale (niveau du premier cycle universitaire) et la
connaissance d’un langage classique de programmation, comme Pascal, C ou Fortran. Il
n’est donc pas utile de maîtriser la théorie des graphes pour utiliser les graphes !
Les applications des graphes à des problèmes de décision ou d’optimisation, ou l’étude de
quelques algorithmes de graphes sont assez souvent abordées dans les cursus universitaires
français. On peut formuler les critiques suivantes, selon les ouvrages :
Le sujet n’est traité que très partiellement (un seul chapitre dans un livre de
mathématiques financières par exemple).
Seuls quelques éternels “classiques” sont traités, avec une présentation ancienne
(problèmes de plus courts chemins, méthode d’ordonnancement PERT). Des problèmes
de graphes ayant pris une grande importance économique depuis vingt ans (en
production et logistique) ne sont pas traités, de même que des méthodes générales et
puissantes d’optimisation, comme le recuit simulé et le tabou.
2 ________________________________________________________ Algorithmes de graphes

Les algorithmes sont décrits trop souvent de manière littéraire et peu détaillée, pour une
application manuelle uniquement. Ils exigent encore un gros travail pour être
programmés, ce que ne peut accepter un ingénieur pressé.
Souvent, aucune application n’est mentionnée, ou alors le problème-type et l’algorithme
sont introduits pour résoudre un seul problème typique de la discipline (en sciences
économiques, en automatique, etc.). Il manque en fait des applications diverses d’un
même modèle, tous domaines confondus. Sans cela, quelqu’un d’une autre discipline ne
voit pas l’intérêt potentiel d’un modèle pour son travail.
Ce livre se veut essentiellement pratique. Il regroupe les problèmes de graphes les plus
courants, avec pour chacun d'eux un algorithme efficace accompagné d’un listing en
langage Delphi et de problèmes-tests. Des chapitres séparés regroupent les problèmes de
même nature (problèmes de chemins optimaux par exemple). Chaque problème est traité en
trois parties :
description du problème, domaines d’application connus ;
présentation théorique de l’algorithme (indépendante du langage de programmation) ;
listing de programme et exemple d’application commenté.
Le côté pratique n’empêche pas chaque algorithme d’être justifié et analysé en détail. Les
points délicats sont rassemblés dans la deuxième partie, qui peut être sautée par le lecteur
peu sûr de ses mathématiques ou peu intéressé par les justifications théoriques à la base de
la méthode. Un tel lecteur pourra cependant comprendre le problème type, consulter une
liste d’applications possibles, compiler et exécuter le programme sur un PC, le vérifier sur
un exemple commenté, puis appliquer le programme au domaine qui le concerne.
Pour rendre abordable la partie théorique de chaque problème, des chapitres généraux
fournissent au préalable tous les concepts de base nécessaires, et une bibliographie en fin
d’ouvrage permet aux plus curieux d’approfondir leurs recherches. L’ouvrage peut donc
être lu par un public assez large : étudiants de l’enseignement supérieur en sciences,
sciences économiques et de gestion, ingénieurs et informaticiens de profession, mais aussi
passionnés d’informatique et curieux ayant une bonne culture scientifique générale.
Le livre est une version complètement refondue de l’ouvrage Algorithmes de graphes avec
programmes en Pascal, de Christian Prins, publié aux éditions Eyrolles en 1994. A
l’époque, le langage Turbo Pascal avait été choisi pour les listings. Le choix de ce langage
structuré et clair était intentionnel, pour ne pas perturber la compréhension de l’algorithme
par trop de détails techniques dépendant du langage.
La question du langage s’est à nouveau posée quand Philippe Lacomme et Marc Sevaux se
sont joints au projet de refonte du livre. Nous avons hésité entre deux langages à objets très
répandus et bien adaptés au calcul scientifique : Delphi, le puissant successeur de Turbo
Pascal, et C++, devenu un standard industriel. Delphi a été choisi pour trois raisons : a) il
est plus simple que C++ pour des débutants, tout en ayant la même puissance d’expression ;
b) il dispose d’un environnement de développement pour Linux (Kylix) qui rend les sources
intégralement portables entre Windows et Linux (y compris l’interface utilisateur avec
menus et fenêtres); c) la reprise des sources du livre de 1994 était pour nous plus facile.
L’option Delphi a permis un CD-ROM d’accompagnement très riche, comprenant tous les
sources, les fichiers de données des exemples, ainsi que les compilateurs Delphi (pour
Avant-propos __________________________________________________________________ 3

Windows) et Kylix (pour Linux). Les sources fournis sont 100% compatibles Kylix. Pour
les lecteurs ne sachant pas programmer, un programme exécutable (graph_master)
permettant d’appeler tous les algorithmes du livre a été également inclus. Par
l’intermédiaire d’une interface graphique unique, l’utilisateur peut ainsi vérifier tous les
exemples du livre et traiter ses propres fichiers de données.
Les lecteurs adeptes d’autres langages peuvent facilement traduire les algorithmes, qui sont
toujours présentés en pseudo-langage général, avant de donner la traduction en Delphi.
Nous admettons volontiers qu’une version C++ de l’ouvrage serait utile. Ajouter des
sources C++ au livre n’était pas une bonne idée, car la conception des objets de base doit
être significativement différente pour tirer parti des avantages de C++. C’est pourquoi il a
été décidé de réaliser un livre distinct avec C++, dans un futur proche.
Concernant la conception des algorithmes, le livre présente l’intérêt d’utiliser un format
commun de données, c’est-à-dire une manière unique de représenter des graphes en
machine. Cette technique rend les algorithmes plus faciles à apprendre et à comprendre, et
raccourcit les listings (un algorithme pouvant être réutilisé en sous-programme dans un
autre). De plus, elle transforme les algorithmes en “ briques ” modulaires, emboîtables en
des programmes plus complexes. Par rapport au livre de 1994, ces aspects ont été renforcés
par l’utilisation de classes (objets) pour représenter les différents types de graphes.
Pour les problèmes disposant de plusieurs algorithmes, nous avons choisi ceux offrant les
meilleurs compromis entre simplicité et efficacité. Certains algorithmes ont également été
sélectionnés car ils sont représentatifs d’une classe très générale de méthodes
d’optimisation. Il en est ainsi des méthodes récentes du recuit simulé et du tabou, que nous
appliquons à des problèmes de tournées et à la coloration de graphes.
Les quatre premiers chapitres du livre fournissent les bases et concepts communs qui sont
ensuite utilisés systématiquement dans le reste de l’ouvrage. Le chapitre 1 introduit la
terminologie très particulière relative aux graphes. Ce langage des graphes ne présente pas
de difficultés et doit être maîtrisé car il est utilisé dans toutes les descriptions des problèmes
et des algorithmes.
Le chapitre 2 donne des notions sur la complexité des algorithmes et sur l’optimisation
combinatoire. Les problèmes de graphes se rattachent en effet à la grande classe des
problèmes d’optimisation combinatoire. Ces problèmes se répartissent en deux catégories:
ceux qui sont résolus de manière optimale par des algorithmes efficaces (rapides), et ceux
dont la résolution optimale peut prendre une durée exponentielle sur les grands cas.
Pour évaluer et classer les divers algorithmes disponibles pour un problème de graphe, il
faut une sorte de mesure de performance, appelée complexité d’un algorithme. Cette notion
et le concept de problème NP-complet qui en découle nous permettront de mieux
comprendre pourquoi certains problèmes ne disposent toujours pas d’algorithmes efficaces
à l’heure actuelle. Ces problèmes difficiles demandent des temps de calcul trop longs pour
être résolus de manière optimale dans tous les cas.
Le chapitre 3 est une présentation de deux classes de méthodes générales pour résoudre des
problèmes difficiles : les heuristiques et les méthodes arborescentes. Le chapitre 4 introduit
les aspects informatiques. Il explique comment on peut coder et stocker des graphes dans
les fichiers ou dans la mémoire d’un ordinateur. Il propose ensuite des objets adéquats en
4 ________________________________________________________ Algorithmes de graphes

Delphi. Ce chapitre a été conçu pour fournir au lecteur non-spécialiste des bases suffisantes
en programmation orientée objet en Delphi.
Tous les algorithmes des chapitres suivants utilisent les objets communs, ce qui facilite
l’interopérabilité. Le chapitre 4 décrit aussi des sous-programmes de service, qui vont nous
servir à alimenter en données et à tester nos algorithmes : lecture de graphes saisis au
préalable avec un éditeur et stockés dans des fichiers, génération aléatoire de graphes pour
créer de grands jeux d’essai sans avoir à les taper, écriture des résultats.
Le chapitre 5 est consacré aux manipulations de base sur les graphes. Il s’agit de tests de
structure, de classements ou de mise en ordre d’un graphe. Les algorithmes correspondants
seront souvent utilisés comme briques dans les algorithmes plus complexes des chapitres
suivants, consacrés aux divers problèmes d’optimisation dans les graphes.
Le chapitre 6 traite des problèmes de plus courts chemins. Il s’agit probablement des
problèmes de graphes les plus connus : qui n’a pas un distancier entre les principales villes
françaises dans son agenda ? Nous montrons comment les algorithmes de chemin peuvent
être combinés pour résoudre simplement des problèmes d’ordonnancement de projet de
type PERT (méthode du chemin critique).
Les problèmes de flots et de couplage ont de nombreuses applications et font l’objet du
chapitre 7. Supposons qu’on ait à préparer des itinéraires de délestage entre deux villes :
connaissant les débits possibles en nombre de véhicules par heure sur chaque route, on veut
savoir comment répartir la circulation sur les routes pour que le réseau ait le plus grand
débit total possible. Il s’agit d’un problème de flot maximal, pour lequel nous présentons
trois algorithmes, dont un classique dû à Ford et Fulkerson. Si dans l’exemple on cherche
en plus à minimiser le kilométrage total parcouru par l’ensemble des véhicules, on obtient
un problème de flot de coût minimal. L’algorithme de Busacker et Gowen permet de le
résoudre simplement et assez rapidement.
Ces algorithmes permettent aussi de résoudre à bon compte le problème dit d’affectation.
Les mutations dans certaines administrations en sont un exemple : les différents candidats
notent les postes disponibles par ordre de préférence, et le but est de trouver une affectation
équitable des candidats aux postes, maximisant la somme des notes. Nous verrons que ce
problème n’est qu’un cas particulier du problème de flot de coût minimal.
Les arbres et arborescences sont le sujet du chapitre 8. Les problèmes associés sont surtout
des conceptions de réseaux. Considérons un ensemble de puits de pétrole dans le désert. La
conception d’un réseau d’oléoducs connectant tous les puits avec une longueur totale
minimale est en fait un problème d’arbre recouvrant de coût minimal.
Le chapitre 9 traite de parcours particuliers dans les graphes, qui sont à la base de
nombreux problèmes d’optimisation rencontrés dans les transports. Les parcours eulériens
et chinois empruntent tous les arcs d’un graphe, on les rencontre par exemple dans le ra-
massage des ordures ménagères, où il faut passer par toutes les rues d’une ville.
Le célèbre Problème du Voyageur de Commerce consiste pour un représentant à visiter un
ensemble de villes, sans passer deux fois par une même ville, et en minimisant le
kilométrage parcouru. Il a de nombreuses applications. C’est le prototype même du
problème combinatoire difficile, et c’est le premier problème du livre, pour lequel il faudra
renoncer à une résolution optimale et recourir à des heuristiques.
Avant-propos __________________________________________________________________ 5

Le dernier chapitre est consacré au problème de coloration de graphe. Un exemple connu


est le célèbre problème des quatre couleurs : peut-on colorier les pays d’une carte de
géographie avec seulement quatre couleurs, sans que deux pays à frontière commune aient
la même couleur ? On sait depuis une vingtaine d’années que la réponse est oui. Pour des
graphes quelconques, le problème de coloriage reste difficile. On le rencontre dans des
problèmes de construction d’emploi du temps.
Une bibliographie complète l’ouvrage. Les références bibliographiques sont appelées dans
le texte par les trois premières lettres de l’auteur et l’année de parution, entre crochets. Par
exemple une publication de Dupont en 1984 sera référencée par [Dup84]. De nombreuses
références ont été ajoutées ou mises à jour, pour signaler de nouvelles éditions de certains
ouvrages, pour refléter les progrès très rapides dans certains domaines comme les
métaheuristiques (algorithmes génétiques notamment) et pour indiquer au lecteur des
ouvrages généraux intéressants sur Delphi et Kylix.

Vous aimerez peut-être aussi