Sous-sections
Mots clés : algorithmique,
mathématiques discrètes, optimisation combinatoire, théorie
des graphes, algorithmique parallèle, algorithmique
distribuée .
Cet axe s'appuie sur les trois disciplines étroitement
interconnectées que sont les Mathématiques Discrètes,
l'Algorithmique et l'Optimisation Combinatoire. Si leurs
frontières communes sont assez floues, en revanche, les
techniques et les outils que l'on y trouve couvrent un champ
très vaste et sont utilisés dans de nombreux domaines
d'application.
Par exemple, les réseaux de communication (réseaux
d'interconnexion de processeurs ou réseaux de
télécommunication) sont souvent modélisés par des graphes ou
leurs généralisations (hypergraphes, graphes valués).
Rappelons qu'un graphe (resp. graphe
orienté) G = (V,
E) est défini par un ensemble V de sommets et un ensemble
E d' arêtes (resp.
arcs) formé de paires (resp. couples) de sommets.
Typiquement, un sommet représentera un processeur, un
routeur, un abonné, un central ou un commutateur, une arête
représentera une liaison physique ou virtuelle de
communication entre les éléments représentés par les sommets.
On peut être amené à rajouter des informations sur les
sommets ou les arêtes. Par exemple, on place des valuations
sur les arêtes qui correspondront à des capacités ou des
largeurs de bande, ou on utilise des couleurs sur des chemins
correspondant dans une fibre optique à la longueur d'onde
qu'ils utilisent.
Un hypergraphe H =
(V, E') est une généralisation des
graphes où la cardinalité des éléments de E' peut être plus grande que
2. Ces objets combinatoires
permettent de modéliser des entités du monde réel bien au
delà des problèmes d'interconnexion et de télécommunications.
Citons par exemple les graphes de calcul ou les problèmes
d'allocation de ressources. L'étude des propriétés et des
comportements de ces entités est alors effectuée en profitant
de l'énorme quantité de résultats existant dans la
littérature en Mathématiques Discrètes, soit sur des
propriétés structurelles ( par exemple connectivité,
couplages, ensembles indépendants, nombre chromatique,
...), soit sur des principes de construction ( graphes de
Cayley, graphes extrémaux, ...), soit enfin sur
l'algorithmique qui s'y rapporte ( algorithmes de flot,
connectivité, calcul de couverture par les sommets,
...).
Notons que beaucoup d'aspects algorithmiques ne sont pas
spécifiques à la théorie des graphes. Certains algorithmes
utilisent des principes généraux (partitionnement, structures
de données, ...). Plus particulièrement, nous nous fondons
sur des résultats de complexité concernant la possibilité ou
non de fournir une solution proche de l'optimum
(algorithmique d'approximation) et sur des méthodes de
randomisation ou d'algorithmique probabiliste. Nous
utilisons aussi des méthodes issues de l'analyse
d'algorithmes (évaluation de quantités combinatoires,
techniques de comptage) afin d'analyser la complexité des
algorithmes (ou les propriétés de la solution). Des
techniques de comptage voisines interviennent aussi quand
nous utilisons des probabilités discrètes. Un certain nombre
d'outils issus de la recherche opérationnelle comme la
programmation convexe (programmation linéaire, programmation
semi-définie positive), les techniques d'arrondi et de
résolution de problèmes en nombres entiers ou encore des
heuristiques ( tabu search, simulated annealing,
...) sont aussi parfois utilisés.
Enfin, précisons que presque toujours nous travaillons
avec des hypothèses déterministes. Par exemple, si
un objet tombe en panne, il ne fonctionne plus; ce qui
revient dans le graphe associé à supprimer le sommet ou
l'arête modélisant l'objet. S'il arrive que nous traitions
parfois des problèmes non déterministes, notre approche se
limite à l'utilisation de probabilités discrètes simples (par
exemple, nous pouvons intégrer la probabilité de panne d'un
élément sous la forme d'une loi de Bernouilli).
Quelques exemples caractéristiques
Pour mieux cerner notre problématique, commençons par
donner un résultat classique qui correspond au cas favorable
où il existe un algorithme polynômial pour optimiser un
paramètre : le théorème de Menger.
Théorème 1 (Menger)
Dans un graphe orienté le nombre maximum de chemins
deux à deux arc-disjoints d'un sommet x à un sommet y est
égal au nombre minimum d'arcs à supprimer pour déconnecter
x de y.
La démonstration de ce théorème induit un algorithme en
temps polynômial pour trouver les chemins disjoints ou les
arcs à supprimer (le lecteur connaissant la théorie des flots
aura reconnu un cas particulier du théorème du flot maximum
et de la coupe minimum).
De ce théorème, on déduit le résultat suivant :
soient deux ensembles de sommets
S = {s1,
s2,..., sk} et
T = {t1,
t2,..., tk}, il
existe k chemins deux à deux
arc-disjoints de S à
T si et seulement si la
suppression de k arcs ne
déconnecte pas S de
T. Si maintenant on cherche
des chemins dont les extrémités sont fixées à l'avance
(c'est-à-dire que le chemin i doit relier si à ti), alors le problème (dit
du routage par chemins disjoints)
devient NP-complet même pour k =
2. Notons que :
- le même problème pour un graphe non-orienté
(déterminer, quand elles existent, k chaînes arête-disjointes reliant des
paires de sommets fixées) est polynômial pour k fixé, même si en pratique le degré
du polynôme induit un coût prohibitif ;
- dans le cas d'un graphe orienté symétrique (il existe
alors autant d'arcs (x,
y) que d'arcs (y,
x)) le problème est polynômial pour
k
2; la généralisation de ce résultat vient juste
d'être démontrée [49].
Ces exemples démontrent l'importance d'une définition
précise des modèles, puisque des variations apparemment
mineures transforment un problème «facile» en un problème
«difficile».
Il est aussi fréquent qu'un problème en général NP-complet
puisse être résolu dans des cas particuliers. Un exemple
récent est celui du Ring Loading Problem. Étant donné
un anneau non orienté (cycle) et k couples de sommets (requêtes)
(si,
ti), on souhaite acheminer un trafic
di de
si à ti. Pour chaque requête, nous
pouvons choisir de l'acheminer sur le cycle via une route qui
sera soit le chemin horaire, soit le chemin anti-horaire. On
appelle charge d'une arête le trafic qui l'emprunte.
Notons
[si,
ti] l'ensemble des arêtes du chemin
horaire de si a
ti, et posons
xi = 1 si le
chemin horaire est choisi (0
sinon). Le problème d'optimisation s'écrit alors :
où di représente
le poids de la connexion (si, ti),
Lj est la charge
de l'arête j et
maxj(Lj)
est la charge maximum d'une arête, que l'on souhaite
minimiser. Lorsqu'il n'y a pas de contrainte sur les poids
des connexions, le problème est NP-difficile, mais il devient polynômial
si di = 1. On ne
connaît pas sa complexité lorsque que di est supposé borné par une
constante. Enfin, il existe un algorithme polynômial qui
calcule une solution dont la charge est au plus
fois
l'optimum. Si l'on relâche la contrainte d'intégrité des
xi (ce qui
revient à autoriser la séparation du flux d'une requête sur
le chemin horaire et anti-horaire), le problème est une
instance classique de problème de programmation linéaire et
se résout en temps polynômial.
Cet exemple démontre une fois encore la nécessité
d'hypothèses précises ; il est aussi typique, car sa
résolution repose sur l'utilisation conjointe d'outils de
théorie des graphes, de techniques d'optimisation
combinatoire (programmation linéaire, relaxation) et de
techniques d'approximation.
Le Ring Loading problem provient d'un problème
fondamental pour les réseaux SONET
(Synchronous Optical NETworks) ou utilisant la
SDH (Synchronous Digital Hierarchy).
Une variante plus complexe de ce problème consiste à
colorer les chemins associés aux requêtes, de manière à ce
que les chemins partageant une même arête aient des couleurs
distinctes. Les différentes couleurs correspondent alors aux
longueurs d'ondes disponibles dans un réseau optique. Le but
est de minimiser les nombre de couleurs. Ce problème reste
ouvert.
Nous pouvons classer nos recherches en trois grands
domaines scientifiques décrits dans les sections
suivantes.
Modélisation et conception de réseaux
Dans ce domaine,
nous modélisons un réseau réel par un objet combinatoire. La
modélisation est presque systématiquement simplificatrice,
mais elle retient les paramètres critiques en jeu. Nous
cherchons alors :
- soit à construire le meilleur objet possible
(satisfaisant les contraintes et optimisant une fonction de
coût), on parle alors de problème de conception
(«design»), l'approche est en général duale puisque que
la tâche de construction s'accompagne de la preuve de la
qualité de celle-ci
- soit à déterminer les propriétés de certains objets
combinatoires.
Un des problème de design les plus étudiés est le
suivant :
[Problème
(
,
D)] Construire le graphe de degré
maximum
et de diamètre
D ayant le maximum de sommets. Ce
nombre maximum de sommets est noté
N(
,
D).
Bien que d'énoncé trivial, le problème est très difficile
(hormis les cas particuliers
N(
, 1)
=
(graphe complet) et
N(2, D) = D +
1 (Cycle)). Pourtant, une valeur approximative de
N(
,
D) a été théoriquement déterminée puisqu'il a
été démontré qu'un graphe aléatoire de paramètres
et
D contient quasiment un
nombre optimum de sommets ; à titre d'exemple, si on ajoute à
un cycle de n sommets un
couplage aléatoire, le graphe obtenu est de degré
3 et de diamètre
log2(n) +
loglog(n) alors que l'optimal est log(n). Les méthodes constructives sont
loin d'être aussi efficaces et un grand nombre de
constructions de bons réseaux (i.e. bon
signifiant que le réseau proposé contient plus de sommets que
ceux précédemment proposés) ont été proposées. Les graphes
étudiés sont souvent des graphes de Cayley basés sur un
groupe fini (les sommets sont les éléments d'un groupe fini
et leur voisins sont obtenus par multiplication par certains
éléments spécifiques du groupe appelés générateurs).
Les réseaux usuels sont en fait des graphes de Cayley sur des
groupes familiers (par exemple, Zn muni des générateurs
+1, - 1 correspond au cycle) ; les
bonnes constructions reposent alors sur des techniques
d'algèbre poussée et utilisent des groupes plus complexes
comme ceux agissant sur les géométries finies.
Une autre technique consiste à construire des réseaux en
composant entre eux des graphes plus petits. Enfin, les
graphes sur alphabet et les graphes d'arcs itérés offrent un
bon compromis, car, bien qu'étant des objets assez simples,
ils sont proches des meilleures constructions. C'est le cas
du graphe de de Bruijn non-orienté dont les sommets sont des
D-uplets
(x1,
x2,..., xD) avec
xi
{0, 1,...d - 1} et où
(x1,
x2,..., xD) est
voisin de tout sommet
(x2,...xD -
1*) (resp.
(*x2...xD -
1xD)) obtenu par décalage à
gauche (resp. à droite).
Pour conclure sur ce problème, notons que l'analogue
orienté du problème
(
,
D) est bien moins difficile, puisque que les
graphes de Bruijn orientés sont alors presque
optimaux.
Une fois un réseau construit, on cherche à déterminer
diverses propriétés, comme :
- sa connectivité, qui est le nombre maximum de chaînes
disjointes reliant deux sommets quelconques ;
- le nombre minimal de couleurs nécessaires afin de
colorier
ses arêtes ou ses
sommets ;
- l'existence de cycles Hamiltoniens
(cycle contenant
chaque sommet une fois et une seule).
Des questions directement liées à son utilisation en
tant que réseau d'interconnexion peuvent aussi être abordées
: comment router les messages dans le réseau, comment y
diffuser l'information (voir le livre [10])?
Nous sommes alors conduits à utiliser les outils
développés en théorie des graphes ou à déterminer des
algorithmes «efficaces» afin de résoudre ces questions.
Pour finir, citons un problème de construction non résolu
provenant du CNET :
Construire un graphe à N
sommets, k-connexe, de
diamètre D ayant un nombre
minimum d'arêtes.
Le lecteur trouvera des problèmes de conception plus
spécifiques dans les domaines d'application (Cf. section
4.2).
Algorithmique des communications
Dans ce domaine, la
topologie du réseau, les communications à effectuer et le
modèle sont déjà déterminés. Le but est de réaliser un
ensemble de requêtes ou demandes. Une requête est modélisée
par un couple de sommets (si, ti)
associé à une intensité de trafic di qui correspond à la
quantité de messages que si veut envoyer à
ti. Le trafic est
en général un multiple entier d'un trafic considéré comme
unitaire qui dépend de l'application. Satisfaire la requête
consiste à trouver un (ou plusieurs) chemins de si à ti qui permettent d'écouler
le trafic di.
Le Ring Loading problem est un exemple des
problèmes considérés. Deux variantes peuvent
apparaître : un problème de décision (on souhaite alors
simplement satisfaire les requêtes) ou un problème
d'optimisation (il faut alors minimiser les ressources
utilisées, ou dimensionner le réseau afin qu'il satisfasse
les requêtes à un coût minimum, ou encore ne satisfaire
qu'une partie des requêtes, celles représentant un profit
maximum).
Il est utile de distinguer deux types de problèmes de
communication :
- Les communications structurées (parfois appelées
communications globales). Dans ce cas, les requêtes ont une
structure déterminée. Par exemple cela peut être une
diffusion
( broadcasting)
ou une diffusion partielle
( multi-cast).
Dans un échange total (gossiping), les noeuds
communiquent tous entre eux (cela peut être vu comme
n diffusions
concurrentes). Le plus souvent, on considère des trafics
homogènes.
- Les communications irrégulières (ou quelconques) pour
lesquelles les requêtes sont quelconques et les trafics
variables.
Le premier type de communication se rencontre dans la
plupart des algorithmes parallèles (par exemple, algèbre
linéaire, traitement d'image, bases de données, cf section
3.2.5).
Il peut aussi se rencontrer dans le domaine des
télécommunications ou servir de base à la conception d'un
réseau quand on ne dispose pas d'information sur le trafic
(l'échange total reflète assez bien la superposition de
nombreuses communications quelconques) ou si l'on souhaite
assurer une qualité de service uniforme. Le deuxième type
correspond plus aux problèmes posés par les réseaux de
télécommunication.
Schématiquement, il existe deux grand modes de
commutation : la commutation de paquets ( store and
forward) et la commutation de circuits (mode connecté).
Dans le premier mode, les messages sont acheminés pas à pas
depuis l'émetteur vers le récepteur lors de la réception d'un
message, le routeur détermine vers où doit s'effectuer
l'envoi suivant. En mode commutation de circuits, le chemin
est établi soit de manière statique soit par un en-tête les
messages sont ensuite simplement transmis le long du chemin
logique ainsi obtenu.
Lorsque les chemins sont établis de manière statique, le
problème revient à déterminer une topologie logique
satisfaisant un certain nombre de contraintes. C'est par
exemple le cas pour les réseaux de type ATM,
où l'on cherche une topologie logique capable d'écouler le
trafic et vérifiant des contraintes de capacité, de nombre
maximal de liens logiques partageant un même lien physique,
ou encore de nombre de commutateurs. Dans le cas de réseaux
de type WDM, c'est le nombre de couleurs ou le
nombre de commutateurs optiques qui est déterminant. Toutes
ces questions se formalisent sous la forme de problèmes de
plongement contraint d'un graphe dans un autre (i.e. du
graphe logique dans le graphe physique) Ces problèmes sont
très étudiés en théorie des graphes. Pour les résoudre, on
peut utiliser des techniques d'extraction de
représentants : on peut chercher un ensemble minimum de
sommets S tel que tout
sommet soit à distance au plus
de S; ou
encore déterminer un ensemble maximum de sommets que l'on
puisse interconnecter complètement. Néanmoins, il existe une
différence notable : le choix de la topologie logique,
bien que contraint, est laissé au concepteur, alors que, pour
des plongements classiques, la structure à placer est
complètement déterminée.
Algorithmique du parallélisme
Le calcul parallèle de problèmes discrets traite, en bonne
partie, de la solution d'un problème d'imagerie ou
géométrique de taille n sur
un ordinateur parallèle avec p processeurs. La solution parallèle est
dite optimale si
Tpar =
O(
), où
Tpar et
Tseq sont,
respectivement, le temps parallèle et séquentiel requis pour
résoudre le problème.
Le modèle théorique utilisé pour ce genre de problèmes a
été, jusqu'à très récemment, celui où
=
O(1), aussi connu comme le modèle de
parallélisme à grain fin. Toutefois, pour qu'un
algorithme parallèle soit important en pratique, il doit être
portable et extensible ( scalable), i.e., il doit être
applicable sur plusieurs ordinateurs parallèles et efficace
pour un large intervalle de valeurs de
.
La conception de ce type d'algorithmes est l'un des grands
objectifs de l'algorithmique parallèle depuis toujours,
principalement parce que les architectures de la plupart des
ordinateurs existants (e.g. Paragon d'Intel et T3E de Cray)
sont composés de p
processeurs standards (e.g. le Sparc), chacun avec une
mémoire locale importante, connectés par un réseau
d'interconnexion (e.g. grille, hypercube, fat-tree). Ces
machines sont d'habitude à gros grain (i.e., la taille
de chaque mémoire locale est beaucoup plus grande que
O(1)).
Les modèles Bulk Synchronous Processes
(BSP) and Coarse Grained
Multicomputer (CGM) sont donc composés de
p processeurs avec
O(
) mémoire locale chacun, connectés
par un réseau d'interconnexion quelconque ou par une mémoire
partagée. Le terme «bulk» fait référence au fait que le grain
de calcul est important et le terme «coarse-grained» fait
référence au fait que (comme dans la pratique) la taille
O(
) de chaque mémoire locale est
définie «beaucoup plus large» que O(1).
Nous remarquons que, s'il existe un algorithme optimal à
grain fin avec
Tpar =
O(
),
alors, au moins d'un point de vue théorique, le problème de
l'extensibilité ne se pose pas. En effet, une simulation
standard (aussi appelée simulation par «processeurs virtuels»
dans plusieurs systèmes d'exploitation de machines
parallèles) donne un algorithme optimal pour tout
n et p. Cependant, pour la plupart des
réseaux d'interconnexion utilisés dans la pratique, nombreux
sont les problèmes pour lesquels il n'existe pas de telles
solutions optimales à grain fin ; ou encore, les algorithmes
optimaux à grain fin sont impossibles à cause des limitations
dues à la largeur de bande ou au diamètre (e.g. sur la
grille).
Les algorithmes développés pour ces modèles ont pour but
de proposer des résultats indépendants du réseau de
communication des machines cibles pour que les algorithmes
soient portables. Une des caractéristiques principales de
cette approche est que toutes les communications entre les
processeurs doivent être restreintes à un nombre constant
d'étapes de communication globale. La stratégie de base est
la suivante : on essaye de combiner des algorithmes
séquentiels optimaux existants avec un routage global et un
mécanisme de partitionnement efficaces. Chaque processeur
résout alors en séquentiel un nombre constant de
sous-problèmes de taille
O(
) et on utilise un très petit
nombre d'étapes de communication pour permuter les
sous-problèmes parmi les processeurs. À la fin, chaque
processeur combine les solutions des sous-problèmes pour
déterminer sa partie de la solution globale, partie de
taille
O(
).
Cette description est aussi brève que simplifiée. Les
vrais algorithmes font plus que seulement permuter des
données. En fait, la vraie difficulté se trouve dans le
développement des schémas de partitionnement cohérents,
puisque chaque processeur résout seulement un très petit
nombre de sous-problèmes de taille
O(
), mais doit déterminer sa
contribution (de taille
O(
)) à la résolution du problème
complet (sans pour autant avoir accès à toutes les
n données). La partie la
plus technique de la conception des algorithmes est celle qui
consiste à garantir qu'un très petit nombre d'étapes de
communication globale est suffisant.