57
Programmation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel Porumbel ([email protected]) http://cedric.cnam.fr/~porumbed/vari1/ Contributions aux slides : Cédric Bentz 1/19

Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Programmation Java : Algorithmes

Valeur d’accueil et de reconversion en informatique (VARI1)Daniel Porumbel ([email protected])

http://cedric.cnam.fr/~porumbed/vari1/

Contributions aux slides :Cédric Bentz

1/19

Page 2: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Plan

1 Méthodes de Tri

2 Sac-à-Dos : heuristique et programmation dynamique

2/19

Page 3: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Début du tri par sélectionQue fait ce morceau de code ?� �c lass T r i S e l e c t {

s t a t i c i n t [ ] tab ;

/ / chercher l ’ i n d i c e de va leur min/ / dans l ’ i n t e r v a l l e [ a , b ]s t a t i c i n t i n t e r v I n d i c e M i n ( i n t a , i n t b ) {

i n t ind iceMin = a ;f o r ( i n t i=a ; i <=b ; i ++)

i f ( tab [ i ] < tab [ ind iceMin ] )ind iceMin = i ;

r e t u r n ind iceMin ;}� �

3/19

Page 4: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Début du tri par sélectionQue renvoie cette fonction ?� �c lass T r i S e l e c t {

s t a t i c i n t [ ] tab ;

/ / chercher l ’ i n d i c e de va leur min/ / dans l ’ i n t e r v a l l e [ a , b ]s t a t i c i n t i n t e r v I n d i c e M i n ( i n t a , i n t b ) {

i n t ind iceMin = a ;f o r ( i n t i=a ; i <=b ; i ++)

i f ( tab [ i ] < tab [ ind iceMin ] )ind iceMin = i ;

r e t u r n ind iceMin ;}� �

3/19

Page 5: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Que fait ce morceau de code ? ?

� �f o r ( i n t i=0 ; i <n ; i ++) {

i n t j = i n t e r v I n d i c e M i n ( i , n−1) ;i n t tmp = tab [ j ] ;tab [ j ] = tab [ i ] ;tab [ i ] = tmp ;

}� �

4/19

Page 6: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

� �impor t java . u t i l .∗ ;c lass T r i S e l e c t {

s t a t i c i n t [ ] tab ;s t a t i c i n t i n t e r v I n d i c e M i n ( i n t a , i n t b ) {

/ / prendre l e code de l a diapo avant l a précédente}p u b l i c s t a t i c vo id main ( S t r i n g [ ] args ) {

i n t n = 20 ;tab = new i n t [ n ] ;f o r ( i n t i=0 ; i <n ; i ++)

tab [ i ] = ( i n t ) (50∗Math . random ( ) ) ;/ / A f f i c h e r l e tab leau de dépar t :System . out . p r i n t l n ( Arrays . t o S t r i n g ( tab ) ) ;/ / Réa l i se r l e t r i avec une boucle :f o r ( i n t i=0 ; i <n ; i ++) {

i n t j = i n t e r v I n d i c e M i n ( i , n−1) ;i n t tmp = tab [ j ] ;tab [ j ] = tab [ i ] ;tab [ i ] = tmp ;

}System . out . p r i n t l n ( Arrays . t o S t r i n g ( tab ) ) ; / / tab t r i é

}}� �

Code complèt : Tri par sélection

Page 7: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

� �boolean t r i F i n i = f a l s e ;whi le ( t r i F i n i==f a l s e ) {

t r i F i n i = t r ue ;f o r ( i n t i=0 ; i <n−1 ; i ++)

i f ( tab [ i ]>tab [ i +1 ] ) {t r i F i n i = f a l s e ;i n t tmp = tab [ i ] ;tab [ i ] = tab [ i +1] ;tab [ i +1]=tmp ;

}}� �1 Quel est le résultat de ce (pseudo-)code ?: Il s’appelle le tri à bulles!

Page 8: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

� �boolean t r i F i n i = f a l s e ;whi le ( t r i F i n i==f a l s e ) {

t r i F i n i = t r ue ;f o r ( i n t i=0 ; i <n−1 ; i ++)

i f ( tab [ i ]>tab [ i +1 ] ) {t r i F i n i = f a l s e ;i n t tmp = tab [ i ] ;tab [ i ] = tab [ i +1] ;tab [ i +1]=tmp ;

}}� �1 Quel est le résultat de ce (pseudo-)code ?: Il s’appelle le tri à bulles!

Page 9: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

� �i n t [ ] a p p a r i t i o n s = new i n t [ 5 0 ] ;f o r ( i n t i=0 ; i <n ; i ++)

a p p a r i t i o n s [ tab [ i ] ] ++ ;� �1 Quel est le résultat de ce (pseudo-)code ?2 Comment remplir le tableau trié ?� �i n t pos = 0 ;f o r ( i n t va l=0 ; val <50 ; va l ++)

f o r ( i n t j=0 ; j < a p p a r i t i o n s [ va l ] ; j ++) {tab [ pos ] = va l ;pos++ ;

}� �: Il s’appelle tri par dénombrement !

Page 10: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

� �i n t [ ] a p p a r i t i o n s = new i n t [ 5 0 ] ;f o r ( i n t i=0 ; i <n ; i ++)

a p p a r i t i o n s [ tab [ i ] ] ++ ;� �1 Quel est le résultat de ce (pseudo-)code ?2 Comment remplir le tableau trié ?� �i n t pos = 0 ;f o r ( i n t va l=0 ; val <50 ; va l ++)

f o r ( i n t j=0 ; j < a p p a r i t i o n s [ va l ] ; j ++) {tab [ pos ] = va l ;pos++ ;

}� �: Il s’appelle tri par dénombrement !

Page 11: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

� �i n t n = 20 ;tab = new i n t [ n ] ;f o r ( i n t i=0 ; i <n ; i ++)

tab [ i ] = ( i n t ) (50∗ java . lang . Math . random ( ) ) ;/ / A f f i chage tab leau de dépar tp r i n t l n ( java . u t i l . Arrays . t o S t r i n g ( tab ) ) ;/ / T r i :java . u t i l . Arrays . s o r t ( tab ) ;/ / A f f i chage tab leau t r i ép r i n t l n ( java . u t i l . Arrays . t o S t r i n g ( tab ) ) ;� �• Inconvénient : pour trier en ordre décroissant, il faut

inverser les nombres (ex, 5→ −5) ;Appeler java.util.Arrays.sort(tab) ;inverser les nombres de nouveau.

Page 12: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

� �i n t n = 20 ;tab = new i n t [ n ] ;f o r ( i n t i=0 ; i <n ; i ++)

tab [ i ] = ( i n t ) (50∗ java . lang . Math . random ( ) ) ;/ / A f f i chage tab leau de dépar tp r i n t l n ( java . u t i l . Arrays . t o S t r i n g ( tab ) ) ;/ / T r i :java . u t i l . Arrays . s o r t ( tab ) ;/ / A f f i chage tab leau t r i ép r i n t l n ( java . u t i l . Arrays . t o S t r i n g ( tab ) ) ;� �• Inconvénient : pour trier en ordre décroissant, il faut

inverser les nombres (ex, 5→ −5) ;Appeler java.util.Arrays.sort(tab) ;inverser les nombres de nouveau.

Page 13: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Plan

1 Méthodes de Tri

2 Sac-à-Dos : heuristique et programmation dynamique

9/19

Page 14: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

10€ 12 kg

2€ 2 kg

1€ 7 kg

2€ 1 kg

10€ 4 kg

15 kg

Problème du sac-à-dosSoit un sac-à-dos de capacité donnée,Soit une liste d’articles de poids et valeurs variéesQuels articles choisir pour maximiser le profit ?

Page 15: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Un algorithme glouton

1 Trier les article dans l’ordre décroissant de leur valeur parkg vi

pi(rentabilité)

Utiliser un tri à bulles : à chaque inversion, il faut inver-ser les valeurs par kg, les poids et les valeurs.

2 Remplir le sac avec les articles un par un dans cet ordreon trouve la bonne solution sur l’exemple précédent

! On ne trouve pas toujours la bonne solution

11/19

Page 16: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Un algorithme glouton1 Trier les article dans l’ordre décroissant de leur valeur par

kg vipi

(rentabilité)Utiliser un tri à bulles : à chaque inversion, il faut inver-ser les valeurs par kg, les poids et les valeurs.

2 Remplir le sac avec les articles un par un dans cet ordreon trouve la bonne solution sur l’exemple précédent

! On ne trouve pas toujours la bonne solution

11/19

Page 17: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

États de programmation dynamique

Soit un sac-à-dos de Cap = 10, poids : 5, 4, 3, 2tous les valeurs valent 1

prof max 0 0 0 0 0 0 0 0 0 0 0poids total 0 1 2 3 4 5 6 7 8 9 10

p1 = 5 génère un profit/valeur de 1p2 = 4 génère un profit/valeur de 1p2 = 3 génère un profit/valeur de 1p2 = 2 génère un profit/valeur de 1

12/19

Page 18: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

États de programmation dynamique

Soit un sac-à-dos de Cap = 10, poids : 5, 4, 3, 2tous les valeurs valent 1

prof max 0 0 0 0 0 1 0 0 0 0 0poids total 0 1 2 3 4 5 6 7 8 9 10

p1 = 5 génère un profit/valeur de 1p2 = 4 génère un profit/valeur de 1p2 = 3 génère un profit/valeur de 1p2 = 2 génère un profit/valeur de 1

12/19

Page 19: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

États de programmation dynamique

Soit un sac-à-dos de Cap = 10, poids : 5, 4, 3, 2tous les valeurs valent 1

prof max 0 0 0 0 1 1 0 0 0 2 0poids total 0 1 2 3 4 5 6 7 8 9 10

p1 = 5 génère un profit/valeur de 1p2 = 4 génère un profit/valeur de 1p2 = 3 génère un profit/valeur de 1p2 = 2 génère un profit/valeur de 1

12/19

Page 20: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

États de programmation dynamique

Soit un sac-à-dos de Cap = 10, poids : 5, 4, 3, 2tous les valeurs valent 1

prof max 0 0 0 1 1 1 0 2 2 2 0poids total 0 1 2 3 4 5 6 7 8 9 10

p1 = 5 génère un profit/valeur de 1p2 = 4 génère un profit/valeur de 1p2 = 3 génère un profit/valeur de 1p2 = 2 génère un profit/valeur de 1

12/19

Page 21: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

États de programmation dynamique

Soit un sac-à-dos de Cap = 10, poids : 5, 4, 3, 2tous les valeurs valent 1

prof max 0 0 1 1 1 2 2 2 2 3 3poids total 0 1 2 3 4 5 6 7 8 9 10

p1 = 5 génère un profit/valeur de 1p2 = 4 génère un profit/valeur de 1p2 = 3 génère un profit/valeur de 1p2 = 2 génère un profit/valeur de 1

12/19

Page 22: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Program. dynamique :méthode tabulaire

On utilise une structure tabulaire f à deux dimensions/indicesf (i ,P) optimum d’un sac-à-dos de capacité P en utilisant

que les i premiers articlesC’est un sac-à-dos plus petit

objectif calculer f (n,Pmax)

recursion Toute valeur f (i ,P) peut être calculée à partir desvaleurs f (i−1,0), f (i−1,1), f (i−1,2), . . . f (i−1,P)

13/19

Page 23: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

La récursion pour le sac-à-dos

Comment calculer f (i ,P) à partir d’un sac-à-dos avec i − 1articles : f (i − 1,0), f (i − 1,1), f (i − 1,2), . . . f (i − 1,P)?

On a deux cas :si l’article i est sélectionné : f (i ,P) = vi + f (i − 1,P − pi)

si pi ≤ Psi l’article i n’est pas sélectionné : f (i ,P) = f (i − 1,P)

=⇒f (i ,P) = max(vi + f (i − 1,P − pi), f (i − 1,P))

14/19

Page 24: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

11

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3

i=2

i=1

Page 25: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

12

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3

i=2

i=1 0 0 0 0 0

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 26: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

13

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3

i=2

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 27: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

14

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3

i=2 0

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 28: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

15

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3

i=2 0 0 0

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 29: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

16

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3

i=2 0 0 0 55

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 30: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

17

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3

i=2 0 0 0 55 55

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 31: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

18

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3

i=2 0 0 0 55 55 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 32: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

19

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3

i=2 0 0 0 55 55 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 33: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

20

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 34: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

21

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3 0

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 35: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

22

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3 0 18

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 36: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

23

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3 0 18 18

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 37: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

24

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3 0 18 18 55

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 38: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

25

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3 0 18 18 55 73

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 39: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

26

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3 0 18 18 55 73 100

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 40: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

27

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3 0 18 18 55 73 100 118

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 41: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

28

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4

i=3 0 18 18 55 73 100 118 118

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 42: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

29

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4 0

i=3 0 18 18 55 73 100 118 118

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 43: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

30

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4 0 18 18 55

i=3 0 18 18 55 73 100 118 118

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 44: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

31

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4 0 18 18 55 73

i=3 0 18 18 55 73 100 118 118

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 45: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

32

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4 0 18 18 55 73 100

i=3 0 18 18 55 73 100 118 118

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 46: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

33

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4 0 18 18 55 73 100 118

i=3 0 18 18 55 73 100 118 118

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 47: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

34

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4 0 18 18 55 73 100 118 125

i=3 0 18 18 55 73 100 118 118

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

Page 48: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Illustration de la programmation dynamique : le sac à dos (6/6)

� Un exemple à quatre objets (n = 4 et Pmax = 7) :

35

P=0 P=1 P=2 P=3 P=4 P=5 P=6 P=7

i=4 0 18 18 55 73 100 118 125

i=3 0 18 18 55 73 100 118 118

i=2 0 0 0 55 55 100 100 100

i=1 0 0 0 0 0 100 100 100

Objet 1 2 3 4

Poids 5 3 1 4

Valeur 100 55 18 70

==> VALEUR OPTIMALE = 125

Page 49: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Implémentation à l’aide d’une matrice mat

La valeur f (i ,p) est stockée dans la case mat [i ][p]Initialiser mat [0][0] = mat [0][1] = · · · = mat [0][Pmax ] = 0� �

f o r ( i n t i=0 ; i <n ; i ++)f o r ( i n t p=0 ; p<=PMax ; p++)

i f ( poids [ i ] <=p )mat [ i + 1 ] [ p ]=Math .max(

mat [ i ] [ p ] ,mat [ i ] [ p−poids [ i ] ] + va l [ i ]) ;� �

Ce code calcule mat [i + 1][p] à partir de mat [i ][p] etmax [i ][p − poids[i ]] avec la formule de récurrence

Attention : le premier article se trouve à la case 0 dans lestableaux val et poids

15/19

Page 50: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Le reste des diapos sont uniquement pour votre culturegénérale, ils ne seront pas utilisées pour l’examen ou les TPs.

Page 51: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Rappels matrices sous Java� �i n t [ ] [ ] mat = new i n t [ 9 ] [ 1 0 ] ; / / mat r ice 9 X 10f o r ( i n t i=0 ; i <9 ; i ++) / / i es t l a l i g n e

f o r ( i n t j=0 ; j <10 ; j ++)mat [ i ] [ j ] = i ∗ j ;� �

1 Le code plus haut initialise une matrice (tableau de tableaux)� �vo id a f f i c h e r M a t r i c e ( i n t [ ] [ ] m) {

f o r ( i n t i=0 ; i <m. leng th ; i ++)System . out . p r i n t l n (

java . u t i l . Arrays . t o S t r i n g (m[ i ] ) ) ;}� �2 Voici une méthode qui affiche une matrice

m.length est le nombre de lignesjava.util.Arrays.toString(m[i]) affiche la ligne i

Page 52: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Rappels matrices sous Java� �i n t [ ] [ ] mat = new i n t [ 9 ] [ 1 0 ] ; / / mat r ice 9 X 10f o r ( i n t i=0 ; i <9 ; i ++) / / i es t l a l i g n e

f o r ( i n t j=0 ; j <10 ; j ++)mat [ i ] [ j ] = i ∗ j ;� �

1 Le code plus haut initialise une matrice (tableau de tableaux)� �vo id a f f i c h e r M a t r i c e ( i n t [ ] [ ] m) {

f o r ( i n t i=0 ; i <m. leng th ; i ++)System . out . p r i n t l n (

java . u t i l . Arrays . t o S t r i n g (m[ i ] ) ) ;}� �2 Voici une méthode qui affiche une matrice

m.length est le nombre de lignesjava.util.Arrays.toString(m[i]) affiche la ligne i

Page 53: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

D’autres opérations sur des tableaux

Calculer la sommes des éléments d’un tableauCalculer cette somme de manière récursive !

18/19

Page 54: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

D’autres opérations sur des tableaux

Calculer la sommes des éléments d’un tableauCalculer cette somme de manière récursive !

f ( 0 ,9 ) :r e t u r n tab [ 0 ] + f (1 ,9 )

|<−−−−−−−−−−−−−−−+

f (1 ,9 ) :r e t u r n tab [ 1 ] + f (2 ,9 )

|<−−−−−−−−−−−−−−−+

f (2 ,9 ) :r e t u r n tab [ 2 ] + f (2 ,9 )

|<−−−−−−−−−−−−−−−+. . . . . . . . . . . . .

f ( 9 ,9 ) :r e t u r n tab [ 9 ]

18/19

Page 55: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Récursivité et passage des paramètres� �i n t f ( i n t x , i n t y ) {

i f ( x==y )r e t u r n tab [ x ] ;

r e t u r n tab [ x ]+ f ( x+1 ,y ) ;}p u b l i c s t a t i c vo id main ( ) {

i n t somme ;somme = f ( 0 ,9 ) ; / / tab [ 0 ] + tab [ 1 ] + . . . tab [ 9 ]System . out . p r i n t l n (somme) ;

}� �

les valeurs 0 et 9 sont pas-sées/affectées à x et y

19/19

Page 56: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Récursivité et passage des paramètres� �i n t f ( i n t x , i n t y ) {

i f ( x==y )r e t u r n tab [ x ] ;

r e t u r n tab [ x ]+ f ( x+1 ,y ) ;}p u b l i c s t a t i c vo id main ( ) {

i n t somme ;somme = f ( 0 ,9 ) ; / / tab [ 0 ] + tab [ 1 ] + . . . tab [ 9 ]System . out . p r i n t l n (somme) ;

}� �

pour calculer f(0,9), onappelle f(1,9), qui ap-pelle f(2,9), etc.

19/19

Page 57: Programmation Java : Algorithmescedric.cnam.fr/~porumbed/20172018/vari1/c15.pdfProgrammation Java : Algorithmes Valeur d’accueil et de reconversion en informatique (VARI1) Daniel

Récursivité et passage des paramètres� �i n t f ( i n t x , i n t y ) {

i f ( x==y )r e t u r n tab [ x ] ;

r e t u r n tab [ x ]+ f ( x+1 ,y ) ;}p u b l i c s t a t i c vo id main ( ) {

i n t somme ;somme = f ( 0 ,9 ) ; / / tab [ 0 ] + tab [ 1 ] + . . . tab [ 9 ]System . out . p r i n t l n (somme) ;

}� �D’autres calculs récursif :

Calculer le factoriel de manière récursive !Calculer la suite de Fibonacci de manière récursive !

19/19