Chapitre 9 Algorithmique - Apprendre-en-ligne.net

24 downloads 175 Views 767KB Size Report
algorithmes génétiques et les colonies de fourmis. Exemple 1 .... Modifiez le programme de l'exercice 9.6 pour trouver les 92 solutions. ..... def merge(l1, l2):.
L'informatique au lycée

Chapitre 9

Chapitre 9 Algorithmique On désigne par algorithmique l'ensemble des activités logiques qui relèvent des algorithmes ; en particulier, en informatique, cette discipline désigne l'ensemble des règles et des techniques qui sont impliquées dans la définition et la conception des algorithmes.

9.1.

Quelques définitions

Le mot « algorithme » vient du nom du mathématicien Al Khwarizmi, qui, au 9ème siècle écrivit le premier ouvrage systématique sur la solution des équations linéaires et quadratiques. La notion d'algorithme est donc historiquement liée aux manipulations numériques, mais elle s'est progressivement développée pour porter sur des objets de plus en plus complexes : des textes, des images, des formules logiques, des objets physiques, etc. Un algorithme est un énoncé d'une suite d'opérations permettant de donner la réponse à un problème.

• • • •





Didier Müller

Si les opérations s'exécutent sur plusieurs processeurs en parallèle, on parle d'algorithme parallèle. Si les tâches s'exécutent sur un réseau de processeurs on parle d'algorithme distribué. Un algorithme qui contient un appel à lui-même est dit récursif. Un algorithme glouton est un algorithme qui suit le principe de faire, étape par étape, un choix optimum local, dans l'espoir d'obtenir un résultat optimum global. Dans les cas où l'algorithme ne fournit pas systématiquement la solution optimale, il est appelé une heuristique gloutonne. En optimisation combinatoire, théorie des graphes et théorie de la complexité, une heuristique est un algorithme qui fournit rapidement (en temps polynomial) une solution réalisable, mais pas nécessairement optimale, pour un problème d'optimisation difficile. Une heuristique, ou méthode approximative, est donc le contraire d'un algorithme exact qui trouve une solution optimale pour un problème donné. L'usage d'une heuristique est pertinente pour calculer une solution approchée d'un problème et ainsi accélérer le processus de résolution exacte. Les métaheuristiques forment une famille d'algorithmes d'optimisation visant à résoudre des

9-1

octobre 2015

Algorithmique problèmes d'optimisation difficile (souvent issus des domaines de la recherche opérationnelle, de l'ingénierie ou de l'intelligence artificielle) pour lesquels on ne connaît pas de méthode classique plus efficace. Ces méthodes utilisent cependant un haut niveau d'abstraction, leur permettant d'être adaptées à une large gamme de problèmes différents. Les métaheuristiques les plus connues sont la recherche avec tabous, le recuit simulé, les algorithmes génétiques et les colonies de fourmis.

9.2.

Le problème des huit dames

Le but du problème des huit dames, est de placer huit dames d'un jeu d'échecs sur un échiquier de 8×8 cases sans que les dames ne puissent se menacer mutuellement, conformément aux règles du jeu d'échecs. Par conséquent, deux dames ne devraient jamais partager la même rangée, colonne, ou diagonale (voir dessin ci-contre). Durant des années, beaucoup de mathématiciens, y compris Gauss ont travaillé sur ce problème, qui est un cas particulier du problème généralisé des n-dames, posé en 1850 par Franz Nauck, et qui est de placer n dames « libres » sur un échiquier de n×n cases. En 1874, S. Gunther proposa une méthode pour trouver des solutions en employant des déterminants, et J. W. L. Glaisher affina cette approche. Le problème des huit dames a 92 solutions distinctes, ou seulement 12 solutions si l'on tient compte de transformations telles que des rotations ou des réflexions.

Le problème des huit dames est un bon exemple de problème simple mais non évident. Pour cette raison, il est souvent employé comme support de mise en œuvre de différentes techniques de programmation, y compris d'approches non traditionnelles de la programmation telles que la programmation par contraintes, la programmation logique ou les algorithmes génétiques.

9.2.1.

Algorithme naïf

