Cours / exemples
I. Paradigmes algorithmiquesâïž
-
Algorithme glouton : construit une solution de maniÚre incrémentale, en optimisant un critÚre de maniÚre locale.
-
Diviser pour régner : divise un problÚme en sous-problÚmes indépendants (qui ne se chevauchent pas), résout chaque sous-problÚme, et combine les solutions des sous-problÚmes pour former une solution du problÚme initial.
-
đ Programmation dynamique : divise un problĂšme en sous-problĂšmes qui sont non indĂ©pendants (qui se chevauchent), et cherche (et stocke) des solutions de sous-problĂšmes de plus en plus grands
Bref historiqueâïž
-
Programmation dynamique : paradigme développé par Richard Bellman en 1953 chez RAND Corporation.
-
« Programmation » = planification
-
Technique de conception d'algorithme trÚs générale et performante.
-
Permet de résoudre de nombreux problÚmes d'optimisation.
Pourquoi « programmation dynamique » ?
« The 1950s were not good years for mathematical research. We had a very interesting gentleman in Washington named Wilson. He was secretary of Defense, and he actually had a pathological fear and hatred of the word âresearchâ. Iâm not using the term lightly; Iâm using it precisely. His face would suffuse, he would turn red, and he would get violent if people used the term âresearchâ in his presence. You can imagine how he felt, then, about the term âmathematicalâ. The RAND Corporation was employed by the Air Force, and the Air Force had Wilson as its boss, essentially. Hence, I felt I had to do something to shield Wilson and the Air Force from the fact that I was really doing mathematics inside the RAND Corporation. What title, what name, could I choose? »
Richard Bellman (1984)
II. Revisitons Fibonacci...âïž
1. Les nombres de Fibonacciâïž
Vous pouvez regarder le début de cet article :
Soit \(F_n\) = nombre de lapins au mois n
- \(F_1 = 1\)
- \(F_2 = 1\)
- \(F_n = F_{n-1} + F_{n-2}\)
Ce sont les nombres de Fibonacci : \(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,\dots\)
đ Ils croissent trĂšs vite : \(F_{30} = 832040\)
Le nombre \(\varphi\) est appelé le nombre d'or : \(\varphi = \dfrac{1+ \sqrt{5}}{2}\).
En fait, si \(n\) est grand on a : \(F_n \approx \dfrac {\varphi ^{n}}{\sqrt{5} }\)
😢 Nous avons donc une croissance exponentielle.
2. La suite de Fibonacci : comment calculer les termes ?âïž
La suite de Fibonacci est une suite numérique définie par :
\(u_0 = 1\) et \(u_1=1\) et pour tout entier \(n>1\), \(u_n=u_{n-1}+u_{n-2}\).
Pour calculer le terme de rang \(n\), on peut utiliser cette définition par récurrence, pour concevoir un programme récursif.
Version récursive
Tester dans la console fibonacci(6)
, puis fibonacci(10)
. Que constatez-vous ?
Solution
fibonacci(10) est déjà trÚs long à calculer.
Les appels récursifs
Pour calculer le terme de rang 6, il faut calculer celui de rang 5 et celui de rang 4
Pour calculer le terme de rang 5, il faut calculer celui de rang 4 et celui de rang 3
Pour calculer le terme de rang 4, il faut calculer celui de rang 3 et celui de rang 2
Pour calculer le terme de rang 3, il faut calculer celui de rang 2 et celui de rang 1
Pour calculer le terme de rang 2, il faut calculer celui de rang 1 et celui de rang 0.
On remarque que \(u_4\) est calculĂ© deux fois (une fois pour \(u_6\) et une fois pour \(u_5\)) , \(u_3\) est calculĂ© pour chaque calcul de \(u_5\) et \(u_4\) (donc trois fois en tout) et que \(u_2\) est calculĂ© 5 fois en tout. On obtient mĂȘme 13 appels Ă \(u_0\) ou \(u_1\). (On remarque d'ailleurs que \(u_6=13\))
On peut représenter cela avec l'arbre des appels :
flowchart TD
A0 --> A1 & A22
A1 --> A2 & A3
A2 --> A4 & A5
A4 --> A6 & A7
A6 --> A8 & A9
A3 --> A10 & A11
A5 --> A14 & A15
A10 --> A12 & A13
A22 --> A24 & A25
A24 --> A26 & A27
A26 --> A28 & A29
A25 --> A214 & A215
A0(("F(6)"))
A1(("F(5)"))
A2(("F(4)"))
A3(("F(3)"))
A4(("F(3)"))
A5(("F(2)"))
A6(("F(2)"))
A7(("F(1)"))
A8(("F(1)"))
A9(("F(0)"))
A10(("F(2)"))
A11(("F(1)"))
A12(("F(1)"))
A13(("F(0)"))
A14(("F(1)"))
A15(("F(0)"))
A22(("F(4)"))
A24(("F(3)"))
A25(("F(2)"))
A26(("F(2)"))
A27(("F(1)"))
A28(("F(1)"))
A29(("F(0)"))
A214(("F(1)"))
A215(("F(0)"))
Plus on augmente le numéro de rang, plus il y a des calculs qui sont répétés et refaits.
3. A vous de jouerâïž
A vous de jouer
AprÚs avoir téléchargé le fichier, vous pourrez le lire à partir de Basthon
đ TD Ă tĂ©lĂ©charger : Fichier fibonacci_sujet.ipynb
: "Clic droit", puis "Enregistrer la cible du lien sous"
âł Ne lisez pas trop vite la correction ....
đ Correction : Fichier fibonacci_corr.ipynb
: "Clic droit", puis "Enregistrer la cible du lien sous"
III. CrĂ©ditsâïž
Auteurs : Denis Quenton, Jean-Louis Thirot, Mireille Coilhac
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)