| 1 |
<!-- |
|---|
| 2 |
$Header: /var/lib/cvs/pgsql-fr/sgml/geqo.sgml,v 1.5.2.1 2005/03/20 22:34:40 guillaume Exp $ |
|---|
| 3 |
Genetic Optimizer |
|---|
| 4 |
--> |
|---|
| 5 |
|
|---|
| 6 |
<chapter id="geqo"> |
|---|
| 7 |
<docinfo> |
|---|
| 8 |
<author> |
|---|
| 9 |
<firstname>Martin</firstname> |
|---|
| 10 |
<surname>Utesch</surname> |
|---|
| 11 |
<affiliation> |
|---|
| 12 |
<orgname> |
|---|
| 13 |
University of Mining and Technology |
|---|
| 14 |
</orgname> |
|---|
| 15 |
<orgdiv> |
|---|
| 16 |
Institute of Automatic Control |
|---|
| 17 |
</orgdiv> |
|---|
| 18 |
<address> |
|---|
| 19 |
<city> |
|---|
| 20 |
Freiberg |
|---|
| 21 |
</city> |
|---|
| 22 |
<country> |
|---|
| 23 |
Germany |
|---|
| 24 |
</country> |
|---|
| 25 |
</address> |
|---|
| 26 |
</affiliation> |
|---|
| 27 |
</author> |
|---|
| 28 |
<date>1997-10-02</date> |
|---|
| 29 |
</docinfo> |
|---|
| 30 |
|
|---|
| 31 |
<title id="geqo-title">Optimiseur génétique de requêtes |
|---|
| 32 |
(<foreignphrase>Genetic Query Optimizer</foreignphrase>)</title> |
|---|
| 33 |
|
|---|
| 34 |
<para> |
|---|
| 35 |
<note> |
|---|
| 36 |
<title>Auteur</title> |
|---|
| 37 |
<para> |
|---|
| 38 |
Écrit par Martin Utesch (<email>utesch@aut.tu-freiberg.de</email>) |
|---|
| 39 |
de l'institut de contrôle automatique de l'université des mines et de |
|---|
| 40 |
technologie de Freiberg, Allemagne. |
|---|
| 41 |
</para> |
|---|
| 42 |
</note> |
|---|
| 43 |
</para> |
|---|
| 44 |
|
|---|
| 45 |
<sect1 id="geqo-intro"> |
|---|
| 46 |
<title>Gestion des requêtes comme un problème complexe d'optimisation</title> |
|---|
| 47 |
|
|---|
| 48 |
<para> |
|---|
| 49 |
Parmi tous les opérateurs relationnels, le plus difficile à exécuter et à |
|---|
| 50 |
optimiser est la jointure (<firstterm>join</firstterm>). Le nombre de plans |
|---|
| 51 |
alternatifs pour répondre à une requête croît de façon exponentielle avec le |
|---|
| 52 |
nombre de jointures inclus. Un effort supplémentaire d'optimisation est dû |
|---|
| 53 |
au support d'une variété de <firstterm>méthodes de jointure</firstterm> |
|---|
| 54 |
(par exemple les boucles imbriquées, les jointures de découpage, les |
|---|
| 55 |
jointures d'assemblage dans <productname>PostgreSQL</productname>) pour |
|---|
| 56 |
exécuter des jointures individuelles et une diversité |
|---|
| 57 |
d'<firstterm>index</firstterm> (par exemple R-tree, B-tree, découpage |
|---|
| 58 |
dans <productname>PostgreSQL</productname>) comme chemins d'accès des |
|---|
| 59 |
relations. |
|---|
| 60 |
</para> |
|---|
| 61 |
|
|---|
| 62 |
<para> |
|---|
| 63 |
L'implémentation de l'optimiseur de <productname>PostgreSQL</productname> |
|---|
| 64 |
réalise une <firstterm>recherche pratiquement exhaustive</firstterm> sur |
|---|
| 65 |
tout l'espace des stratégies alternatives. Cet algorithme, tout d'abord |
|---|
| 66 |
introduit dans la base de données <quote>System R</quote>, produit un ordre |
|---|
| 67 |
de jointure presque optimal mais peut prendre beaucoup de temps et d'espace |
|---|
| 68 |
mémoire lorsque le nombre de jointures dans une requête devient important. |
|---|
| 69 |
Ceci rend inapproprié l'optimiseur ordinaire de requêtes de |
|---|
| 70 |
<productname>PostgreSQL</productname> pour les domaines d'applications des |
|---|
| 71 |
bases de données ayant besoin de requêtes complexes, comme en intelligence |
|---|
| 72 |
artificielle. |
|---|
| 73 |
</para> |
|---|
| 74 |
|
|---|
| 75 |
<para> |
|---|
| 76 |
L'institut de contrôle automatique de l'université des mines et de |
|---|
| 77 |
technologie, basé à Freiberg, Allemagne, a rencontré les problèmes décrits |
|---|
| 78 |
car ces employés voulaient utiliser le DBMS |
|---|
| 79 |
<productname>PostgreSQL</productname> comme moteur pour leur système de |
|---|
| 80 |
support pour la maintenance d'une grille de courant électrique. Le DBMS |
|---|
| 81 |
avait besoin de gérer des requêtes comprenant des jointures larges pour la |
|---|
| 82 |
machine d'inférence du système de connaissances. |
|---|
| 83 |
</para> |
|---|
| 84 |
|
|---|
| 85 |
<para> |
|---|
| 86 |
Les difficultés en terme de performance pour l'exploration des plans de |
|---|
| 87 |
requêtes possibles ont créé la demande du développement d'une nouvelle |
|---|
| 88 |
technique d'optimisation. |
|---|
| 89 |
</para> |
|---|
| 90 |
|
|---|
| 91 |
<para> |
|---|
| 92 |
Dans la suite, nous décrivons l'implémentation d'un <firstterm>algorithme |
|---|
| 93 |
génétique</firstterm> pour résoudre le problème des ordres de jointure |
|---|
| 94 |
d'une façon efficace pour les requêtes impliquant un grand nombre de ces |
|---|
| 95 |
jointures. |
|---|
| 96 |
</para> |
|---|
| 97 |
</sect1> |
|---|
| 98 |
|
|---|
| 99 |
<sect1 id="geqo-intro2"> |
|---|
| 100 |
<title>Algorithmes génétiques</title> |
|---|
| 101 |
|
|---|
| 102 |
<para> |
|---|
| 103 |
L'algorithme génétique (<acronym>GA</acronym>) est une méthode |
|---|
| 104 |
heuristique d'optimisation qui opère via des recherches déterminées au |
|---|
| 105 |
hasard. L'ensemble des solutions possibles pour le problème d'optimisation |
|---|
| 106 |
est considéré comme une <firstterm>population</firstterm> |
|---|
| 107 |
d'<firstterm>individus</firstterm>. Le degré d'adaptation d'un individu |
|---|
| 108 |
dans son environnement est spécifié par sa <firstterm>forme |
|---|
| 109 |
physique</firstterm>. |
|---|
| 110 |
</para> |
|---|
| 111 |
|
|---|
| 112 |
<para> |
|---|
| 113 |
Les coordonnées d'un individu dans l'espace de recherche sont représentées |
|---|
| 114 |
par des <firstterm>chromosomes</firstterm>, en fait un ensemble de chaînes |
|---|
| 115 |
de caractères. Un <firstterm>gène</firstterm> est une sous-section d'un |
|---|
| 116 |
chromosome qui code la valeur d'un seul paramètre en cours d'optimisation. |
|---|
| 117 |
Les codages typiques pour un gène pourraient être |
|---|
| 118 |
<firstterm>binary</firstterm> ou <firstterm>integer</firstterm>. |
|---|
| 119 |
</para> |
|---|
| 120 |
|
|---|
| 121 |
<para> |
|---|
| 122 |
À travers la simulation des opérations évolutives |
|---|
| 123 |
(<firstterm>recombinaison</firstterm>, <firstterm>mutation</firstterm> et |
|---|
| 124 |
<firstterm>sélection</firstterm>), de nouvelles générations de points de |
|---|
| 125 |
recherche sont trouvées affichant une meilleure forme physique que leurs |
|---|
| 126 |
ancêtres. |
|---|
| 127 |
</para> |
|---|
| 128 |
|
|---|
| 129 |
<para> |
|---|
| 130 |
D'après la <acronym>FAQ</acronym> de <systemitem |
|---|
| 131 |
class="resource">comp.ai.genetic</>, il ne peut pas être dit plus fortement |
|---|
| 132 |
qu'un <acronym>GA</acronym> n'est pas une recherche effectuée seulement au |
|---|
| 133 |
hasard. Un <acronym>GA</acronym> utilise des processus stochastiques mais |
|---|
| 134 |
le résultat n'est pas du tout dû au hasard (mieux que cela). |
|---|
| 135 |
</para> |
|---|
| 136 |
|
|---|
| 137 |
<figure id="geqo-diagram"> |
|---|
| 138 |
<title>Diagramme structuré d'un algorithme génétique</title> |
|---|
| 139 |
|
|---|
| 140 |
<informaltable frame="none"> |
|---|
| 141 |
<tgroup cols="2"> |
|---|
| 142 |
<tbody> |
|---|
| 143 |
<row> |
|---|
| 144 |
<entry>P(t)</entry> |
|---|
| 145 |
<entry>génération des ancêtres au temps t</entry> |
|---|
| 146 |
</row> |
|---|
| 147 |
|
|---|
| 148 |
<row> |
|---|
| 149 |
<entry>P''(t)</entry> |
|---|
| 150 |
<entry>génération des descendants au temps t</entry> |
|---|
| 151 |
</row> |
|---|
| 152 |
</tbody> |
|---|
| 153 |
</tgroup> |
|---|
| 154 |
</informaltable> |
|---|
| 155 |
|
|---|
| 156 |
<literallayout class="monospaced"> |
|---|
| 157 |
+=========================================+ |
|---|
| 158 |
|>>>>>>>>>>> Algorithme GA <<<<<<<<<<<<<<| |
|---|
| 159 |
+=========================================+ |
|---|
| 160 |
| INITIALISE t := 0 | |
|---|
| 161 |
+=========================================+ |
|---|
| 162 |
| INITIALISE P(t) | |
|---|
| 163 |
+=========================================+ |
|---|
| 164 |
| évalue FORMEPHYSIQUE de P(t) | |
|---|
| 165 |
+=========================================+ |
|---|
| 166 |
| tant que pas ARRET CRITERE faire | |
|---|
| 167 |
| +-------------------------------------+ |
|---|
| 168 |
| | P'(t) := RECOMBINAISON{P(t)} | |
|---|
| 169 |
| +-------------------------------------+ |
|---|
| 170 |
| | P''(t) := MUTATION{P'(t)} | |
|---|
| 171 |
| +-------------------------------------+ |
|---|
| 172 |
| | P(t+1) := SELECTION{P''(t) + P(t)} | |
|---|
| 173 |
| +-------------------------------------+ |
|---|
| 174 |
| | évalue FORMEPHYSIQUE de P''(t) | |
|---|
| 175 |
| +-------------------------------------+ |
|---|
| 176 |
| | t := t + 1 | |
|---|
| 177 |
+===+=====================================+ |
|---|
| 178 |
</literallayout> |
|---|
| 179 |
</figure> |
|---|
| 180 |
</sect1> |
|---|
| 181 |
|
|---|
| 182 |
<sect1 id="geqo-pg-intro"> |
|---|
| 183 |
<title>Optimisation génétique des requêtes (<acronym>GEQO</acronym>) avec |
|---|
| 184 |
PostgreSQL</title> |
|---|
| 185 |
|
|---|
| 186 |
<para> |
|---|
| 187 |
Le module <acronym>GEQO</acronym> est la solution du problème |
|---|
| 188 |
d'optimisation des requêtes, une solution similaire au problème du voyageur |
|---|
| 189 |
de commerce (<acronym>TSP</acronym>). Les plans de requêtes possibles sont |
|---|
| 190 |
codés comme des chaînes d'entiers. Chaque chaîne représente l'ordre de |
|---|
| 191 |
jointure d'une relation de la requête à une autre. Par exemple, l'arbre de |
|---|
| 192 |
requêtes |
|---|
| 193 |
<literallayout class="monospaced"> |
|---|
| 194 |
/\ |
|---|
| 195 |
/\ 2 |
|---|
| 196 |
/\ 3 |
|---|
| 197 |
4 1 |
|---|
| 198 |
</literallayout> |
|---|
| 199 |
est codé avec la chaîne d'entiers '4-1-3-2', ce qui signifie : |
|---|
| 200 |
première jointure entre les relations '4' et '1', puis '3' et enfin |
|---|
| 201 |
'2', avec 1, 2, 3, 4 les identifiants des relations pour l'optimiseur de |
|---|
| 202 |
<productname>PostgreSQL</productname>. |
|---|
| 203 |
</para> |
|---|
| 204 |
|
|---|
| 205 |
<para> |
|---|
| 206 |
Des parties du module <acronym>GEQO</acronym> sont adaptées de l'algorithme |
|---|
| 207 |
Genitor de D. Whitley. |
|---|
| 208 |
</para> |
|---|
| 209 |
|
|---|
| 210 |
<para> |
|---|
| 211 |
Les caractéristiques spécifiques de l'implémentation de |
|---|
| 212 |
<acronym>GEQO</acronym> dans <productname>PostgreSQL</productname> |
|---|
| 213 |
sont : |
|---|
| 214 |
|
|---|
| 215 |
<itemizedlist spacing="compact" mark="bullet"> |
|---|
| 216 |
<listitem> |
|---|
| 217 |
<para> |
|---|
| 218 |
Utilisation d'un <firstterm>état d'équilibre</firstterm> du |
|---|
| 219 |
<acronym>GA</acronym> (remplacement des individus les moins performants |
|---|
| 220 |
d'une population, pas un remplacement d'une génération complète) qui |
|---|
| 221 |
permet une convergence rapide vers les plans de requêtes améliorés. C'est |
|---|
| 222 |
essentiel pour une gestion des requêtes sur un temps raisonnable ; |
|---|
| 223 |
</para> |
|---|
| 224 |
</listitem> |
|---|
| 225 |
|
|---|
| 226 |
<listitem> |
|---|
| 227 |
<para> |
|---|
| 228 |
Utilisation d'un <firstterm>croisement de recombinaison de |
|---|
| 229 |
bord</firstterm> qui convient tout spécialement pour garder bas le |
|---|
| 230 |
nombre de pertes aux bords pour la solution du <acronym>TSP</acronym> en |
|---|
| 231 |
utilisant un <acronym>GA</acronym>; |
|---|
| 232 |
</para> |
|---|
| 233 |
</listitem> |
|---|
| 234 |
|
|---|
| 235 |
<listitem> |
|---|
| 236 |
<para> |
|---|
| 237 |
La mutation comme opérateur génétique est obsolète d'une telle façon |
|---|
| 238 |
qu'aucun mécanisme de réparation n'est nécessaire pour générer des tours |
|---|
| 239 |
<acronym>TSP</acronym> légaux. |
|---|
| 240 |
</para> |
|---|
| 241 |
</listitem> |
|---|
| 242 |
</itemizedlist> |
|---|
| 243 |
</para> |
|---|
| 244 |
|
|---|
| 245 |
<para> |
|---|
| 246 |
Le module <acronym>GEQO</acronym> permet à l'optimiseur de requêtes de |
|---|
| 247 |
<productname>PostgreSQL</productname> de supporter les requêtes disposant |
|---|
| 248 |
de jointures importantes de manière efficace via une recherche non |
|---|
| 249 |
exhaustive. |
|---|
| 250 |
</para> |
|---|
| 251 |
|
|---|
| 252 |
<sect2 id="geqo-future"> |
|---|
| 253 |
<title>Tâches pour la future implémentation de <acronym>GEQO</acronym> pour |
|---|
| 254 |
<productname>PostgreSQL</></title> |
|---|
| 255 |
|
|---|
| 256 |
<para> |
|---|
| 257 |
Un gros travail est toujours nécessaire pour améliorer les paramètres de |
|---|
| 258 |
l'algorithme génétique. |
|---|
| 259 |
Dans le fichier <filename>backend/optimizer/geqo/geqo_params.c</filename>, |
|---|
| 260 |
pour les routines <function>gimme_pool_size</function> et |
|---|
| 261 |
<function>gimme_number_generations</function>, nous devons trouver un |
|---|
| 262 |
compromis dans les paramètres pour satisfaire deux demandes |
|---|
| 263 |
concurrentes : |
|---|
| 264 |
<itemizedlist spacing="compact"> |
|---|
| 265 |
<listitem> |
|---|
| 266 |
<para> |
|---|
| 267 |
Plan de requête optimum |
|---|
| 268 |
</para> |
|---|
| 269 |
</listitem> |
|---|
| 270 |
<listitem> |
|---|
| 271 |
<para> |
|---|
| 272 |
Temps de calcul |
|---|
| 273 |
</para> |
|---|
| 274 |
</listitem> |
|---|
| 275 |
</itemizedlist> |
|---|
| 276 |
</para> |
|---|
| 277 |
|
|---|
| 278 |
</sect2> |
|---|
| 279 |
</sect1> |
|---|
| 280 |
|
|---|
| 281 |
<sect1 id="geqo-biblio"> |
|---|
| 282 |
<title>Lectures supplémentaires</title> |
|---|
| 283 |
|
|---|
| 284 |
<para> |
|---|
| 285 |
Les ressources suivantes contiennent des informations supplémentaires sur |
|---|
| 286 |
les algorithmes génétiques : |
|---|
| 287 |
|
|---|
| 288 |
<itemizedlist> |
|---|
| 289 |
<listitem> |
|---|
| 290 |
<para> |
|---|
| 291 |
<ulink url="http://surf.de.uu.net/encore/www/">The Hitch-Hiker's |
|---|
| 292 |
Guide to Evolutionary Computation</ulink> (FAQ de <ulink |
|---|
| 293 |
url="news://comp.ai.genetic">comp.ai.genetic</ulink>) |
|---|
| 294 |
</para> |
|---|
| 295 |
</listitem> |
|---|
| 296 |
|
|---|
| 297 |
<listitem> |
|---|
| 298 |
<para> |
|---|
| 299 |
<ulink url="http://www.red3d.com/cwr/evolve.html">Evolutionary |
|---|
| 300 |
Computation and its application to art and design</ulink> par |
|---|
| 301 |
Craig Reynolds |
|---|
| 302 |
</para> |
|---|
| 303 |
</listitem> |
|---|
| 304 |
|
|---|
| 305 |
<listitem> |
|---|
| 306 |
<para> |
|---|
| 307 |
<xref linkend="ELMA99"> |
|---|
| 308 |
</para> |
|---|
| 309 |
</listitem> |
|---|
| 310 |
|
|---|
| 311 |
<listitem> |
|---|
| 312 |
<para> |
|---|
| 313 |
<xref linkend="FONG"> |
|---|
| 314 |
</para> |
|---|
| 315 |
</listitem> |
|---|
| 316 |
</itemizedlist> |
|---|
| 317 |
</para> |
|---|
| 318 |
|
|---|
| 319 |
</sect1> |
|---|
| 320 |
</chapter> |
|---|
| 321 |
|
|---|
| 322 |
<!-- Keep this comment at the end of the file |
|---|
| 323 |
Local variables: |
|---|
| 324 |
mode:sgml |
|---|
| 325 |
sgml-omittag:nil |
|---|
| 326 |
sgml-shorttag:t |
|---|
| 327 |
sgml-minimize-attributes:nil |
|---|
| 328 |
sgml-always-quote-attributes:t |
|---|
| 329 |
sgml-indent-step:1 |
|---|
| 330 |
sgml-indent-data:t |
|---|
| 331 |
sgml-parent-document:nil |
|---|
| 332 |
sgml-default-dtd-file:"./reference.ced" |
|---|
| 333 |
sgml-exposed-tags:nil |
|---|
| 334 |
sgml-local-catalogs:("/usr/lib/sgml/catalog") |
|---|
| 335 |
sgml-local-ecat-files:nil |
|---|
| 336 |
End: |
|---|
| 337 |
--> |
|---|