L'algorithme naïf de recherche exhaustive teste toutes les manières possibles de placer une dame par colonne, pour retirer toutes celles pour lesquelles des dames se menacent mutuellement. Il y a 88 = 16'777'216 placements à explorer.

Exercice 9.1 Programmez l'algorithme naïf pour trouver les 92 solutions au problème des huit dames. Vous représenterez la position par une liste de nombres de 0 à 7. Ces nombres indiquent la ligne sur laquelle la dame se trouve pour la colonne correspondante. Par exemple, la 12 ème solution du graphique ci-dessus sera représentée par la liste : [2, 4, 1, 7, 0, 6, 3, 5].

Didier Müller

9-2

octobre 2017

L'informatique au lycée

Chapitre 9

9.2.2.

Recherche en profondeur

La recherche en profondeur consiste à trouver les solutions en plaçant les dames de gauche à droite. Prenons pour simplifier un exemple sur un damier 4x4. Imaginons que toutes les solutions avec la première dame sur la première ligne ont été trouvées (voir dessin ci-dessous).

On veut maintenant placer la première dame sur la 2ème ligne. Plaçons la deuxième dame sur la ligne 1. Il y a conflit : STOP. On ne cherche pas plus loin. Idem pour les lignes 2 et 3. La seule solution possible est la 4ème ligne. Plaçons maintenant la troisième dame. On peut la mettre sur la première ligne sans conflit. Plaçons alors la 4ème et dernière dame. La seule ligne possible est la 3ème. On a une solution : [1,3,0,2]. On remonte alors dans l'arbre : la troisième dame ne peut se placer sur aucune autre ligne. Remontons encore d'un cran. On a déjà essayé toutes les lignes pour la deuxième dame. Remontons encore d'un cran : plaçons la première dame sur la 3ème ligne et recommençons une recherche en profondeur...

Exercice 9.2 Programmez la recherche en profondeur expliquée ci-dessus. Comptez le nombre de situations (intermédiaires et finales) analysées.

9.2.3

Méthode heuristique

