• Aucun résultat trouvé

CHAPITRE 6 GÉNÉRATION DE CAS DE TESTS PAR MÉTHODES META-HEURISITIQUES

6.2 Technique

6.2.2 Paramètres de l’algorithme génétique

L’algorithme utilisé pour produire les résultats expérimentaux présentés est illustré par la Figure 6.2. Plusieurs paramètres de cet algorithme sont discutés dans cette section.

Dans notre cas, le génome d’un individu de la population est l’ensemble des paramètres de configurations qui contrôle le générateur de requêtes SQL aléatoire. Il y a un peu plus d’une centaine de paramètres de configurations stockés dans chaque fichier de configuration. Ces paramètres contrôlent des aspects du processus de génération tel que le nombre minimal et maximal de tables pouvant être utilisés dans une requête ou la probabilité d’utiliser un type particulier de jointure.

Les paramètres sont représentés en mémoire comme un structure de données associant chaque nom d’un paramètre avec sa valeur. L’ordre des paramètres dans le fichier de configu- ration n’est pas important. Chaque génome peut être représenté comme une table de hachage associant chaque paramètre avec sa valeur.

1 P = ∅ // Population

// Initialize initial population

2 while |P | < INITIAL_SIZE do 3 P = P ∪ NewRandomGenome();

4 end

// Repeat for each generation

5 for index = 1 to N_GENERATIONS do

6 N EW _P ← P // genomes of reproduced generation

// Create new genomes by crossover

7 N EW _G = ∅; 8 for i = 1 to |P | do

9 gr ← RandomElement(P);

10 N EW _G = N EW _G ∪ CrossOver(gi, gr);

11 end

// Add random genomes

12 for i = 1 to RANDOM_SIZE do

13 N EW _G = N EW _G ∪ NewRandomGenome();

14 end

// Evaluate fitness and select genomes

15 for g∈ NEW _G do

16 Generate random queries from configuration genome g; 17 Execute queries and collect the optimization rule sequence S; 18 if Fitness( P , S) then 19 N EW _P = N EW _P ∪ (g, S) ; 20 end 21 end 22 P = N EW _P ; 23 end

Figure 6.2 Algorithme génétique.

produit un ensemble de requête SQL selon une distribution probabiliste de la taille, de la complexité et d’autres facteurs tout en respectant les paramètres du fichier de configuration. Une population P d’individus i différents est un ensemble de paires (g, Sn) où pour

chaque individu i, gi est un paramètre du génome et Sin est un ensemble de sous-séquences

de règles tel que défini par l’équation (6.6). Les séquences Sn sont obtenues en générant les requêtes SQL spécifiées par le génome gi et en optimisant ces requêtes avec le SGBD

DB2. Une trace d’exécution de l’optimiseur est récupérée pendant l’exécution de la requête et finalement les séquences pertinentes de règles d’optimisation de longueur n sont extraites de la trace et sont stockées pour l’individu i en tant que l’ensemble Sn

1Join.Inner.Weight = 9 2Join.Left.Weight = 76 3Join.Outer.Weight = 54 4Join.Right.Weight = 71 5JoinPred.FakeJoin.Weight = 0 6JoinPred.NameJoin.Exclude = "" 7JoinPred.NameJoin.Weight = 68 8JoinPred.Options.EQ.Weight = 75 9JoinPred.Options.GT.Weight = 96 10JoinPred.Options.GTE.Weight = 3 11JoinPred.Options.JoinPreds.Include = "" 12JoinPred.Options.LT.Weight = 43 13JoinPred.Options.LTE.Weight = 47 14JoinPred.Options.LocalPreds.Include = "" 15JoinPred.Options.NEQ.Weight = 98 16JoinPred.RealJoin.Weight = 2 17JoinPred.SelfJoin.Allowed = Yes 18MateFactor.Compute.AllJoins.Factor = 1 19MateFactor.Compute.FakeJoin.Factor = 1 20MateFactor.Compute.Maturity.Factor = 1

Figure 6.3 Vingt premières ligne d’un fichier de configuration.

