Vous êtes sur la page 1sur 4

UMBB

Optimisation Combinatoire:
La Complexité Algorithmique

Enseignant : Dr. Wassila DRICI

2019/2020
Last Updated: June 26, 2020
3

1 Introduction
L’objet de ce chapitre est de donner un sens précis aux termes d’algorithmes efficaces, et de prob-
lème d’optimisation combinatoire facile et difficile c’est la théorie de la complexité algorithmique
développée à partir des travaux de Cook de Karp (1970-1971) qui permet de traiter ces questions.
L’idée de la caractérisation des algorithmes efficaces remonte à J.Edmonds (1965). On dit qu’un
algorithme est efficace (ou qu’il est bon) si le nombre des opérations nécessaires pour résoudre le
problème est borné par une fonction polynômiale d’un paramètre caractérisant la taille du problème.
On dira qu’un problème est facile s’il existe un algorithme efficace pour le résoudre, mais comment
affirmer qu’un problème est difficile ? le fait qu’on soit incapable d’en trouver ou alors qu’un tel
algorithme n’existe pas ?
Démontrer qu’un algorithme efficace n’existe pas n’est pas une chose facile à réaliser et la théorie de
la complexité des algorithmes ne donne malheureusement pas de réponse à la question. Cependant,
on montre qu’une large classe de problèmes d’optimisation combinatoire ont un statut identique
quand à l’existence d’un algorithme efficace pour le résoudre, c’est à dire, s’il existe un algorithme
pour résoudre un de ces problèmes, alors il existe un pour chacun d’entre eux.

2 Qu’est ce qu’un algorithme efficace ?


La première idée qui vient à l’esprit quand on désire évaluer l’efficacité d’un algorithme donné
est de l’essayer sur une batterie d’exemples de ce problème que cet algorithme est censé résoudre.
Mais est ce que cette batterie d’exemples est réellement représentative de la classe de problèmes
qu’on se propose de résoudre ? N’y a -t-il pas de cas où l’algorithme en question se comporte
beaucoup plus mal ? et quelles sont ses performances quand la taille des exemples augmente ?
L’impossibilité de répondre à la question "trouver un échantillon représentatif du problème" a fait
abandonner la recherche d’une mesure de l’efficacité des algorithmes à partir d’un comportement
moyen, on s’est donc tourné vers une étude des plus mauvais cas et on a tenté d’associer à chaque
algorithme un majorant du nombre d’opérations nécessaires ou plutôt une fonction reliant la taille
du problème à cette borne sur le nombre d’opérations.

Exemple. 1. Pour chercher le minimum d’un fichier de n nombres, on compare le premier et le


deuxième, ensuite le résultat avec le troisième,... etc. On effectue ainsi N-1 comparaisons.

2. Un algorithme pour résoudre le problème du voyageur de commerce sur n villes consiste à


dresser la liste de toutes les tournées possibles N = (n − 1) ! et d’associer à chaque tournée
son coût et de se ramener à l’algorithme précédent (le minimum d’un fichier).

Définition. Un algorithme de résolution d’un problème π donné est une procédure décomposable
en opérations élémentaires transformant une chaîne de caractères représentant les données de
n’importe quel exemple du problème pi en une chaîne de caractères représentant les résultats de π.

Remarque. Pour mesurer l’efficacité d’un algorithme nous allons établir une relation entre la durée
d’exécution (en terme du nombre d’opérations élémentaires) et la taille de l’exemple traité (en terme
de nombres de caractère nécessaires pour coder les données de l’exemple traité). Trois questions se
posent :

1. Quelle sont les opérations élémentaires que nous allons prendre en compte?

2. Quel codage des données nous permettra de mesurer la taille de l’exemple


4

3. Quelles sont les fonctions reliant la taille au nombre d’opérations élémentaires qui nous feront
dire qu’un algorithme est efficace?
Définition. Étant donné deux fonction f et g : N → N. On dit que f est O( g) s’il existe une
constante c tel que :
∀n ∈ N, k f (n)k ≤ c. k g(n)k .
Définition. Une fonction f est dite polynômiale si elle est O( g) avec g un polynôme en n, ou
encore, s’il existe deux constantes c et k tel que :

f (n) ≤ c.nk

Définition. Une fonction polynômiale f est dite en n p si p est égale au plus petit scalaire k pour
lequel f (n) ≤ c.nk
Définition. Un algorithme est dit polynômiale si le nombre d’opérations élémentaires nécessaire
pour résoudre un exemple de taille n est bornée par un polynôme en n.
Un algorithme est considéré efficace s’il est polynômiale
Propriété 1. La fonction polynômiale croît moins vite que toute fonction exponentielle, c’est à dire,
si a > 1n on ne peut trouver btel que : an < nb pour tout n
Définition. Un codage des données sera ditraisonnable si les nombres ne sont pas codés sous
forme unaire, c.à.d, si l’encombrement mémoire nécessaire pour stocker le nombre entier positif N
est égal à dlog( N + 1)e; ( d x e est la prtie supérieur de x).
Exemples de codage :
1. Le codage d’une fonction d’un ensemble fini x1 , x2 , ..., xn de N dans N : On peut représen-
ter cette fonction par la suite de caractère suivante :
n;x1 ; f ( x1 ); x2 ; f ( x2 );...;xn ; f ( xn )
L’encombrement mémoire nécessaire est :
dlog(n + 1)e+ dlog( x1 + 1)e +dlog( f ( x1 ) + 1)e+ dlog( x2 + 1)e+ dlog( f ( x2 ) + 1)e+...+dlog( xn +
1)e+ dlog( f ( xn ) + 1)e+ 2n. (2n représente le nombre de points virgule nécessaires).
et donc, il est égal à :
dlog(n + 1)e+ ∑in=1 (dlog( xi + 1)e + dlog( f ( xi ) + 1)e)+ 2n.
2. Le codage d’un graphe non orienté (en utilisant la matrice d’adjacence) :
Exemple. Le graphe à 4 sommets ayant comme matrice d’adjacence la matrice suivante :
 
0 1 1 1
1 0 1 0
 
1 1 0 1
1 0 1 0

peut être codé de la manière suivante :

4; 0111 1010 1101 1010

L’encombrement mémoire nécessaire pour coder un graphe en utilisant la matrice d’adjacence


est :N = dlog(n + 1)e+1+n2 .

Vous aimerez peut-être aussi