Un algorithme de « réparation itérative » commence typiquement à partir d'un placement de toutes les dames sur l'échiquier, par exemple avec une seule dame par ligne et par colonne. Il essaie ensuite toutes les permutations des colonnes (il n'y a que des conflits diagonaux à tester) pour ne garder que les configurations sans conflits. Il y a 8! = 40'320 placements à explorer.

Exercice 9.3 Placez initialement les 8 dames sur la diagonale de l'échiquier, puis échangez deux colonnes choisies au hasard. Répétez l'opération jusqu'à ce qu'une solution soit trouvée.

Exercice 9.4 Modifiez le programme de l'exercice 9.3 pour trouver les 92 solutions. Le programme ci-dessous pourra vous aider. N'essayez pas de le comprendre, il fait appel à des notions avancées de Python que l'on n'a pas vues (Iterators et generators). Contentez-vous de l'intégrer à votre programme. def all_perms(str):

Didier Müller

9-3

octobre 2015

Algorithmique if len(str) 0 dét(P0P1, P0P3) < 0 dét(P0P1, P0P4) = 0 où les PiPj désignent des vecteurs-colonnes et dét un déterminant 2x2. On dira que : orientation(P0, P1, P2) = 1 orientation(P0, P1, P3)= -1 orientation(P0, P1, P4)= 0 D'où la condition ci-dessous : SI orientation(Q0,Q1,P0)  orientation(Q0,Q1,P1) ET orientation(P0,P1,Q0)  orientation(P0,P1,Q1) ALORS RETOURNER « les deux segments se coupent »

Didier Müller

9-10

octobre 2017

L'informatique au lycée

Chapitre 9

Exercice 9.7 Écrivez un programme Python qui implémente la méthode vue ci-dessus. Le polygone sera donné par la liste de ses sommets. Vous trouverez sur le site compagnon une ébauche à compléter.

9.6.

Enveloppe convexe

Imaginons une planche avec des clous qui dépassent. Englobons ces points avec un élastique que l'on relâche. Le polygone obtenu (en bleu ci-dessous) est l'enveloppe convexe (convex hull).

En trois dimensions, l'idée serait la même avec un ballon qui se dégonflerait jusqu'à être en contact avec tous les points qui sont à la surface de l'enveloppe convexe.

9.6.1.

Marche de Jarvis (Gift wrapping algorithm)

La marche de Jarvis est un algorithme qui « enveloppe » un ensemble de points dans un « papier cadeau » : on accroche ce papier à un point initial p1, puis on le tend, et on tourne autour du nuage de points Le premier point rencontré par le papier sera p1, puis p2, ... jusqu'à retrouver p0. On construit donc l'enveloppe convexe segment par segment, en partant du point p0. Il ne doit y avoir aucun point à gauche du prochain segment pi pi+1. Il n'y a qu'un point pi+1 qui satisfait cette condition ; il faut le chercher parmi les points qui ne sont pas encore sur l'enveloppe convexe. On s'arrête lorsque pi+1 = p0. Remarquons que les points ne sont pas triés, alors que ce sera le cas pour le parcours de Graham. Cet algorithme doit son nom à R. A. Jarvis, qui publia cet algorithme en 1973.

Complexité La complexité est en O(nh), où n est le nombre total de sommets et où h représente le nombre de sommets de l'enveloppe convexe. On qualifie ce genre d'algorithme de « sensible à la sortie ».

Didier Müller

9-11

octobre 2015

Algorithmique

Exercice 9.8 Écrivez un programme Python qui implémente la marche de Jarvis. Vous trouverez sur le site compagnon une ébauche à compléter.

9.6.2.

Parcours de Graham (Graham's scan)

Cet algorithme doit son nom à Ronald Graham, qui a publié l'algorithme original en 1972. La première étape de cet algorithme consiste à rechercher le point le plus à gauche. S'il y a égalité entre plusieurs points, l'algorithme choisit parmi eux le point de plus petite ordonnée. Nommons P0 ce point. La complexité en temps de cette étape est en O(n), n étant le nombre de points de l'ensemble. Les autres points Pi sont ensuite triés en fonction de la pente du segment P0Pi, de la plus grande pente à la plus petite. N'importe quel algorithme efficace de tri convient pour cela. À l'issue de cette étape, on dispose d'un tableau T contenant les points ainsi triés. P0 sera le premier élément de ce tableau.

L'algorithme considère ensuite successivement les séquences de trois points contigus dans le tableau T, vus comme deux segments successifs. On regarde ensuite si ces deux segments mis about à bout constitue un « tournant à gauche » ou un « tournant à droite ». • Si l'on rencontre un « tournant à droite », l'algorithme passe au point suivant de T. • Si c'est un « tournant à gauche », cela signifie que l'avant-dernier point considéré (le deuxième des trois) ne fait pas partie de l'enveloppe convexe, et qu'il doit être enlevé de T. Cette analyse se répète ensuite, tant que l'ensemble des trois derniers points est un « tournant à gauche » .

Le processus se terminera quand on retombera sur le point P0. T contiendra alors les points formant l'enveloppe convexe.

Complexité Le tri des points peut se faire avec une complexité en temps en O(nlog(n)). La complexité de la boucle principale peut sembler être en O(n2), parce que l'algorithme revient en arrière à chaque point pour évaluer si l'un des points précédents est un « tournant à droite ». Mais elle est en fait en O(n), parce que chaque point n'est considéré qu'une seule fois. Ainsi, chaque point analysé soit termine la sous-boucle, soit est retiré de T et n'est donc plus jamais considéré. La complexité globale de l'algorithme est donc en O(nlog(n)), puisque la complexité du tri domine la complexité du calcul effectif de l'enveloppe convexe.

Didier Müller

9-12

octobre 2017

L'informatique au lycée

Chapitre 9

Exercice 9.9 Écrivez un programme Python qui implémente le parcours de Graham. Vous trouverez sur le site compagnon une ébauche à compléter.

9.7.

Algorithmes probabilistes

Un algorithme probabiliste est un algorithme dont le déroulement fait appel à des données tirées au hasard. Dans leur ouvrage Algorithmique, conception et analyse, G. Brassard et P. Bratley classent les algorithmes probabilistes en quatre catégories :

Algorithmes numériques • • •

Utilisés pour approcher la solution à des problèmes numériques (ex. calcul de pi, intégration numérique, etc.). La précision augmente avec le temps disponible. Certains auteurs classent ces algorithmes dans la catégorie Monte Carlo

Algorithmes de Sherwood • • •

Utilisés lorsqu'un algorithme déterministe fonctionne plus rapidement en moyenne qu'en pire cas. Ces algorithmes peuvent éliminer la différence entre bonnes et mauvaises entrées. Exemple : Quicksort

Algorithmes de Las Vegas • •

Ces algorithmes peuvent parfois retourner un message disant qu'ils n'ont pas pu trouver la réponse. La probabilité d'un échec peut être rendu arbitrairement petite en répétant l'algorithme suffisamment souvent.

Algorithmes de Monte Carlo • •

Ces algorithmes retournent toujours une réponse mais celle-ci n'est pas toujours juste. La probabilité d'obtenir une réponse correcte augmente avec le temps disponible.

Exercice 9.10 Modifiez le programme de l'exercice 9.7 qui teste si un point est à l'intérieur d'un polygone, afin d'estimer l'aire de ce polygone. Pour ce faire, vous générerez 100'000 points au hasard et calculerez le pourcentage de points « tombés » à l'intérieur du polygone.

Exercice 9.11 Développez et programmez une méthode basée sur l'estimation de l'aire d'un quart de cercle pour approcher la valeur de p.

Exercice 9.12 : Le compte est bon (2) Nous avons vu au § 7.5 un algorithme récursif cherchant les solutions du jeu. Nous allons ici nous contenter d'une méthode naïve et peu efficace, mais facile à programmer : il s'agira de rechercher aléatoirement des solutions et de ne garder que celle qui se rapproche le plus du résultat demandé, ou qui l'atteint. Données : six nombres dans une liste L et le résultat r à approcher. 1. 2. 3. Didier Müller

Choisir deux nombres a et b au hasard dans la liste L. Choisir une opération arithmétique (+, -, *, /) au hasard. L'opération doit être possible (par exemple, on ne peut pas diviser 5 par 9) et utile (il est inutile par exemple de multiplier un nombre par 1). Poser c := opération(a, b). Mémoriser ce calcul intermédiaire dans une chaîne

9-13

octobre 2015

Algorithmique

4. 5. 6. 7.

de caractères (une string). Éliminer a et b de la liste L. Ajouter c à la liste L. SI c = r ALORS afficher tous les calculs intermédiaires. STOP SI il y a plus d'un nombre dans la liste ALORS aller à 1 SINON afficher la liste des calculs intermédiaires et le résultat obtenu

On répétera cet algorithme des milliers de fois et on n'affichera que la meilleure solution trouvée. Programmez cet algorithme en Python.

Exercice 9.13 Modifiez le programme du § 8.11.2 pour trouver la plus belle grille de Ruzzle grâce à un algorithme probabiliste. Par « plus belle », on entend celle qui contient le plus de mots français. Vous utiliserez le dictionnaire du chapitre 8 qui est disponible sur le site web compagnon : http://ow.ly/35Jlt Voici les fréquences des lettres de ce dictionnaire (on a analysé tous les mots de 2 à 16 lettres sans tiret et sans apostrophe) : E

S

14.89% 10.21%

A

I

R

N

T

O

L

U

C

M

D

9.71%

9.40%

8.67%

7.34%

6.82%

5.82%

4.01%

3.60%

3.40%

2.54%

2.36%

P

G

B

F

H

Z

V

Q

Y

X

J

K

W

2.35%

1.60%

1.40%

1.36%

1.16%

1.07%

0.96%

0.50%

0.34%

0.25%

0.18%

0.05%

0.01%

9.8.

Le problème des n dames pour illustrer les métaheuristiques

Le problème des n dames est une généralisation de du problème des 8 dames, vu au § 9.2 : on considère un échiquier n x n au lieu d'un échiquier 8 x 8. Bien que ce ne soit pas à proprement parlé un problème d'optimisation, il présente de nombreux avantages : • il est visuel et facile à comprendre ; • on peut coder la position des dames très simplement : pour chaque colonne, on note sur quelle ligne se trouve la dame, et on lui soustrait 1. La position ci-contre sera : [1, 3, 5, 7, 2, 0, 6, 4] • on passe très facilement d'une configuration à une configuration voisine (qui ne satisfait pas forcément les contraintes du problème) : il suffit d'échanger deux colonnes. Une position voisine de celle ci-contre pourrait être [1, 0, 5, 7, 2, 3, 6, 4]. On peut le traiter comme un problème d'optimisation si l'on considère qu'il faut minimiser le nombre de conflits (on parlera de conflit quand deux dames se menacent mutuellement). Il s'agira ici de placer n dames sur l'échiquier nxn, sans aucun conflit, en partant d'une solution avec une seule dame par ligne et par colonne (par exemple toutes les dames sur la diagonale) et en échangeant deux colonnes. On ne cherchera pas toutes les solutions possibles : une seule nous suffira. Notons que dans un problème d'optimisation classique, il n'y a en général qu'une seule meilleure solution. Ici il y en a plusieurs. Il est à noter qu'il existe un algorithme permettant de trouver une solution quel que soit n supérieur à 3 (voir exercice 9.14). L'intérêt du § 9.8 n'est donc pas de trouver une solution, mais d'illustrer sur ce problème classique comment se comportent trois des métaheuristiques les plus connues : la recherche avec tabous, le recuit simulé et un algorithme génétique.

Exercice 9.14 1.

Didier Müller

soit r = n mod 12

9-14

octobre 2017

L'informatique au lycée 2. 3. 4. 5. 6.

Chapitre 9 écrire les nombres pairs de 2 à n si r = 3 ou r = 9 mettre le 2 à la fin de la liste écrire ensuite les nombres impairs de 1 à n, mais si r=8 permuter les nombres impairs 2 par 2 (i.e. 3, 1, 7, 5, 11, 9, ...) si r = 2, permuter les places de 1 et 3, puis mettre 5 à la fin de la liste si r = 3 ou r = 9, mettre 1 puis 3 en fin de liste

Programmez cet algorithme en Python. Il donne une solution au problème des n dames. Ainsi, pour n = 8 on obtient la position [2, 4, 6, 8, 3, 1, 7, 5] (dans cet algorithme, les lignes sont numérotées à partir de 1). Pour n = 15, on aura la solution [4, 6, 8, 10, 12, 14, 2, 5, 7, 9, 11, 13, 15, 1, 3]. Vérifiez la validité de cet algorithme pour n = 4 ... 1000.

9.8.1. 1. 2. 3.

Première approche : descente de plus grande pente Générer une position de départ. Essayer toutes les permutations de deux colonnes et échanger les deux colonnes qui permettent de diminuer le plus le nombre de conflits. Retourner à 2 jusqu'à obtenir 0 conflit (dans l'idéal) ou un blocage.

Résultats avec la descente de plus grande pente Nombre de dames (n) Temps ou nombre de conflits restants

20 2 conflits

40 13 sec.

60 1 conflit

80 418 sec.

100 1308 sec.

Commentaires • • •

Selon la position initiale et le nombre de dames, il arrive que l'algorithme se bloque dans un minimum local. C'est arrivé ici avec 20 et 60 dames placées au départ sur la diagonale. Avec 100 dames, on passe d'une situation avec 4950 conflits à une configuration sans conflit en 82 échanges de colonnes. Les temps sont seulement indicatifs et dépendent évidemment de l'ordinateur utilisé. Toutes les expériences ont été faites sur le même ordinateur et dans les mêmes conditions.

Exercice 9.15 Modifiez le programme de l'exercice 9.13 pour rechercher la meilleure grille de Ruzzle grâce à une descente de plus grande pente.

9.8.2.

Deuxième approche : recherche avec tabous

La méthode taboue est une métaheuristique d'optimisation présentée par Fred Glover en 1986. On trouve souvent l'appellation « recherche avec tabous » en français. La méthode taboue consiste, à partir d'une position donnée, à explorer le voisinage et à choisir la position dans ce voisinage qui minimise la fonction objectif (comme dans la descente de plus grande pente). Il est essentiel de noter que cette opération peut conduire à dégrader la valeur de la fonction : c'est le cas lorsque tous les points du voisinage ont une valeur plus élevée. Le risque est qu'à l'étape suivante, on retombe dans le minimum local auquel on vient d'échapper. C'est pourquoi il faut que l'heuristique ait de la mémoire : le mécanisme consiste à interdire (d'où le nom de « tabou ») de revenir sur les dernières positions explorées. Les positions déjà explorées sont conservées dans une file (voir § 6.2), souvent appelée liste des tabous, d'une taille donnée. Cette file doit conserver des positions complètes, mais cela ne pose pas de problèmes avec les n dames. Pour nos expériences, nous avons utilisé une liste de 10 mouvements tabous. Méthode taboue

