Yann Vaxès et Benjamin Monmege
Exemple de la factorielle: \[u_0 = 1 \qquad \text{ et }\qquad \forall n\geq 1 \quad u_n = n\times u_{n-1}\]
Correction et complexité s’étudient par des preuves par récurrence (\(a, b\in \mathbf N\)) \[ C_0 = a \qquad \text{ et }\qquad \forall n\geq 1 \quad C_n = b + C_{n-1} \]
\[C_n = O(n)\]
Suite de Fibonacci:
\[F_0 = F_1 = 1 \qquad \text{ et }\qquad \forall n\geq 2 \quad F_{n} = F_{n-1} + F_{n-2}\]
def fibonacci(n):
resultats = [1, 1] # on connait les valeurs de F0 et F1
for i in range(2, n + 1):
resultats.append(resultats[-1] + resultats[-2])
return resultats[n]
Une méthodologie pour aborder certains problèmes…
Lorsque les sous-problèmes ont des sous-sous-problèmes en commun, il faut les résoudre une seule fois et mettre le résultat dans une table !
Problèmes d’optimisation
Conception d’un algorithme de programmation dynamique
Données du problème
Problème
Déterminer quels sont les postes à sélectionner sur la chaîne 1 et sur la chaîne 2 pour minimiser le délai de transit d’une auto à travers l’atelier
Combien de solutions possibles ?
Les sous-problèmes à considérer consistent à calculer un itinéraire optimal jusqu’au poste \(S_{i,j}\) pour \(i= 1, 2\) et \(j = 1, \ldots, n\)
Par exemple, considérons un itinéraire optimal jusqu’au poste \(S_{1,j}\):
\(f_{i}[j]\) : délai optimal jusqu’à \(S_{i,j}\)
\({f^*}\) : délai optimal pour traverser l’atelier \[f^* = \min (f_1[n] + x_1, f_2[n] + x_2)\]
Pour le poste 1 de chaque chaîne, pas de choix: \[f_1[1] = e_1 + a_{1,1} \qquad \qquad f_2[1] = e_2 + a_{2,1}\]
Pour le poste \(j=2,\ldots,n\) de la chaîne 1, deux possibilités: \[f_1[j] = \min (f_1[j-1]+a_{1,j}, f_2[j-1]+t_{2,j-1}+a_{1,j})\] et idem pour la chaîne 2: \[f_2[j] = \min (f_2[j-1]+a_{2,j}, f_1[j-1]+t_{1,j-1}+a_{2,j})\]
Les \(f_i[j]\) sont les valeurs des solutions optimales des sous-problèmes
Pour pouvoir reconstruire les solutions optimales elles-mêmes, on définit
\(l_i[j]\) le numéro de la chaîne (1 ou 2) dont le poste \(j-1\) est utilisé par un chemin optimal jusqu’au poste \(S_{i,j}\)
\(l_1[j]\) n’est pas défini car aucun poste ne vient avant le poste 1
Complexité : \(O(n)\)
Affichage par ordre décroissant des numéros de poste :