Vous êtes sur la page 1sur 4

Chapitre 5 (Approches fondamentales)

Comme nous l’avons constaté au chapitre précédent, certaines approches (utilisation


d’une structure de données particulière) s’appliquent bien pour un problème en particulier
mais pas de façon générale. Le but du présent chapitre est de présenter trois approches
fondamentales dans la conception d’algorithmes. Le terme «fondamentale» fait référence
au fait que ces méthodes s’appliquent à une vaste gamme de problèmes et non à quelques
problèmes très particuliers. Ces approches peuvent être considérées, dans un certain sens,
comme des paradigmes de conception d’algorithmes.
Ces approches sont :
1) Approche vorace;
2) Approche DPR;
3) Approche par programmation dynamique.
Dans le présent chapitre, nous nous contenterons de décrire ces différentes approches
ainsi que leurs principales composantes et domaines d’applications. Le prochain chapitre
sera consacré à de multiples applications faisant intervenir une ou plusieurs de ces
approches fondamentales.

5.1) Approche vorace

Les algorithmes servant à résoudre les problèmes d’optimisation parcourent en général


une série d’étapes, au cours desquelles ils sont confrontés à un ensemble d’options. Un
algorithme vorace détermine une solution optimale pour un problème après avoir
effectué une série de choix. Pour chaque point de décision de l’algorithme, le choix qui
semble le meilleur à cet instant est effectué. Cette stratégie heuristique ne produit
malheureusement pas toujours une solution optimale (ni même une solution parfois).
Cependant, la méthode vorace est très puissante et fonctionne correctement pour des
problèmes variés. Nous verrons, au prochain chapitre, que de nombreux algorithmes
peuvent être vus comme des applications de cette approche, notamment les algorithmes
sur les arbres couvrants, l’algorithme de Dijkstras, l’heuristique de Chvatal etc.

Comment peut-on savoir si un algorithme vorace peut résoudre un problème


d’optimisation particulier ? C’est en général impossible de répondre à cette question mais
il existe deux caractéristiques qu’un problème peut avoir et qui prêtent à une approche
vorace : la propriété du choix vorace et la propriété de sous-structure optimale.

5.1.1) Propriété du choix vorace

La première caractéristique principale est la propriété du choix vorace : on peut arriver


à une solution globalement optimale en effectuant un choix localement optimal (vorace).

Le choix effectué par un algorithme vorace peut dépendre d’un quelconque choix
effectué jusque là, mais ne peut pas dépendre d’un quelconque choix futur, ni des
solutions aux sous-problèmes. Ainsi, une stratégie vorace progresse en général de
manière descendante, en faisant se succéder les choix voraces, pour ramener
itérativement chaque instance du problème à une instance plus petite. Soulignons enfin
que montrer qu’un choix vorace aboutit à un problème similaire mais plus petit, se
ramène à prouver qu’une solution optimale doit faire apparaître une sous-structure
optimale.

5.1.2) Propriété de sous-structure optimale

Un problème fait apparaître une sous-structure optimale si une solution optimale du


problème contient la solution optimale de sous-problèmes (principe d’optimalité).

5.1.3) Constituants et structure générale d’une approche vorace

5.1.3.1) Constituants
a) Un ensemble de candidats disponibles
b) Un ensemble de candidats déjà choisis
c) Un test de solution
d) Un test de réalisabilité
e) Une fonction de sélection
f) Une fonction objective (fonction à optimiser)

5.1.3.2) Structure générale

Fonction VORACE( C : Ensemble) : Ensemble


S←∅
TANT QUE ¬Solution(S) ∧ C ≠ ∅ FAIRE
x ← élément de C maximisant Select(X)
C ← C – {x}
SI Réalisable( S ∪ {x}) ALORS FAIRE
S ← S ∪ {x}
SI Solution(S) RETOURNER S
SINON RETOURNER «Pas de solution avec cette approche»

5.2) Approche diviser pour régner (DPR)

Nombre d’algorithmes utiles sont de structure récursive : pour résoudre un problème


donné, ils s’appellent eux-mêmes récursivement une ou plusieurs fois sur des sous-
problèmes très similaires. C’est en fait l’approche DPR qu’ils utilisent. Ce paradigme se
décompose de la façon suivante :

DIVISER le problème en un certain nombre de sous-problèmes

RÈGNER sur les sous-problèmes en les résolvant récursivement. Si la taille d’un


sous-problème est «assez petite», on peut résoudre directement avec un
algorithme ad hoc (le problème est de déterminer ce que l’on entend par «assez
petite». C’est ce que l’on appelle la détermination du seuil).
COMBINER les solutions aux sous-problèmes en une solution complète pour le
problème initial.

L’intérêt de cette approche repose sur la facilité avec laquelle on peut résoudre chaque
sous-exemplaire et recombiner les solutions obtenues.

5.2.1) Structure générale

Fonction DPR(x)
SI x est «assez petit» (seuil) ALORS
RETOURNER ADHOC(x)
SINON
DÉCOMPOSER x en sous-exemplaires x1, x2 ,…,xk
POUR i = 1 à k FAIRE yi = DPR(xi)
COMBINER les yi afin d’obtenir solution y de x
RETOURNER y

Afin que cette approche soit efficace, les conditions suivantes sont nécessaires :

1) sous-algorithme de base efficace


2) décomposition efficace de x en sous-exemplaires
3) combinaison efficace des sous-solutions
4) décision judicieuse d’utiliser ADHOC
5) sous-exemplaire de tailles semblables.

5.3) Approche par programmation dynamique

La programmation dynamique, comme la méthode DPR, résout les problèmes en


combinant les solutions de sous-problèmes. La programmation dynamique est applicable
lorsque les sous-problèmes ont en commun des sous-sous-problèmes. Un algorithme de
programmation dynamique (contrairement à un algorithme DPR), résout chaque sous-
sous-problème une seule fois et mémorise sa solution dans un tableau. Cette approche est
en général appliquée aux problèmes d’optimisation. Le développement d’un algorithme
de programmation dynamique peut être planifié dans une séquence de quatre étapes :

1) Caractériser la structure d’une solution optimale


2) Définir récursivement la valeur d’une solution optimale
3) Calculer la valeur d’une solution optimale en remontant
progressivement jusqu’à l’énoncé du problème initial.
4) Construire une solution optimale pour les informations
calculées.
L’idée principale de la programmation dynamique est donc de résoudre chaque sous-
exemplaire différent une seule fois en sauvegardant le résultat. Il s’agit donc d’une
méthode ascendante qui consiste à résoudre d’abord des petits sous-exemplaires,
combiner leur solution pour obtenir des sous-exemplaires de plus en plus grands, et ainsi
de suite jusqu’à l’exemplaire original.

Une question naturelle se pose : Dans quelles situations appliquer la technique de


programmation dynamique ?
La réponse à cette question réside dans les deux propriétés que doit posséder un problème
d’optimisation pour que la programmation dynamique soit applicable :

1) Sous-structure optimale
2) Des sous-problèmes superposés

5.3.1) Sous-structure optimale

Un problème fait apparaître une sous-structure optimale si une solution optimale du


problème contient la solution optimale de sous-problèmes (principe d’optimalité).

5.3.2) Sous-problèmes superposés

Quand un algorithme récursif repasse sur le même problème constamment, on dit que le
problème d’optimisation contient des sous-problèmes superposés.

Ainsi, la programmation dynamique est une méthode ascendante qui est privilégiée
lorsque le problème satisfait le principe d’optimalité ainsi que la propriété des sous-
problèmes superposés.

Vous aimerez peut-être aussi