Rappelons que l'on passe d'une position à une position voisine en échangeant deux colonnes.

Didier Müller

1. 2. 3. 4. 5.

Générer une position de départ. Parmi les positions voisines, choisir la meilleure qui n'est pas dans la liste des tabous. Si la liste des tabous est pleine, retirer de cette liste la position la plus ancienne. Mettre la position actuelle en queue de la liste des tabous. Retourner à 2, tant qu'on n'a pas décidé de s'arrêter.

9-15

octobre 2015

Algorithmique

Résultats avec la méthode taboue Nombre de dames (n) Temps ou nombre de conflits restants

20

40

60

80

100

1 sec.

15 sec.

114 sec.

422 sec.

1756 sec.

Commentaires • • •

Le programme ne se bloque plus dans un minimum local. La solution finale est toujours la même et dépend de la position initiale. Avec 100 dames, on passe d'une situation avec 4950 conflits à une configuration sans conflit en 95 échanges de deux colonnes.

Exercice 9.16 Modifiez le programme de l'exercice 9.13 pour rechercher la meilleure grille de Ruzzle grâce à une recherche avec tabous.

9.8.3.

Troisième approche : recuit simulé

Le recuit simulé (Simulated Annealing en anglais) est une métaheuristique inspirée d'un processus utilisé en métallurgie. Ce processus alterne des cycles de refroidissement lent et de réchauffage (recuit) qui tendent à minimiser l'énergie du matériau. Elle est aujourd'hui utilisée en optimisation pour trouver les extrema d'une fonction. Elle a été mise au point par trois chercheurs de la société IBM, S. Kirkpatrick, C.D. Gelatt et M.P. Vecchi en 1983, et indépendamment par V. Cerny en 1985. Recuit simulé 1. 2. 3. 4. 5. Remarque sur le point 4 Ici, on cherche à minimiser le score, qui est le nombre de conflits. Si on cherche à maximiser le score, il faut calculer D = score(P1) score(P2)