La population initiale de génomes est produite aléatoirement en lançant un pilote qui va donner une valeur aléatoire mais valide à chacun des paramètres du fichier de configuration et puis va exécuter le générateur de requêtes en utilisant le fichier de configuration ainsi créés comme illustré par la Figure 6.4.

La fonction d’adéquation évalue l’adéquation d’un génome particulier conformément à l’objectif de l’évolution espéré. Un génome est considéré intéressant s’il soutient l’objectif des tests. Des requêtes SQL sont générés à partir d’un génome selon les paramètres de configu- rations spécifiés dans celui-ci, la requête est alors exécuté par le SGBD, la trace d’exécution de l’optimiseur est collectée et la séquence de règles d’optimisation est extraite et finalement cette séquence est évaluée par la fonction d’adéquation en fonction de l’objectif des tests.

Pour l’expérience présentée nous avons choisi une règle dans le système et nous avons laissé l’algorithme génétique générer des requêtes contenant cette règle.

Même si plusieurs définitions différentes peuvent être envisagées pour la fonction d’adé- quation, dans le cadre de cette expérience la valeur d’adéquation a été calculé selon l’équa- tion (6.5). La fonction Fitness(P , Sn

x) considère le nombre de n-uplets distincts contenant la

règle visée rIda. Sn est l’ensemble de toutes le sous-séquences de longueur n contenant la

règle rIda dans optimization_rule_seq.

Figure 6.4 Diagramme montrant la rétroaction entre le générateur de requête aléatoire et le SGBD

lors de l’évaluation de son adéquation. target_rule_seq doit être une séquence plus courte que optimization_rule_seq. La fonction d’adéquation est définie de manière à maximiser la diversité des chaînes de règles contenant la règle visée. Nous avons expérimenté avec des chaînes de règles Sn dont la taille n varie entre un et quatre.

Fitness(P, Sn

x) : (gx, Sxn)is added to current population ↔

↔ Sn x \ ( [ i∈P Sin ) 6= ∅ (6.5)

target_rule_seq = (rIda)

optimization_rule_seq = (orId1, orId2, . . . , orIdm)

Sn ={ (orId x, orId(x+1), . . . , orId(x+n−1))∈ optimization_rule_seq| (rIda = orIdx) ∨ ∨ (rIda = orId(x+1)) ∨ . . . ∨ (rIda = orId(x+n−1))} (6.6)

Le processus de sélection produit une nouvelle génération d’individus à partir en partie d’individus de l’ancienne génération et en partie d’individus nouvellement créé après l’étape d’évaluation de l’adéquation. Dans notre approche, tous les individus de l’ancienne généra- tion sont retenus pour la génération suivante. Nous avons choisi de préférer les individus qui génèrent des requêtes déclenchant l’exécution de sous-séquence de règles d’optimisations qui n’avaient pas été exécutées par les requêtes précédentes conformément à l’objectif visé. Les individus nouvellement créés sont ajoutés à la nouvelle génération si leurs requêtes dé- clenchent l’exécution de nouvelles sous-séquences pertinentes pour l’objectif des tests et qui n’ont pas été vus dans la génération précédente de la population. De plus, un nombre restreint d’individus générés aléatoirement est ajouté à chaque génération.

Plusieurs stratégies peuvent être utilisés pour faire évoluer un génome. Deux des plus communes sont l’entrecroisement et les mutations. L’entrecroisement échange une ou plu- sieurs parties d’un fichier de paramètres avec des parties d’un second fichier de paramètres pour produire un nouveau fichier paramètres qui contient des parties de ces deux ancêtres. Ce nouveau fichier de paramètres sera considéré comme le génome d’un nouvel individu. La mutation effectue aléatoirement des modifications à certains paramètres dans un fichier de paramètres existant pour produire le génome d’un nouvel individu muté. Dans notre algo- rithme génétique plutôt que de faire des mutations aléatoires sur certains individus nous avons ajouté de nouveaux génomes entièrement générés aléatoirement à chacune des générations.