La programmation dynamique

Numérique et sciences informatiques

I. Introduction

La programmation dynamique est une technique algorithmique qui permet de résoudre efficacement certains problèmes combinatoires et d'optimisation. Elle consiste à décomposer un problème en sous-problèmes plus petits, à les résoudre de manière itérative et à stocker les résultats dans une table pour éviter de les recalculer plusieurs fois.

II. Principe de la programmation dynamique

Le principe de la programmation dynamique est le suivant :

  1. Décomposer le problème en sous-problèmes plus petits
  2. Résoudre chaque sous-problème de manière itérative
  3. Stocker les résultats dans une table pour éviter de les recalculer plusieurs fois
  4. Combiner les résultats des sous-problèmes pour obtenir la solution au problème initial

voici un exemple simple de programmation dynamique en Python pour calculer le n-ème nombre de Fibonacci :

def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        # Initialisation des deux premiers nombres de Fibonacci
        fib_n_2, fib_n_1 = 0, 1
        # Calcul des nombres de Fibonacci de 2 à n
        for i in range(2, n+1):
            fib_n = fib_n_2 + fib_n_1
            fib_n_2 = fib_n_1
            fib_n_1 = fib_n
        return fib_n

La fonction fibonacci(n) prend en entrée un entier n et retourne le n-ème nombre de Fibonacci. La fonction utilise une méthode itérative basée sur la programmation dynamique pour calculer ce nombre.

Les deux premiers nombres de Fibonacci sont définis manuellement (0 et 1). Ensuite, on itère sur les entiers de 2 à n inclus. Pour chaque entier i, on calcule le nombre de Fibonacci correspondant fib_n en utilisant la formule de récurrence fib_n = fib_n_2 + fib_n_1, où fib_n_2 et fib_n_1 sont les deux nombres de Fibonacci précédents (correspondant respectivement à i-2 et i-1).

À chaque itération, on met à jour les deux nombres de Fibonacci précédents en décalant fib_n_1 dans fib_n_2 et fib_n dans fib_n_1. À la fin de la boucle, la fonction retourne fib_n.

Cet exemple illustre la méthode itérative basée sur la programmation dynamique qui permet de calculer les nombres de Fibonacci de manière efficace et évite la répétition de calculs inutiles.

III. Exemples de problèmes résolus par la programmation dynamique

  1. Alignement de séquences
  2. Le problème de l'alignement de séquences consiste à trouver la meilleure correspondance entre deux séquences de caractères (par exemple, des séquences d'ADN ou de protéines). La programmation dynamique permet de résoudre ce problème en décomposant le calcul de l'alignement optimal en plusieurs sous-problèmes plus petits. On utilise une table pour stocker les résultats intermédiaires et éviter de les recalculer plusieurs fois.

  3. Rendu de monnaie
  4. Le problème du rendu de monnaie consiste à trouver la façon la plus efficace de rendre une somme d'argent donnée en utilisant un ensemble de pièces de monnaie. La programmation dynamique permet de résoudre ce problème en décomposant le calcul de la solution optimale en plusieurs sous-problèmes plus petits. On utilise une table pour stocker les résultats intermédiaires et éviter de les recalculer plusieurs fois.

IV. Coût en mémoire

La programmation dynamique peut avoir un coût en mémoire élevé car elle nécessite de stocker les résultats intermédiaires dans une table. Il est important de bien gérer la mémoire pour éviter les débordements de mémoire ou les ralentissements dus à la gestion de la mémoire virtuelle.

V. Conclusion

La programmation dynamique est une technique efficace pour résoudre de nombreux problèmes algorithmiques d'optimisation et de combinatoire. Elle permet de réduire considérablement le temps d'exécution de l'algorithme en évitant de recalculer les mêmes résultats plusieurs fois. Cependant, elle peut avoir un coût en mémoire élevé, qui doit être géré avec soin pour éviter les problèmes de mémoire. Les exemples de l'alignement de séquences et du rendu de monnaie sont deux exemples de problèmes qui peuvent être résolus avec la programmation dynamique.