6. 7. 8. 9.

Choisir une « température » de départ T. Générer une position aléatoire. Appelons-la Copier la position P1 dans une position P2, choisies aléatoirement. Calculer D = score(P2) - score(P1) Si D  0, P1  P2 ; le cas échéant, mettre meilleure position. Aller à 8. Générer un nombre réel aléatoire entre 0 et Si r < exp(-D/T), P1  P2. Diminuer T. Retourner à 3, tant qu'on n'a pas décidé de

P1. puis échanger deux colonnes de P1

à jour le meilleur score et la 1, que nous appellerons r. s'arrêter.

Le réglage des paramètres est ici plus délicat. En particulier, comment faut-il faire baisser la température ? Trop vite, on risque de se bloquer dans un minimum local. Trop lentement, le temps de calcul augmentera, sans garantie de trouver une solution. La solution retenue a été de faire baisser la température par palier de longueur 10, avec une température initiale T = 100, avec Tk+1 = 0.6·Tk, k représentant un numéro de palier. C'est très inhabituel, car on prend généralement un coefficient proche de 1.

Résultats avec le recuit simulé Nombre de dames (n) Temps moyen en cas de succès* Nombre de succès sur 10 essais

20 0.3 sec. 7

40 1.5 sec 10

60 4 sec. 10

