Lec 08_Backt

Download Lec 08_Backt

Post on 18-Apr-2015

23 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

<p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>STRUCTURES DE DONNESProf. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>CONCEPTION DE PROGRAMMES:BACKTRACKING</p> <p>Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Objectifs Problmes viss La recherche dune rponse au problme ncessite la recherche dun nombre important de solutions plausibles</p> <p> Problmes de type combinatoireProf. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>4</p> <p>?</p> <p>9</p> <p>7</p> <p>SudokoProf. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Plan de la leon Problme du sac dos Permutation Problme des n reines</p> <p>Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problmes du sac dos</p> <p>Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosRemplir un sac dos avec un certain nombre d'objets de faon le remplir exactementComment fait-on?Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosModlisation Des poids: a0, a1, , an</p> <p> Le poids permis: S</p> <p>Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosModlisationExiste-t-il des nombres xi {0,1} tels que S = x0a0 + x1a1 + ... + xn-1an-1Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosModlisationExiste-t-il des nombres xi {0,1} tels que Si xi=1 on doit prendre l'objet ai Sinon on ne le prend pasProf. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosde recherche des solutionsDoit tre capable d'numrer rapidement tous les n-uplets de valeurs des xiProf. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>Algorithme</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosCas n=3void sacADos3(int[] a, int S){ int S0, S1, S2; for(int x0 = 0; x0 &lt; 2; x0++){ S0 = x0 * a[0]; for(int x1 = 0; x1 &lt; 2; x1++){ S1 = S0 + x1 * a[1]; for(int x2 = 0; x2 &lt; 2; x2++){ S2 = S1 + x2 * a[2]; if(S2 == S) printf("%d+%d+%d\n",x0,x1,x2); } } } }Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosCas n=3 Le programme n'est pas volutif Traiter des cas particuliers fixes, exige de connatre n la compilation</p> <p>Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosDeuxime approche Toute solution peut s'crire comme une suite de bits x0 , x1 , ... , xn-1Correspond un entier unique</p> <p>x = x020 + x121 + ... + xn-12n-1de l'intervalle I=[0, 2n[Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosDeuxime approcheParcourir l'ensemble des solutions possibles ou bien lintervalleI=[0, 2n[</p> <p>n=4 a={2,12,23,30} S=44 x0, x1, x3 ou bien x=1101=13Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosEnumration de I=[0,2n[ Comment passer en revue tous les lments de I?</p> <p>Laddition : +1Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosEnumration de I=[0,2n[ Programmer l'addition binaire sur un entier n reprsent comme un tableau de bits x</p> <p>Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosEnumration de I=[0,2n[ Programmer l'addition binaire Gestion virtuelle de la retenue</p> <p>13 = 1+1+0+1 14 = 1+1+1+0Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dosEnumration de I=[0,2n[ Programmer l'addition binaire Gestion virtuelle de la retenue// simulation for(int j = if(x[j] == else{ x[j] }Prof. A. EL FAKERENSIAS - UNIVERSITE MOHAMMED V SOUISSI</p> <p>de l'addition x[]=x[]+1 0; j &lt; n; j++){ 1) x[j] = 0; = 1; break; } // on a fini</p> <p>n 8 Conception et programmes : BackTracking Leon n. 1 Introduction de vue densemble</p> <p>Structures de donnes</p> <p>Problme du sac dos//a[0..n[:a-t-on somme(a[i]*x[i],i=0..n-1)=S? void sacADos(int [] a, int S){ int n=sizeof(a); int* x = (int *) malloc(n*sizeof(int)); for(int i = 0; i &lt; (1 </p>