• Aucun résultat trouvé

Correction de l’activité 2 et principe de la programmation dynamique

N/A
N/A
Protected

Academic year: 2022

Partager "Correction de l’activité 2 et principe de la programmation dynamique"

Copied!
2
0
0

Texte intégral

(1)

NSI Lycée Louis de Foix

Correction de l’activité 2 et principe de la programmation dynamique 1. Principe de la programmation dynamique

Le concept de programmation dynamique a été introduit en 1950 par Richard Bellman. À l’époque, le terme programmation signifiait planification et ordonnancement. Ainsi, la programmation dynamique n’est pas une méthode de programmation (comme la programmation objet, la programmation fonctionnelle…) mais une méthode algorithmique.

Certains problèmes admettent une résolution récursive qui engendre un grand nombre de calculs répétés et inutiles. On opte alors pour un algorithme de programmation dynamique, qui consiste à mémoriser les résultats des calculs dans un tableau ou un dictionnaire.

La programmation dynamique s’appuie sur le principe d'optimalité de Bellman : on peut construire une solution optimale du problème à partir de solutions optimales de sous-problèmes. Ainsi, la solution optimale d’un problème à i variables par exemple (i objets dans le cas du sac à dos) peut être obtenue à partir des solutions optimales du problème à i – 1 variables. On résout alors successivement les différentes instances du problème en faisant croitre le nombre de variables.

Approche top-down

C’est l’approche récursive. On part du problème principal et on rappelle la fonction sur les sous-problèmes, en mémoïsant les résultats afin de ne pas effectuer les calculs plusieurs fois. Cette approche permet de n’effectuer que les calculs nécessaires à la résolution du problème principal mais peut être plus lente à cause de la gestion de la récursivité. L’algorithme de programmation dynamique s’appuie sur les formules de récurrence permettant de résoudre le problème à i variables à partir des solutions des problèmes à i-1 variables.

Approche bottom-up

On commence par résoudre les sous-problèmes les plus simples et on « monte » vers le problème

principal. Organiser l’algorithme de programmation dynamique nécessite alors de déterminer les relations de récurrence et l’ordre des calculs. Nous travaillerons principalement cette approche.

2. Solution de l’exercice débranché

objets = [(5, 3), (9, 2), (10, 5), (6, 4), (7, 1), (9, 3)] et w = 10

objets\poids 0 1 2 3 4 5 6 7 8 9 10

0 0 0 0 0 0 0 0 0 0 0 0

1 0 0 0 5 5 5 5 5 5 5 5

2 0 0 9 9 9 14 14 14 14 14 14 3 0 0 9 9 9 14 14 19 19 19 24 4 0 0 9 9 9 14 15 19 19 20 24 5 0 7 9 16 16 16 21 22 26 26 27 6 0 7 9 16 16 18 25 25 26 30 31 La valeur maximale est 31, avec un poids de 10 kg. On prend :

• l’objet 6 et 7 kg avec les 5 autres objets

• les objets 6, 5 et 6 kg avec les 4 autres objets

• les objets 6, 5, 4 et 2 kg avec les 3 autres objets

(2)

NSI Lycée Louis de Foix

• les objets 6, 5, 4 et 2.

On obtient donc la valeur optimale de 31 avec les objets 2, 4, 5, 6.

3. Algorithme de programmation dynamique 1. On note :

• n le nombre d’objets

• w le poids maximal entrant dans le sac

• (vi, wi) le couple (valeur, poids) de l’objet i

Soit T un tableau d’entiers à n + 1 lignes et w + 1 colonnes.

pour j allant de 0 à w : T[0, j] ← 0 pour i allant de 1 à n :

pour j allant de 0 à w : si j < wi alors :

T[i, j] ← T[i – 1, j]

sinon :

T[i, j] ← max(T[i – 1, j], vi + T[i – 1, j – wi]

Remarque : on aurait pu compléter le tableau colonne par colonne plutôt que ligne par ligne.

2. Avec les mêmes notations que précédemment et liste_objets une liste vide : vmax ← T[n, w]

i ← n j ← w

pour i allant de n à 1 :

si T[i, j] ≠ T[i – 1, j] alors :

ajouter (vi, wi) à liste_objets j ← j – wi

3. Complexité en temps

La création du tableau, et son remplissage, ont une complexité en temps en O(nw) car il s’agit de deux boucles imbriquées de longueurs respectives n et w avec des opérations en temps constant. La

reconstitution de la solution est en O(n). Au total, l’algorithme de résolution est en O(nw).

Complexité en mémoire

La complexité en mémoire est également en O(nw) puisqu’il faut un tableau à nw cases, ou plus

précisément (n + 1)(w + 1) cases pour mémoriser les résultats. On peut négliger les autres variables et la liste objets.

Références

Documents relatifs

En admettant si besoin la propri´ et´ e pr´ ec´ edente, ´ ecrire un algorithme qui prend en entr´ ee I et d´ etermine la longueur maximale d’une sous-suite L d’intervalles deux `

La solution d’un problème P k contient les solutions de problèmes ayant des tailles plus

Dans le cas d’un problème d’optimisation, la programmation dynamique identifie une politique optimale : une décision optimale à chaque étape pour chaque état

Par exemple, pour notre micro-satellite suite à une perturbation ou sous l'effet de perturbations toujours présentes, on désire un retour à la position pointage Terre le plus

Une cible C est abandonnée sans vitesse initiale, d’une hauteur h, à l’instant même où le projectile P est lancé. Il saute depuis le sol lunaire avec une vitesse initiale v 0

(Ordonnancement de tâches pondérées) Le problème d'ordonnancement de n tâches pondérées (weighted interval scheduling), consiste à trouver un sous-ensemble de poids maximum de

• Programmation dynamique : on résout des petits problèmes que l’on combine pour arriver au problème complet.. L’approche est ascendante, du bas vers le haut

 Programmation dynamique : on résout des petits problèmes que l’on combine pour arriver au problème complet.. L’approche est ascendante, du bas vers le