80 9 sec. 10

100 23 sec. 10

*Il s'agit d'une moyenne sur 10 essais, puisque le hasard joue ici un rôle important. Les temps des essais où l'on n'a pas trouvé de solution n'ont pas été pris en compte.

Commentaires • • Didier Müller

Étant donné l'usage du hasard, on ne sait pas quelle solution finale sera trouvée. Ce ne sera pas toujours la même, contrairement à la recherche avec tabous. Curieusement, le recuit simulé marche le moins bien quand il y a peu de dames (7 succès 9-16

octobre 2017

L'informatique au lycée

Chapitre 9



seulement avec 20 dames). Il est par contre redoutable en temps de calcul, puisqu'il ne lui faut que 23 secondes pour trouver une solution avec 100 dames, alors que la méthode taboue en mettait 1756.

Exercice 9.17 Modifiez le programme de l'exercice 9.13 pour rechercher la meilleure grille de Ruzzle grâce à un recuit simulé.

9.8.4.

Quatrième approche : algorithme génétique

Les algorithmes génétiques appartiennent à la famille des algorithmes évolutionnistes (un sousensemble des métaheuristiques). Leur but est d'obtenir une solution approchée, en un temps correct, à un problème d'optimisation, lorsqu'il n'existe pas ou qu'on ne connaît pas de méthode exacte pour le résoudre en un temps raisonnable. Les algorithmes génétiques utilisent la notion de sélection naturelle développée au XIXe siècle par le célèbre scientifique Darwin et l'appliquent à une population de solutions potentielles au problème donné. On se rapproche par bonds successifs d'une solution. L'utilisation d'algorithmes génétiques, dans la résolution de problèmes, est à l'origine le fruit des recherches de John Holland et de ses collègues et élèves de l'Université du Michigan qui ont, dès 1960, travaillé sur ce sujet. Le premier aboutissement de ces recherches a été la publication en 1975 de Adaptation in Natural and Artificial System. Algorithme génétique 1. 2. 3. 4. 5. 6. 7. 8.

