Le
mot "Algorithme" vient du nom du célèbre
mathématicien Al Khowarizmi, astronome et
géographe musulman, persan ou arabe. Un de ses grands
travaux, écrit en 830, fut Hisab Al-jabr w'al-mugabala,
appelé "textes fondateurs" de lalgèbre,
et donna naissance au mot Algèbre. Ce traité
classifie les solutions des équations quadratiques.
Cormen et al. [ 1 ] donne la définition suivante
"un algorithme est une procédure de calcul bien
définie qui prend en entrée une valeur, ou
un ensemble de valeurs, et qui donne en sortie une valeur,
ou un ensemble de valeurs. Un algorithme est donc une séquence
d'étapes de calcul qui transforment l'entrée
en sortie".
Knuth
et al., dans The Art of Computer Programming [ 2 ],
insistent sur l'importance d'une conception de l'algorithme
hautement reliée à son analyse,
afin d'obtenir des résultats performants et de comprendre
le pourquoi d'une telle réussite. L'efficacité
d'un algorithme ne doit pas être le fruit de quelques
réglages astucieux efficace pour quelques instances
d'un problème. Elle est souvent liée à
sa vitesse d'exécution pour produire le résultat
escompté ainsi qu'à son encombrement mémoire.
Ce temps de machine disponible se doit d'être optimisé,
car même dans les scénarios les plus optimistes
où les ressources deviennent de plus en plus performantes,
le temps machine reste limité et la mémoire
coûteuse. Cormen et al. [ 2 ] présentent
les algorithmes comme une ``technologie'' à
part entière qui ne cesse de progresser. On retrouve
des algorithmes dans le compilateur, l'interpréteur,
le routage d'informations, l'interface graphique et bien
sûr dans l'application elle-même. Ils sont
au coeur de tout système et donc se doivent d'avoir
une haute performance informatique.
La
notion de performance fait référence
ici au terme anglais "High Performance Technical
Computation" (H.P.T.C.). La définition
de la performance proposée par Estellon B., Gardi
F. et Nouioua K. [ 5 ] est la suivante : "un algorithme
capable de fournir en un temps très court une solution
de très grande qualité". Pour répondre
à cet objectif, il convient de respecter des contraintes
de conception d'algorithme ainsi que d'ingénierie
logicielle. On parlera "d'ingénierie algorithmique"
pour reprendre les termes introduit par Moret [ 6 ].
La
conception efficace d'algorithme nécessite sa preuve
de validité. Mitchell [ 3 ] présente
dans son manuel des travaux en matière de démonstration
de la justesse des programmes. En informatique, établir
la preuve de correction d'un algorithme est une tâche
importante et difficile. Lapoire [ 4 ] rappelle que
"la première qualité attendue d'un
algorithme est bien sûr sa terminaison" avant
même d'évaluer ses performances. Pour cela,
on va devoir prouver "qu'il n'admette aucune instance
pour laquelle l'exécution rentre dans une boucle
infinie". Il n'existe aucune méthode universelle
pour prouver qu'un algorithme se termine, mais une mise
en oeuvre rigoureuse et une analyse précise
permet bien souvent de conclure à sa validité.
Knuth
et al. [ 2 ], insiste sur l'importance de procéder
à une analyse de l'algorithme, définie
comme la prévision des ressources nécessaires
à son bon fonctionnement (la mémoire, la bande
passante, le temps de calcul, etc.). Les travaux présentés
ici dans cette thèse ne font pas appel à du
calcul distribué, ni à du multi-threading
(pas d'opérations simultanées). L'analyse
s'en retrouve simplifiée mais ne perd rien de son
importance. Nous supposerons que nos algorithmes fonctionnent
sur un modèle de calcul générique basé
sur une machine à accès aléatoire (RAM)
à processeur unique. L'analyse de l'algorithme consiste
à évaluer la taille de l'entrée et
le temps d'execution. On peut mesurer ce temps en comptabilisant
le nombre d'étapes élémentaires effectuées
par la RAM ou encore le nombre de lignes de pseudo code.
L'analyse du code s'intéresse aussi bien au cas le
plus défavorable qu'au cas moyen (qui permet de déduire
le temps d'execution attendu).
Les
autres caractéristiques de la performance algorithmique
sont sa fiabilité, sa robustesse,
sa portabilité et sa maintenabilité.
Ces termes sont plus reliés à des notions
d'informatique de production. Les algorithmes doivent
être en mesure de traiter tout type d'instances de
manière effective et efficace, en ayant
pris en compte toutes les contraintes de l'environnement
:
- Temps
de calcul accordé pour l'exécution en production
du logiciel,
- Mémoire
allouée au moteur,
- Hétérogénéité
des instances,
- Fréquence
d'ajout de nouvelles contraintes,
- Nature
de l'équipe de support du moteur (nécessité
de transfert de connaissance, évolutions futures
réalisées par d'autres équipes, etc.)
- Nécessité
d'adapter le moteur pour des versions allégées
en mobilité.
- etc...
Toutes
ces contraintes influencent l'algorithmique sous-jacente
car elle nécessite une adaptation des structures,
des accès mémoire, des éventuelles
décompositions, des temps alloués à
chaque étape de l'algorithme, etc.
Les
travaux de Moret [ 6 ] et les travaux remarquables
d'Helsgaun [ 7 ] sur le problème du voyageur
de commerce sont des compléments de lecture très
intéressants sur ces sujets de performance algorithmique.
Les travaux de Moret mettent en évidence l'importance
de l'algorithmique expérimentale qui étudie
à la fois l'efficacité des algorithmes mais
aussi les structures de données. C'est ce qu'il entend
par ingénierie algorithmique qui transforme
les algorithmes ``papier-crayon'' en des implémentations
efficaces et utiles. Ces améliorations peuvent faire
gagner un facteur 3 sur le temps de calcul [ 6 ].
Voici
le plan de cette introduction à la recherche locale :
- Les
notions de base
:
- Méthodologie
:
Plus d'infos sur le sujet de la Recherche Locale, consultez la note suivante (Estellon B., Gardi F. et Nouioua K.) : Cliquez ici. Questions, commentaires, compléments d'informations : antoinejeanjean@gmail.com
Références :
[
1 ] Cormen Thomas H., Leiserson C., Rivest Ronald L.
Stein Clifford, Introduction to Algorithms,
1990.
[ 2 ] Knuth et al., The arts of computer programming,
1968
[ 3 ] Mitchell (John C.). Foundations for Programming
Languages. MIT Press, 1996.
[ 4 ] Denis Lapoire, Initialisation à l'algorithmique,
2006
[ 5 ] Estellon B., Gardi F. et Nouioua K. Recherche
Locale Haute Performance, 2009
[
6 ] B.M.E. Moret (2002). Towards a discipline
of experimental algorithmics. In Data Structures,
Near
Neighbor Searches, and Methodology : 5th and 6th DIMACS
Implementation Challenges (sous la direction
de M.H. Goldwasser, D.S. Johnson et C.C. McGeoch), DIMACS
Monographs, Vol. 59, pp. 197-213.
American Mathematical Society, Providence, RI.
[
7 ] K. Helsgaun (2000). An effective implementation
of the Lin-Kernighan traveling salesman heuristic,
European Journal of Operational Research 126(1), pp. 106-130.