Générer une population de 2n positions aléatoires. Classer et numéroter ces 2n positions selon leur score, du meilleur au moins bon. Croiser les grilles 2k-1 et 2k, pour k allant de 1 à n. Effectuer une mutation pour chaque position : avec une certaine probabilité, effacer une case et placer un nouveau chiffre de 0 à 7. Classer et numéroter les 2n grilles obtenues selon leur score, du meilleur au moins bon. Dupliquer la grille 1 (la meilleure) et placer ce doublon en position 2n, après avoir éliminé la grille 2n (la moins bonne). Le cas échéant, mettre à jour le meilleur score et la meilleure position. Retourner à 3, tant qu'on n'a pas décidé de s'arrêter.

Schéma de l'algorithme génétique

Quelques commentaires sur ce schéma •

Didier Müller

Chaque position est représentée pas une liste de n nombres indiquant la ligne occupée pour la colonne correspondante. Avec 8 dames, la position ci-dessous est représentée par la liste [0, 5, 1, 4, 6, 3, 7, 2].

9-17

octobre 2015

Algorithmique

• • • • •

Chaque position est évaluée grâce à la fonction de performance, ici ce sera le nombre de conflits. (b) Une phase de reproduction détermine quelles positions seront sélectionnées pour la reproduction. Certaines positions peuvent être reproduites plusieurs fois, d'autres disparaîtront. (c) Pour chaque paire se combinant, on détermine aléatoirement le point de croisement. (c) Les enfants sont créés en croisant chaque paire. (d) Finalement, chaque position subit éventuellement une mutation aléatoire. (e)

Commentaire •

Cette approche n'a (pour l'instant) pas donné de résultats intéressants. Elle ne fonctionne qu'avec de petits damiers. Il semble difficile de choisir les différents paramètres.

Exercice 9.18 Modifiez le programme de l'exercice 9.13 pour rechercher la meilleure grille de Ruzzle grâce à un algorithme génétique.

Sources [1] Wikipédia, « Algorithmique », [2] Wikipédia, « Algorithmes de tri », [3] Wikipédia, « Marche de Jarvis », [4] Wikipédia, « Parcours de Graham », [5] Wikipédia, « Test de primalité de Miller-Rabin », [6] Wikipédia, « Méta-heuristique », [7] Wikipédia, « Recuit simulé », [8] Wikipédia, « Algorithme génétique »,

Didier Müller

9-18

octobre 2017