Sie sind auf Seite 1von 56

Optimisation de la demande dans les entrepôts par

Réseaux
de Neurones
Artificiels
Le système nerveux central est constitué de cellules nerveuses et de gliales (seconds
composants du tissu nerveux assurant plusieurs fonctions dont le soutien et la nutrition des
neurones). Notre cerveau contient environ 100 milliards de neurones, dont chacun
communique avec 10 000 autres de ses voisins.

Neurone biologique
• La synapse désigne une zone de
contact fonctionnelle qui s'établit entre
deux neurones, ou entre un neurone et une
autre cellule (cellules musculaires,
récepteurs sensoriels).
• Au niveau biologique, les synapses n’ont pas
toutes la même valeur (les connexions entre
les neurones étant plus ou moins fortes)

Chaque cellule nerveuse possède un corps cellulaire qui abrite le noyau et des prolongements.
Un seul prolongement est centrifuge : l'axone. Plusieurs prolongements peuvent être
centripètes : les dendrites. Au niveau des synapses les neurones établissent des connexions
entre eux. Ce sont surtout les synapses qui conditionnent le sens de l'influx. Les neurones
forment des circuits complexes, essentiels au fonctionnement du système nerveux.
Neurone biologique

Jonction entre
deux neurones

1. Mitochondrie
2. Vésicule synaptique avec des neurotransmetteurs
3. Autorécepteur
4. Fente synaptique avec neurotransmetteur libéré
5. Récepteurs postsynaptiques activés par neurotransmetteur
6. Canal calcium
7. Exocytose d'une vésicule
8. Neurotransmetteur recapturé

Dans une synapse électrique, les membranes plasmiques des cellules pré- et postsynaptiques
sont réunies par des connexions. Le flux d'ions à travers les tunnels permet à l'influx électrique
de passer directement d'une cellule à l'autre.

Dans une synapse chimique un espace


étroit, la fente synaptique, sépare les
membranes plasmiques des cellules
pré- et postsynaptiques. L'arrivée des
influx jusqu'à l'extrémité axonale du
neurone présynaptique libère un
neuromédiateur qui diffuse dans la
fente synaptique et se fixe à des
récepteurs ancrés dans la membrane
postsynaptique. La transmission est
unidirectionnelle.
MORPHOLOGIE DES SYNAPSES CHIMIQUES
Neurone biologique
Jonction neuromusculaire

Vue détaillée d'une jonction

1. Axone
2. Jonction
3. Fibre
musculaire
4. Myofibrille 1. Élément pré-synaptique
2. Sarcoplasme
3. Vésicules synaptiques
4. Récepteur cholinergique nicotinique
5. Mitochondrie

Lors du réflexe myotatique CF réflexe de flexion, l'élément présynaptique rencontre la plaque


motrice de la fibre musculaire qui est composée d'une membrane plasmique appelée
sarcolemme faisant office d'élément postsynaptique et contenant plusieurs centaines de
myofibrilles.

Électronographie d’une synapse


neuromusculaire
sans stimulation pré-synaptique

Électronographie d’une synapse


neuromusculaire
avec stimulation pré-synaptique
Neurone biologique

• Le soma du neurone intègre les influx électriques qui lui


proviennent de ses dendrites :
– Si la sommation dépasse un seuil, le neurone répond par un influx
nerveux ou potentiel d’action qui se propage le long de son axone
aux neurones auxquels il est connecté.
– Si la somation est inférieure à ce seuil, le neurone reste inactif.

Le neurone reçoit, traite des informations et produit un signal qu'il conduit et transmet. Chaque
neurone est unique, n'étant ni équivalent au neurone voisin, ni interchangeable. Son originalité
tient à sa position particulière dans le système nerveux et à ses connexions déterminées avec
d'autres neurones ou avec la périphérie. De plus, la cellule nerveuse mature ne se divise pas
(notion classique) et le stock total de neurones est déterminé très tôt dans la vie d'un individu.

La cellule nerveuse est constituée d'un corps cellulaire (péricaryon) contenant le noyau, et de
prolongements cytoplasmiques qui constituent les dendrites et l'axone.

 Les dendrites sont des prolongements courts conduisant l'influx nerveux vers le corps
cellulaire. Leur distribution dans l'espace définit le champ des influences auxquelles le
neurone est soumis.
 L'axone est un prolongement unique. Son cône
d'implantation est une région privilégiée où nait
l'influx nerveux, c'est-à-dire l'activité intégrée du
neurone modifiée par l'environnement. L'axone
est une structure qui conduit vers d'autres
neurones ou cellules effectrices, à partir du corps
cellulaire, cet influx nerveux.
 La synapse est une zone particulière de
juxtaposition des membranes plasmiques, dont l'une au moins appartient à un neurone.
Ces zones de différenciations sont destinées à la transmission unidirectionnelle de
l'influx nerveux d'une cellule à l'autre.

Chaque neurone possède en son noyau un additionneur qui somme les impulsions électriques
amplifiées par les synapses à l'entrée dans le neurone et un seuil de stimulation. Si l'excitation
totale du neurone excède le seuil de stimulation, le noyau initie une impulsion.
Neurone formel
• Un neurone formel est une représentation mathématique
et informatique du neurone biologique.
• Il reproduit certaines caractéristiques biologiques, en
particulier les dendrites, axone et synapses, au moyen de
fonctions et de valeurs numériques.
corps cellulaire

dendrites seuillage

axone
sommation

Neurone formel
• Chaque neurone reçoit un nombre de signaux xi
• Des poids réels wi sont utilisés pour décrire la force de la connexion.
• Le niveau d’activation ∑wixi détermine la force cumulative des signaux
d’entrée .
• Une fonction de transfert calcul l’état final de la sortie.

∑ƒ

Un "neurone formel" (ou simplement "neurone") est une fonction algébrique non linéaire et
bornée, dont la valeur dépend de paramètres appelés coefficients ou poids. Les variables de
cette fonction sont habituellement appelées "entrées" du neurone, et la valeur de la fonction
est appelée sa "sortie".

Un neurone est donc avant tout un opérateur mathématique, dont on peut calculer la valeur
numérique. une représentation graphique du neurone formel est indiqué sur la figure.

Les intrants pondérés par un poids (weight) et sommés, sont ensuite comparés à un seuil
d’activation et passés dans la fonction de transfert du neurone, qui produit l’extrant (output)
désiré.
Neurone formel/Biologique

Neurone biologique Neurone formel


Dendrite Entrée
Synapse Poids
Corps cellulaire Fonction de transfert
Axone Sortie

La structure d’un neurone artificiel est en fait copiée sur la structure des neurones biologiques.
Les principales structures biologiques des neurones ont toutes leur équivalent artificiel. Ceci
est dans le but de reproduire leur fonctionnement de la meilleure façon possible (d’une
manière logique, simple et facilement représentable sur informatique).

Un neurone est une minuscule structure qui traite les influx nerveux qui arrivent (inputs),
chacun selon son importance relative, et qui émet un (et un seul) signal de sortie (output).

Les neurones artificiels reproduisent le même procédé, recevant chaque signal d’entrée
(input) tempéré par un poids (weight). Ces poids sont aussi appelés poids synaptiques, par
analogie.

De façon naturelle, on représente un neurone par une unité de calcul ayant :


 des entrées ( dendrites +synapses)
 une sortie ( axone)
 des connexions pondérées avec les autres neurones ( efficacité synaptique)
 un additionneur
 un seuil d'activation
 un signal de sortie
Neurone formel
• Chaque neurone reçoit un nombre de signaux xi
• Des poids réels wi sont utilisés pour décrire la force de la connexion.
• Le niveau d’activation ∑wixi détermine la force cumulative des signaux
d’entrée .
• Une fonction de transfert calcul l’état final de la sortie.

Exemple numérique

 1
 1
 
Le vecteur d’entrée : X=  1
 
 1
 1

Le vecteur des poids : W1i  1.5  3 0.7 1.3  0.6

Sommation des entrées pondérées :

 1
 1
 
S   wi xi  1.5  3 0.7 1.3  0.6   1   4.5
 
 1
 1

Comparaison avec le seuil :


4.5>3.0 transmission d’un signal d’activation au niveau de la sortie du neurone.
Fonction de transfert

Fonction de transfert

La fonction d’activation (ou fonction de seuillage, ou encore fonction de transfert)


sert à introduire une non-linéarité dans le fonctionnement du neurone.
Les fonctions de seuillage présentent généralement trois intervalles :
1. en dessous du seuil, le neurone est non-actif (sa sortie vaut 0 ou -1) ;
2. aux alentours du seuil, une phase de transition ;
3. au-dessus du seuil, le neurone est actif (souvent dans ce cas, sa sortie vaut 1).
Quelques formes courantes de fonction d'activation parmi d'autres sont présentées dans
les deux figures ci-dessus.
Réseau de neurones
• C’est un ensemble de neurones formels connectés à l’aide de liens
pondérés composant une succession de couches dont chacune prend
ses entrées sur les sorties de la précédente.

Un réseau de neurones est, comme son nom l’indique, un ensemble de neurones en réseau, de
sorte que les signaux sortant (outputs) des neurones deviennent des signaux entrant (inputs) dans
d’autres neurones. L’architecture générale des réseaux de neurones consiste en la représentation
des neurones en couches (layers) successives, la première représentant la couche d’intrants (input
layer), la dernière étant la couche de sortie (output layer), les couches intermédiaires étant les
couches cachées (hidden layers) du réseau. Les neurones de la couche d’intrants ne sont pas
vraiment des neurones traitants (computing neurons), mais ont pour seule utilité de normaliser
l’entrée des signaux ainsi que la distribution des signaux intrants.
Réseau de neurones
• Chaque réseau de neurone est caractérisé par des propriétés globales
tel que : topologie du réseau, technique d’encodage et algorithme
d’apprentissage .

Les types de réseau de neurones diffèrent par plusieurs paramètres :

 la topologie des connexions entre les neurones ;


 la fonction d’agrégation utilisée (somme pondérée, distance pseudo-euclidienne…) ;
 la fonction de seuillage utilisée (sigmoïde, échelon, fonction linéaire, fonction de Gauss…) ;
 l’algorithme d’apprentissage (rétropropagation du gradient, cascade correlation) ;
 d’autres paramètres, spécifiques à certains types de réseaux de neurones.
Topologie du réseau

Les connexions entre les neurones qui composent le réseau décrivent la topologie du modèle.

On distingue les topologies suivantes :


Topologie du réseau
 Réseau multicouche: les neurones sont
arragés par couche. Il n'y a pas de • Propagation avant (feedforward)
connexion entre neurones d'une même
couche et les connexions ne se font qu'avec
propagation
les neurones des couches avales. des activations :
Habituellement, chaque neurone d'une
de l ’entrée
couche est connecté à tous les neurones de vers la sortie
la couche suivante et celle-ci seulement.
Perceptron multicouche
(entièrement connecté)

 Réseau à connexions récurrentes : les


connexions récurrentes ramènent Topologie du réseau
l'information en arrière par rapport au
sens de propagation défini dans un • modèle récurrent (feedback network)
réseau multicouche.

 Réseau à connexion complète : c'est la


structure d'interconnexion la plus propagation des activations :
générale (fig. 7). Chaque neurone est  synchrone : toutes les unités sont mises à jour simultanément
 asynchrone : les unités sont mises à jours séquentiellement
connecté à tous les neurones du réseau
Algorithme d’apprentissage
• Grâce à des algorithmes d’apprentissage automatique, on
peut régler un réseau de neurones jusqu’à l’obtention du
comportement désiré .
• La notion d’apprentissage recouvre deux phases
importantes:
– mémorisation : le fait d’assimiler sous une forme dense des
exemples éventuellement nombreux,
– généralisation : le fait d’être capable, grâce aux exemples
appris, de traiter des exemples distincts, encore non rencontrés,
mais similaires.

L'apprentissage est une phase du développement d'un réseau de neurones durant laquelle le
comportement du réseau est modifié jusqu'à l'obtention du comportement désiré.

Algorithme d’apprentissage
On distingue deux grandes classes d’algorithmes
d’apprentissage :
– L’apprentissage supervisé
– L’apprentissage non supervisé

superviseur sortie désirée

erreur

réseau sortie obtenue

L'apprentissage "supervisé", consiste à calculer les coefficients de telle manière que les sorties
du réseau de neurones soient, pour les exemples utilisés lors de l'apprentissage, aussi proches
que possibles des sorties "désirées",

A l'issu de l'apprentissage, les poids sont fixés : c'est alors la phase d'utilisation.
Algorithme d’apprentissage
On distingue deux grandes classes d’algorithmes
d’apprentissage :
– L’apprentissage supervisé
– L’apprentissage non supervisé

réseau sortie obtenue

Il existe également des réseaux de neurones qui s’entraînent sans besoin de supervision, c’est-à-
dire, sans que l’on ait besoin de signifier au réseau comment il doit (devrait) se comporter. Ces
réseaux, habituellement, sont toujours en train de s’entraîner.

Il en existe plusieurs types, mais voici deux exemples plus marquants :

Réseaux de kohonen (carte de kohonen)


Ce type de réseau de neurones consiste en une
situation où plusieurs neurones entrent en
compétition pour être activé. Seul le neurone
gagnant et son voisinage profiteront de
l’apprentissage. On calcule le neurone gagnant en
choisissant celui dont le vecteur de poids est le plus
près du vecteur d’intrants selon une distance
Couche
euclidienne. d’intrants Couche de Kohonen

Réseaux e mémoire Réseau de Kohonen avec deux intrants


Ces réseaux de neurones ont la capacité de
retrouver des modèles « enregistrés » dans leurs x1 y1
poids synaptiques. Lles poids des réseaux de
mémoires ne sont pas entraînés, mais choisis. Les x2 y2
associations intrant-extrant sont « enregistrées »
dans les poids synaptiques du réseau. Cependant, x3 y3
sur la présentation d’un intrant (input) non-
reconnu, ces réseaux ont la capacité, de produire x4 y4
une réponse correcte. Certains réseaux (BAM,
réseaux de Hopfield) « corrigent » les erreurs
d’intrant et donne une réponse programmée,
Réseau de Hopfield de 4 neurones
comme si l’intrant donné faisait partie d’une
association prévue du réseau.
Règles d’apprentissage
• Loi de Hebb :
Si deux unités connectées sont actives simultanément, le poids de leur
connexion est augmenté ou diminué.
Cette première règle proposée par Hebb reposait sur des considérations
biologiques et imposait :

Wij = µ OUTi OUTj j i


– µ est le taux d'apprentissage w ij
– OUTi et OUTj son les outputs des neurones entre lesquels on
calcule la variation de pondération
L'idée est de renforcer les connexions entre deux neurones fortement
activés simultanément.

La loi de Hebb (1949) s'applique aux connexions entre neurones, comme le représente la figure ci-
dessus.
La loi de Hebb peut être modélisée par les équations suivantes :

 wij(t+1) = wij(t) +wij(t) (w(t+1) est le nouveau poids, wij(t) est l'ancien)
 wij(t) = µ sortiei . sortiej (la coactivité est modélisée comme le produit des deux
valeurs d'activation)

L'algorithme d'apprentisage modifie de façon itérative (petit à petit) les poids pour
adapter la réponse obtenue à la réponse désirée. Il s'agit en fait de modifier les poids
lorsqu'il y a erreur seulement.

1. Initialisation des poids et du seuil S à des valeurs (petites) choisies au hasard.


2. Présentation d'une entrée X = (x1, ... xn) de la base d'apprentissage.
3. Calcul de la sortie obtenue « a » pour cette entrée :
- s = ∑ (wi . xi) - ɵ (la valeur de seuil est introduite ici dans le calcul de la
somme pondérée)
- a = signe (s) ( si s > 0 alors a = +1 sinon s ≤ 0 alors a = -1 )
4. Si la sortie « a » est différente de la sortie désirée « d » pour cet exemple d'entrée
X alors modification des poids (µ est une constante positive, qui spécifie le pas de
modification des poids) :
- wij(t+1) = wij(t) + µ.(ai . aj)
5. Tant que tous les exemples de la base d'apprentissage ne sont pas traités
correctement (i.e. modification des poids), retour à l'étape 2.
Règles d’apprentissage
• Loi de Widrow-Hoff (delta rule) :
Pour un réseaux de neurones artificiels on préfère la règle d'apprentissage
de Widrow-Hoff :

Wij = µ . OUTj (Di-OUTi)


j i
- OUTi : activation produite par le réseau w ij
- Di : réponse désirée

Dans le cas du perceptron simple couche il vient simplement :


Wij = µ . Xj (Di-OUTi)

la règle de Widrow-Hoff ne modifie pas les poids pour les cas suivants:
– si la sortie est correcte (Dj=OUTj)
– pour les composants nuls de l'entrée (Xi=0)

La règle de Hebb ne s'applique pas dans certain cas. Un autre algorithme d'apprentissage a donc été
proposé, qui tient compte de l'erreur observée en sortie.
Si la sortie « a » du Perceptron est différente de la sortie désirée « d » pour cet exemple d'entrée alors
modification des poids: wi(t+1) = wi(t) + µ.((d - ai).xi)
Algorithme d’apprentissage
retropropagation de l’erreur
1 Calcul activations S j   w ji ai 2 Calcul activations
S k   wkj a j
i j

a j  f S j 
unités cachées unités de sortie
a k  f S k 

Calcul Erreur 3
Unités Unités Unités entre
d’entrée xi cachées aj de sortie yk sorties désirées
et d k Sortie désirée
sorties obtenues

ai  xi ak  y k 
x1
aj
ek
ak  ek  d k  ak
x2 Sortie obtenue

Calcul de l'erreur 4
xn0 sur les unités de sortie

 k  ek . f S k 
i=1..n0 j=1..n1 k=1..n2

Calcul de l'erreur 5
w ji   j ai wkj   k a j sur les unités cachées

6 Ajustement des poids


 j   W jk  k . f S j 
 
Apprentissage Apprentissage
des unités cachées des unités de sortie k

Principe d’apprentissage :
- Initialisation des poids à des valeurs aléatoires
- Présentation d’un exemple
- Propagation des signaux dans le réseau
- Calcul des erreurs et propagation en sens rétrograde
- Modification des poids de connexions
Perceptron simple
Modèle:
Vecteur d’entrée :

Matrice des poids:

Calcul de la somme:

Calcul de la sortie :

Le perceptron est l’un des réseaux de neurones les plus utilisés pour des problèmes
d’approximation, de classification et de prédiction.

Composition :
 p1, p2 , …, pR entrées du neurone.
 Un système de trois poids liées à ces entrées.
 Un biais b, assimilable à une troisième entré, mais variable.
 Une fonction de transfert (ici nous utiliserons la fonction seuil)
 Une seule sortie a=f(n)
Perceptron simple
Modèle avec fonction seuil:

• p1, p2 , …, pR : Entrées du neurone


• w1,1, w1,2 ,..., w1,R : poids
• b : biais
• Fonction de transfert seuil : - Si n<0 alors f(n)=0
- Si n≥0 alors f(n)=1

Exemple de code MATLAB :


Définition des paramètres du neurone:
close all, clear all, clc, format compact
% Neuron weights
w = [4 -2]
% Neuron bias
b = -3
% Activation function
% func = 'tansig'
% func = 'purelin'
func = 'hardlim'
% func = 'logsig'

Définition du vecteur d’entrée


p = [2 3]
calcul de la sortie du neurone :
activation_potential = p*w'+b
neuron_output = feval(func, activation_potential)

Tracé graphique de la sortie du


neurone en fonction des entrées :
[p1,p2] = meshgrid(-10:.25:10);
z = feval(func, [p1(:) p2(:)]*w'+b );
z = reshape(z,length(p1),length(p2));
plot3(p1,p2,z)
grid on
xlabel('Input 1')
ylabel('Input 2')
zlabel('Neuron output')
Perceptron parallèle
Modèle:
Vecteur d’entrée : Matrice des poids:

Vecteur de sortie:

Le perceptron parallèle est un perceptron avec une seule couche de S neurones


totalement connectés sur un vecteur P de R entrées. La matrice W de dimension S ×R
représente l’ensemble des poids de la couche, (les vecteur-rangées wi (dimension R × 1)
représentent les R poids des connexions reliant le neurone i avec ses entrées. Le vecteur
b (dimensions S× 1) désigne l’ensemble des S biais de la couche. Les niveaux
d’activation n = Wp + b = [n1 n2 · · · nS]T des neurones de la couche servent d’argument a
la fonction d’activation qui applique une fonction seuil pour produire le vecteur des
sorties a = [a1 a2 · · · aS]T , ou :

+1 si ni ≥1
ai =
0 si autrement

Malgré sa relative simplicité, la règle du perceptron s’avère très puissante. Elle converge
toujours vers une solution en un nombre fini d’itérations, mais il importe cependant de
connaître les hypothèses sous-jacentes à cette preuve : `
1. Le problème doit être linéairement séparable ; ´
2. Les poids ne sont mis a jour que lorsqu’un stimulus d’entrée est classé
incorrectement ; ´
3. Il existe une borne supérieure sur la norme des vecteurs de poids. ´
Classification des données linéairement séparables à l’aide d’un
TP1
perceptron :

DESCRIPTION DU PROBLÈME:
Deux groupes de données, appartenant à deux classes, sont définies dans un espace
d'entrée en 2 dimensions. Les classes sont linéairement séparables. La tâche consiste à
construire un Perceptron pour la classification de ces données.

Voici les commandes MATLAB pour créer ces deux classes et les tracer
graphiquement :
N = 20; % nombre d’exemples pour chaque classe
offset = 5; % décalage de la deuxième classe
x = [randn(2,N) randn(2,N)+offset]; % entrées (les deux classes)
y = [zeros(1,N) ones(1,N)]; % sorties (des 0 pour C1 et des 1 pour C2)
% tracé graphique des deux classes :
figure(1)
plotpv(x,y);

Travail demandé :
 Créer un perceptron simple permettant de classifier les données.
 Faire un apprentissage pour calibrer les poids
 Afficher une vue du neurone et les valeurs des poids calibrés
 Tracer la droite de séparation des deux classes vérifiant l’équation :

 Prévoir la position d’un nouveau point appartenant à l’espace de C1.


TP2 Classification de 4 classes à l’aide d’un perceptron

DESCRIPTION DU PROBLÈME:
On souhaite maintenant classer un groupe de données séparables en 4 catégories.

Définition des données :


- Nombre d’exemples dans chaque classe :
K = 30;
- Définition des classes :
q = 0.6; % (Décalage entre classes)
A = [rand(1,K)-q; rand(1,K)+q];
B = [rand(1,K)+q; rand(1,K)+q];
C = [rand(1,K)+q; rand(1,K)-q];
D = [rand(1,K)-q; rand(1,K)-q];
- Définition sorties codées pour les classes
a = [0 1]';
b = [1 1]';
c = [1 0]';
d = [0 0]';

Travail demandé :
Créer un réseau Perceptron avec 2 entrées et 2 sorties pour classer les vecteurs
d'entrée en 4 catégories :
- Préparer les données d’entrée (vecteur P) et de sortie (vecteur T) du perceptron
- Faire un apprentissage du perceptron
- Tracer les lignes de classification
- Essayer le perceptron pour plusieurs entrées (par exemple : p = [0.7; 1.2])
TP3 Fonctions logiques à l’aide d’un perceptron

On donne les tables de vérité des fonctions logique AND et OR


Entrées Sortie pour AND Sortie pour OR
P1 P2 TAND TOR
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 1

Travail demandé :
1. Fonction AND :
 Créer un perceptron simple
 Initialiser les poids à la valeur 1.
 Faire un apprentissage pour la fonction logique AND
 Afficher les nouveaux poids
 Tester le perceptron pour un jeu d’entrées booléennes.

2. Fonction OR :
Refaire les mêmes étapes précédentes pour la fonction logique OR.

3. Fonction XOR :
On donne maintenant la table de vérité de la fonction logique XOR :

Entrées Sortie pour XOR


P1 P2 TXOR
0 0 0
0 1 1
1 0 1
1 1 0
 Créer un perceptron permettant de reproduire les résultats de la fonction logique
XOR.
 Tester ce perceptron pour des couples de variables binaires
 Discuter les résultats.
 Donner une solution permettant de surmonter cette limitation du perceptron
simple.
TP4 Prédiction des séries temporelles à l’aide d’un perceptron
multicouches

1. Modèle de régression basé sur un MLP :


L'étude repose sur un ensemble de données servant pour une entreprise à prédire les
ventes futures d'un produit (Y) en fonction des dépenses publicitaires (X1), des
dépenses promotionnelles (X2) et des ventes trimestrielles de son principal
concurrent (X3). Pour cela, nous disposons de 22 observations pour chacune des
variables d’entrées et une série de sortie représentant les ventes.

N° X1 X2 X3 Y
1 4949 7409 43500 16793
2 5369 7903 20209 22455
3 6149 9289 47640 25900
4 6655 9914 34563 25591
5 8114 8193 36581 34396
6 8447 8711 52206 38676
7 10472 9453 76788 34608
8 10508 9194 42107 35271
9 11534 10149 78902 39132
10 12719 10403 73284 46594
11 13743 10806 61871 57023
12 16168 11557 85265 59720
13 16035 11092 28585 62805
14 16112 10979 26921 61905
15 18861 12117 94457 65963
16 19270 11319 17489 72869
17 21536 12702 99820 71963
18 20783 12419 40152 74915
19 21917 13265 65490 81030
20 20878 13173 37639 86686
21 21508 13211 19425 97088
22 22261 14070 45300 108739

Travail demandé :
Préparer les données d’entrée et de sorite du MLP
Créer le MLP pour prévoir la demande future par choix de la meilleure architecture
permettant de minimiser l’erreur de prévision :
- Choix du nombre de neurones dans la couche cachée
- Choix des fonctions de transfert
- Evaluer la performance du réseau
Correction des TP
Neurone simple
close all, clear all, clc, format compact
% Neuron weights
w = [4 -2]
% Neuron bias
b = -3
% Activation function
% func = 'tansig'
% func = 'purelin'
% func = 'hardlim'
func = 'logsig'

[p1,p2] = meshgrid(-10:.25:10);
z = feval(func, [p1(:) p2(:)]*w'+b );
z = reshape(z,length(p1),length(p2));
plot3(p1,p2,z)
grid on
xlabel('Input 1')
ylabel('Input 2')
zlabel('Neuron output')

Classification 2 classes
%Define input and output data
close all, clear all, clc, format compact
% number of samples of each class
N = 20;
% define inputs and outputs
offset = 5; % offset for second class
x = [randn(2,N) randn(2,N)+offset]; % inputs
y = [zeros(1,N) ones(1,N)]; % outputs
% Plot input samples with PLOTPV (Plot perceptron input/target vectors)
figure(1)
plotpv(x,y);

% Create and train perceptron


net = perceptron;
net = train(net,x,y);
view(net);
%Plot decision boundary
figure(1)
plotpc(net.IW{1},net.b{1});

Classification 4 classes
close all, clear all, clc, format compact
% number of samples of each class
K = 30;
% define classes
q = .6; % offset of classes
A = [rand(1,K)-q; rand(1,K)+q];
B = [rand(1,K)+q; rand(1,K)+q];
C = [rand(1,K)+q; rand(1,K)-q];
D = [rand(1,K)-q; rand(1,K)-q];
% plot classes
plot(A(1,:),A(2,:),'bs')
hold on
grid on
plot(B(1,:),B(2,:),'r+')
plot(C(1,:),C(2,:),'go')
plot(D(1,:),D(2,:),'m*')
% text labels for classes
text(.5-q,.5+2*q,'Class A')
text(.5+q,.5+2*q,'Class B')
text(.5+q,.5-2*q,'Class C')
text(.5-q,.5-2*q,'Class D')
% define output coding for classes
a = [0 1]';
b = [1 1]';
c = [1 0]';
d = [0 0]';
% % Why this coding doesn't work?
% a = [0 0]';
% b = [1 1]';
% d = [0 1]';
% define inputs (combine samples from all four classes)
P = [A B C D];
% define targets
T = [repmat(a,1,length(A)) repmat(b,1,length(B)) ...
repmat(c,1,length(C)) repmat(d,1,length(D)) ];
plotpv(P,T);

net = perceptron;

E = 1;
net.adaptParam.passes = 1;
linehandle = plotpc(net.IW{1},net.b{1});
n = 0;
while (sse(E) & n<1000)
n = n+1;
[net,Y,E] = adapt(net,P,T);
linehandle = plotpc(net.IW{1},net.b{1},linehandle);
drawnow;
end
% show perceptron structure
view(net);
% For example, classify an input vector of [0.7; 1.2]
p = [0.7; 1.2]
y = net(p)
% compare response with output coding (a,b,c,d)

Le OU logique

x = [0 0 1 1; 0 1 0 1];
t = [0 1 1 1];
net = perceptron;
net = train(net,x,t);
view(net)
y = net(x);
Prévisions et RNA

Modèle causal
close all, clear all, clc, format compact
% Random Seed for Reproducing NFTool results
rand('seed',1.555616964E9)

% load Inputs and Targets data


load inputdata2.txt;
load outputdata.txt;
s=inputdata2';
t=outputdata';

time=1:22;
plot(time,inputdata2(:,1),'b-s')
% legend({'X1'})
hold on
grid on
plot(time,inputdata2(:,2),'r-+','LineWidth',1)
% legend({'X2'})
plot(time,inputdata2(:,3),'g-o','LineWidth',1)
% legend({'X3'})
plot(time,outputdata(:,1),'r-','LineWidth',2)

% Create Network
% net3 = feedforwardnet(7)
net3=newff(s,t,3,{'tansig','purelin'},'traingd');
% net3=newff(s,t,3,{'tansig','purelin'},'traingda');
% net3=newff(s,t,3,{'tansig','purelin'},'trainlm');

net3.performFcn = 'sse';
[net3,tr3] = train(net3,s,t);

view(net3);

poids=net3.IW{1}
biais=net3.b{1}

% Simulate Network
a3= sim(net3,s);
Yhat3=a3';
plot(time,Yhat3(:,1),'b--','LineWidth',2)
legend({'X1','X2','X3','Y','Sortie RNA'})
Modèle de série temporelle
close all, clear all, clc, format compact
% Random Seed for Reproducing NFTool results
rand('seed',1.555616964E9)

% load Inputs and Targets data


load outputdata.txt;
data=outputdata';
inputUnits=5;
hiddenUnits=5;
L=size(data,2);
in=zeros(inputUnits,L-inputUnits);
global d;
d=zeros(1,L-inputUnits);
for i=1:L-inputUnits
in(:,i)=data(1,i:i+inputUnits-1);
d(i)=data(1,i+inputUnits);
end
ret=newfit(in,d,hiddenUnits,{'tansig','purelin'},'trainlm');
ret.trainParam.epochs=200;
ret.trainParam.lr=0.2;
ret.trainParam.goal=0.0001;

ret.performFcn = 'mae';
[ret,tr] = train(ret,in,d);
% graphical plot
global x;
x=inputUnits+1:L;
global y;
y=sim(ret,in);
[m,b,r] = postreg(y,d);
%inTest=zeros(inputUnits,1);
%inTest=data(1,L-inputUnits+1:L)';
%rezTest=sim(ret,inTest);
%disp('Predicted value:'); disp(rezTest);
time = 1:22;
figure
%plot(time,data,'g:',x,d,'b*',x,y,'y-');
plot(x,d,'g-',x,y,'b-');
legend({'Observed response','Fitted response with Neural Network'},'Location','NW')
xlabel('Observations','fontsize',12,'fontweight','b');
ylabel('Response','fontsize',12,'fontweight','b');
grid on
Série temporelle saisonnière
% Random Seed for Reproducing NFTool results
rand('seed',1.555616964E9)

y = [112 115 145 171 196 204 242 284 315 340 360 417 % Jan
118 126 150 180 196 188 233 277 301 318 342 391 % Feb
132 141 178 193 236 235 267 317 356 362 406 419 % Mar
129 135 163 181 235 227 269 313 348 348 396 461 % Apr
121 125 172 183 229 234 270 318 355 363 420 472 % May
135 149 178 218 243 264 315 374 422 435 472 535 % Jun
148 170 199 230 264 302 364 413 465 491 548 622 % Jul
148 170 199 242 272 293 347 405 467 505 559 606 % Aug
136 158 184 209 237 259 312 355 404 404 463 508 % Sep
119 133 162 191 211 229 274 306 347 359 407 461 % Oct
104 114 146 172 180 203 237 271 305 310 362 390 % Nov
118 140 166 194 201 229 278 306 336 337 405 432 ]; % Dec
% load Inputs and Targets data
% load outputdata.txt;
% data=outputdata';
data=y(:);
inputUnits=12;
hiddenUnits=12;
HN=1;
L=size(data,1);
in=zeros(inputUnits,L-inputUnits);
global d;
d=zeros(1,L-inputUnits);
for i=1:L-inputUnits
in(:,i)=data(i:i+inputUnits-1);
d(i)=data(i+inputUnits);
end
% ret=newff(in,d,[hiddenUnits HN],{'tansig','tansig','purelin'},'trainlm');
% net.performFcn = 'mse';
% ret=newfit(in,d,hiddenUnits,{'tansig','purelin'},'trainlm');
% ret=newfit(in,d,hiddenUnits,{'tansig','purelin'},'traingd');
% ret=newfit(in,d,hiddenUnits,{'tansig','purelin'},'traingda');
% --------------------------------------
ret=newfit(in,d,hiddenUnits,{'stansig','purelin'},'trainlm');
% --------------------------------------
% ret=newfit(in,d,hiddenUnits,{'logsig','purelin'},'trainlm');
% ret=newfit(in,d,hiddenUnits,{'logsig','stansig'},'trainlm');

ret.trainParam.epochs=200;
ret.trainParam.lr=0.2;
ret.trainParam.goal=0.0001;

ret.performFcn = 'sse';
[ret,tr] = train(ret,in,d);
% graphical plot
global x;
x=inputUnits+1:L;
global yhat;
yhat=sim(ret,in);
[m,b,r] = postreg(yhat,d);
%inTest=zeros(inputUnits,1);
%inTest=data(1,L-inputUnits+1:L)';
%rezTest=sim(ret,inTest);
%disp('Predicted value:'); disp(rezTest);
time = 1:22;
figure
%plot(time,data,'g:',x,d,'b*',x,y,'y-');
err=x-yhat;
msepf=mse(err);
ssepf=sse(err);
maepf=mae(err);
plot(x,d,'r-',x,yhat,'b-');
legend({'Observed response','Fitted response with Neural Network'},'Location','NW')
xlabel('Observations','fontsize',12,'fontweight','b');
ylabel('Response','fontsize',12,'fontweight','b');
grid on
L'histoire des algorithmes génétiques remonte à l'année 1960 par John Holland. John Holland étudie les
systèmes évolutifs mais le premier modèle formel des algorithmes

génétiques (the Canonical Genetic Algorithm CGA) a été introduit dans son livre "Adaptation in Natural and
Artificial Systems" publié en 1975.
Les algorithmes génétiques font partie de la famille des algorithmes évolutionnaires. Ils s'inspirent de la nature :
l'individu le mieux adapté à son environnement est celui qui aura le plus de chance à survivre. Ces algorithmes
sont issus de l'évolution naturelle des espèces. A ces notions d'évolution, on ajoute des propriétés
observées en génétique (croisement, mutation, sélection, etc.) D’où le nom d'algorithmes génétiques. Ils
ont suscité l'intérêt de nombreux chercheurs commençant par Holland (J. H. Holland, 1975) , qui a
développé les principes fondamentaux, passant par Goldberg (David Edward Goldberg, 1989) qui les a
utilisé pour résoudre des problèmes d'optimisation. D’autres chercheurs ont poursuivi ces travaux et ont
développé au fur et à mesure l’ensemble des opérateurs et des mécanismes des AGs.

L'histoire des algorithmes génétiques remonte à


l'année 1960 par John Holland. John Holland étudie
les systèmes évolutifs mais le premier modèle formel
des algorithmes génétiques (the Canonical Genetic
Algorithm CGA) a été introduit dans son livre
"Adaptation in Natural and Artificial Systems" publié
en 1975. En 1966,
Fogel publie son
livre
"Programmation
évolutionnaire" (F.
G. Fogel, 1962; L. J. Fogel, Owens, &
Walsh, 1966) , suivi en 1973 par la
publication de "Stratégie
d'évolution" de Rechenberg dans
(Rechenberg, 1973). Pendant l'année
1987 dans (David E Goldberg & Richardson, 1987) et 1989 par l'ouvrage de David Goldberg (David Edward
Goldberg, 1989) qui a largement contribué à les vulgariser. À partir des années 90, les applications des
algorithmes génétiques sur différents problèmes d'optimisation sont développées. Et depuis on n’arrête
pas de développer les AGs et leurs applications.

Les algorithmes génétiques sont des approches de


recherche globale consistent à faire évoluer une
population d’individus (solutions aléatoires) par des
phénomènes de reproduction et de mutation. A
chaque génération, une nouvelle série de solutions
approchées est créé par le processus de sélection
des individus en fonction de leur Fitness (objectif)
ainsi que l'utilisation des opérateurs génétiques
inspirés par la génétique naturelle. Cette approche
garantie l'évolution vers de meilleures populations Eiben (Eiben et al., 1999). Mais l’analogie avec la
génétique s’arrête là. Un algorithme génétique pur n’utilise généralement que très peu d’informations
spécifiques au domaine du problème traité c’est l’un de ses avantages. Le principe de base est de partir
d’une population de solutions, représentées sous
forme de chromosomes. Ensuite, à chaque
itération, des croisements de deux individus-
parents issus de la population sont effectués,
en favorisant la sélection des plus prometteurs
(fitness). Le croisement (crossover) de deux
individus combine des caractéristiques de ces
derniers pour générer un nouvel individu appelé
enfant. Des mutations peuvent intervenir lors
de la création d’une progéniture, ceci permet une
diversification évitant une convergence
prématurée.

Le principe de base est de partir d’une population de solutions, représentées sous forme de chromosomes.

Ensuite, à chaque itération, des croisements de deux individus-parents issus de la population sont
effectués, en favorisant la sélection des plus prometteurs (fitness).

Le croisement (crossover) de deux individus combine des caractéristiques de ces derniers pour générer un
nouvel individu appelé enfant. Des mutations peuvent intervenir lors de la création d’une progéniture, ceci
permet une diversification évitant une convergence prématurée.

Ensuite, deux modes de gestion de la population peuvent être utilises. Soit chaque itération crée un
nombre d’enfants égal à la taille de la population initiale, et cette dernière est remplacée par la
population-enfant lors de l’itération suivante (gestion générationnelle).

Soit chaque itération ne combine que deux parents, leurs enfants étant alors directement intégrés en
remplaçant d’autres individus dans la population courante (gestion incrémentale).

La boucle est bouclée, et l’on recommence une phase de sélection pour la reproduction, une phase de
mutation, et ainsi de suite. Comme pour les métaheuristiques vues précédemment, un critère d’arrêt permet de
sortir de la boucle, par exemple un certain nombre d’itérations sans amélioration notable de la
performance des individus.

Les opérateurs génétiques fonctionnent au niveau génotypique tandis que le mécanisme de sélection
opère au niveau phénotypique.

En d’autre terme le génotype est la codification d’une solution réalisable potentielle à un problème
d'optimisation pour une fonction objectif f. et le phénotype est la valeur de cette solution.

Cours : Génotype VS Phénotype : codification et représentation


Dans les processus naturels, les êtres vivants se
croisent et interagissent les uns avec les autres.
Chaque individu est caractérisé par un
génotype indépendant de

l’environnement où il vit. Le génotype est le codage


de ces caractéristiques en gènes. Les opérateurs
génétiques fonctionnent au niveau génotypique
tandis que le mécanisme de sélection opère au
niveau phénotypique. Le phénotype d’un individu est l’ensemble des traits caractéristiques de celui-ci. En
d’autre terme le génotype est la codification d’une solution réalisable et le phénotype est la valeur de cette
solution potentielle à un problème d'optimisation pour une fonction objectif f.

Le Codage est une étape qui associe à chacun des points de l'espace de recherche (les solutions) une
structure de données. Cette structure généralement a une forte influence sur le succès des algorithmes.
Chaque individu de la population est codé en des gènes (chromosome). Plusieurs types des codages sont
utilisés dans la littérature, mais le meilleur et le plus étudié historiquement est le codage binaire. La
supériorité de ce type de codage est prouvée par Holland (J. H. Holland, 1975) en 1975. Son principe est
donc simplement de coder la solution selon une chaîne de bits qui peuvent prendre les valeurs 0 ou 1.

Un gène ici est un bit d'une solution potentielle à un problème d'optimisation. Un des avantages du
codage binaire est que l’on peut facilement coder toutes sortes d’objets : des réels, des entiers, des valeurs
booléennes, des chaînes de caractères, etc.

Cela nécessite simplement l’usage de fonctions de codage et décodage pour passer d’une représentation à
l’autre. Un autre avantage est que ce type de codage permet de créer des opérateurs de croisement et de
mutation simples (par inversion de bits par exemple).

Ainsi un des facteurs les plus importants


dans les AG est le choix d'un codage
convenable pour représenter les solutions, en
d'autre terme pour construire les structures
de données qui coderont les gènes des
chromosomes.

L'efficacité de l'algorithme génétique va donc


dépendre du choix du codage d'un
chromosome.

Son principe est donc simplement de coder la solution selon une chaîne de bits qui peuvent prendre les
valeurs 0 ou 1.
Un gène ici est un bit d'une solution potentielle à un problème d'optimisation. Un des avantages du
codage binaire est que l’on peut facilement coder toutes sortes d’objets : des réels, des entiers, des valeurs
booléennes, des chaînes de caractères, etc.

Cela nécessite simplement l’usage de fonctions de codage et décodage pour passer d’une représentation à
l’autre. Un autre avantage est que ce type de codage permet de créer des opérateurs de croisement et de
mutation simples (par inversion de bits par exemple).

Un principe couramment utilisés pour l'encodage est connu comme le principe du «minimum alphabet »
(J. H. Holland, 1975). Le principe consiste à ce que le plus

petit jeu d’alphabet de gènes qui permet une expression naturelle du problème doit être choisi. Il a été
observé que l'alphabet binaire offre le nombre maximal des schémas par bit de l'information de n'importe
quel codage. Par conséquent l'encodage binaire est l’une des stratégies courantes, bien qu’il existe d'autres
types de techniques de codage comme le codage en valeur entière et le codage en nombre réel qui sont aussi
largement utilisés.
L’utilisation de la notion de population favorise
l’exploration de l’espace de recherche et la
convergence vers les solutions optimales. C'est une
des grandes forces des MOEAs. Toutefois, on
retrouve dans la littérature certaines
stratégies évolutionnaires utilisant un seul individu
(Knowles & Corne, 2000). Un mécanisme de génération de la population initiale est nécessaire pour
faire démarrer l’algorithme. Ce mécanisme doit
être capable de produire une population d'individus
diversifiée qui servira de base pour les générations
futures. Le choix de la population initiale
conditionne fortement la rapidité et l'efficacité de

l'algorithme.

Idéalement, les populations initiales devraient avoir un patrimoine génétique aussi grand que possible afin
d'être en mesure d'explorer l'ensemble de l'espace de

recherche. Tous les allèles différents possibles de chacun devraient être présents dans la population. Pour ce
faire, la population initiale est, dans la plupart des cas, choisis au hasard. Néanmoins, il arrive parfois qu'on ait
recours à une méthode heuristique qui peut être utilisé pour générer une population initiale plus adaptée.

Ainsi, la moyenne de la fonction objectif est déjà élevé au départ et peut donc aider l'algorithme
génétique pour trouver de bonnes solutions plus rapidement au risque de manque de diversité, où l’algorithme
va seulement visiter une petite partie de l'espace de recherche et ne jamais trouver les solutions optimums
globales. Nous pouvons retrouver dans la thèse de (Bourazza, 2006) un chapitre qui illustre un ensemble
simple d’algorithme de génération de populations initiales basé globalement sur des processus aléatoires,
heuristiques et guidés, puis une comparaison de leur influence sur la fonction objectif appliqué à quelque
instances du problème TSP.
La taille de la population dépendra de la complexité du problème. La définition de cette taille de la population
soulève aussi des beaucoup de question. En effet, Plus la population est grande, plus il est facile d'explorer
l'espace de recherche. Cependant, le temps requis par un AG pour converger est O (nlogn) évaluations de
fonction où n est la taille de la population. Nous parlons de convergence de l’AG lorsque tous les
individus se ressemblent assez et donc d'autres améliorations ne peuvent être effectuées que par
mutation. Goldberg a aussi montré que l'efficacité à atteindre un optimum global et éviter les locaux est
largement déterminée par la taille de la population.

A chaque individu, on associe une valeur d’adaptation


(on appelle aussi cette valeur l'efficacité ou fitness).
Cette valeur d’adaptation va correspondre à la
performance d'un individu dans la résolution d'un
problème donné. La fitness représente la qualité d'un
chromosome et elle dépend fortement du problème
traité. Cette fitness n’est rien d’autre que la valeur de
la fonction objectif pour la plupart des cas. La fitness est choisie de telle sorte à ce que plus le chromosome
s’approche de la solution globale optimale plus sa valeur fitness est grande, c’est la seule information que l’AG
aborde en cherchant des solutions possibles. Par exemple, si l'on considère un problème de maximisation
d'une fonction objectif, la valeur d’adaptation de l'individu croîtra avec sa capacité à maximiser cette
fonction.

Le mécanisme de sélection est l'un des principaux composants de recherche dans les algorithmes
évolutionnaires. Le principe global de sélection des parents est que leur probabilité d’être choisi croit avec
leur fitness. Une telle pression de sélection va conduire la population vers de meilleures solutions. Toutefois,
le pire des individus ne devrait pas être rejeté et ils ont une chance d'être sélectionné. Cela peut conduire à du
matériel génétique utile.
ainsi, d’autres variantes de sélection proportionnelle visent à réduire

la prédominance d'un seul ou un groupe d’individus à très grande fitness ("super individus") par des techniques
d'échantillonnage stochastique (Dumitrescu, Lazzerini, Jain, & Dumitrescu, 2000) .

La sélection roulette favorise une convergence prématurée causée par les super individus à haute valeur
fitness induite par une perte de diversité. En outre, lorsque tous les individus sont tout aussi bon ou
presque, cette stratégie de sélection n'introduit pas une pression suffisante pour sélectionner les meilleurs
candidats.

Pour réduire la partialité de la roulette à l’égard des supers


individus, la stratégie de sélection par échantillonnage
stochastique universel peut être utilisée. Une roulette
extérieure est placée autour de la roulette initiale avec µ
pointeurs espacés de manière égale.

Dans la stratégie SUS, une rotation simple de la roue de


roulette va sélectionner simultanément tous les
individus pour la reproduction.

La Sélection par tournoi consiste à choisir de


manière aléatoire k individus ;

le paramètre k est appelée la taille du groupe tournoi.

Un tournoi est ensuite appliqué aux k membres du groupe


pour sélectionner le meilleur. Pour sélectionner µ
individus, la procédure de tournoi est alors effectuée µ fois.
Généralement deux chromosomes, parents, sont
combinés ensemble pour former de nouveaux
chromosomes, progéniture. Les parents sont choisis
parmi chromosomes existants dans la population
avec une préférence vers les meilleurs afin que la
progéniture tende à hériter de bons gènes des parents. En appliquant itérativement l'opérateur de
croisement, les gènes de bonne qualité sont de plus en plus hérités et apparaissent plus fréquemment dans
la population, pour aboutir finalement à la convergence à une bonne solution globale.

L'idée derrière crossover est que les nouveaux


chromosomes peuvent être mieux que les parents
s'ils prennent le meilleur des caractéristiques de
chacun des parents. Contrairement aux opérateurs

unaire comme la mutation, le crossover est un


opérateur binaire et parfois n-aire. Comme la
mutation, la conception du crossover est liée à la
représentation et le codage des chromosomes.

Lors du design de cet opérateur on doit prendre en


compte deux aspects :

• L'héritabilité : La principale caractéristique de crossover est l'héritabilité. L'opérateur devait hériter du


matériel génétique des deux parents.

• Le respect : Un crossover est dit opérateur respectueux si les traits communs dans les deux parents sont
préservées, et dit « assorting » si la distance entre les parents

(p1,p2) et la progéniture o est inférieure ou égale à la distance entre les parents

• La validité: le crossover doit produire des solutions valides au problème considéré. Et ce n’est pas une tâche
facile pour les problèmes d’optimisation avec des contraintes
ou ayant une représentation compliques on

le single-point crossover sélectionne de façon aléatoire un point coupe à l'intérieur d'un chromosome
puis échange les deux parties des chromosomes parents en ce point pour produire deux nouveaux
descendants.

Une autre variante de ce

crossover est le two-point.

un masque binaire ayant la même longueur


que celle des parents est généré puis les allèles
des parents où les positions correspondantes
dans le masque binaire sont égales à '1' sont
inter-changés.
Une variante bien connue des
opérateurs de recombinaison est le
partially-mapped cossover (PMX). Il a été
prouvé que le PMX peut être très efficace
pour les problèmes de permutation et spécialement le problème du voyage du commerce. Dans cette
méthode, deux points de croisement sont sélectionnés au hasard. Les enfants héritent complètement les
segments à l’intérieur des points de coupe tandis que les extrémités des enfants sont remplies par
correspondance des sommets dans les parents comme illustré sur la Figure , La complexité de ce crossover est
O(n).

Cette méthode est parmi les plus


utilisées dans la littérature pour
résoudre différents problèmes de
planification et d’ordonnancement en
utilisant les AG. Elle tend à préserver
les arêtes héritées des parents. Dans cette
méthode, on choisit une ville initiale de
l'un des deux parents (elle peut être choisi
au hasard ou selon des critères définis)
puis on supprime toutes les occurrences de cette ville des listes de voisinages des autres villes. Si cette
ville choisie a encore des voisins (non visités) on choisit la ville qui a le moins de voisinage possible (pour les cas
exceptionnels on procède à l’aléatoire) puis on refait la même chose pour la ville choisie jusqu’à
remplissage de l’enfant.

Les opérateurs de mutation sont des opérateurs unaires qui


agissent sur un seul individu de la population en cours, et qui
ont pour principale action, la modification du génotype d'un
individu et ainsi permettre une meilleure exploration de l'espace
de solutions. La qualité et la rapidité de convergence des
MOEAs sont fortement dépendantes de l’opérateur de
mutation. En utilisant ce seul opérateur, un algorithme peut très bien converger similairement à une recherche
aléatoire.
La mutation est fortement liée à la
représentation, vu que son principe est de
modifier le génotype. Lors de la conception
de cet opérateur il faut prendre en
considération

certains points très important :

· Ergodicité : La mutation doit


permettre d’atteindre toutes les
solutions de l’espace de recherche.

· Validité : La mutation doit


fournir des solutions valides et
donc vérifier les contraintes du
problème.

· Localité : La mutation doit


engendrer un changement minime,
similairement à la notion de voisinage dans les S-métaheuristiques. La localité est la caractérisation

de l’effet sur le phénotype engendré par la perturbation sur le génotype. Notons aussi que les idées utilisées
dans les operateurs de voisinage peuvent très bien être utilisés dans le cadre de l'opérateur de mutation
dans les algorithmes évolutionnaires.
Correction
Fonction : Génération de la population initiale
%% Create the initial population

function pop=init_pop(popsize,npar)

pop(1,:)=[1:npar];

for iz=2:popsize

pop(iz,:)=randperm(npar);
end

Fonction : des couts


% cost function for traveling salesperson problem

function dist=tspfun(pop,dcity)

% global iga x y

C=3;

EF=74;

S=7;

I=5*0.128;

F=162.152;

[Npop,Ncity]=size(pop);

tour=[pop pop(:,1)]; % ajouter l a1ere ville a la fin de la route

%% cout economique

%Ck : coût du transport sur le chemin k, en (€)

% ci : coût de transport sur une branche i, en (€)

c1t=[12,60];% c1t : frais fixes du transport t, en (€) exp route,train

% c2t : frais horaires du transport t, en (€/h)

c3t=[60,30]; % c3t : frais kilométrique du transport t, en (€/km)

% Dti : temps de transport d’une branche i, en (h)

% di : distance d’une branche i, en (km)

% µit : nombre de transport t utilisé dans une branche i

%% cout ecologique

ro=[71,18]; %quantité du polluant j émise par t, en (g/tonne.km)

%% calcul

for ic=1:Npop

dist(ic,1)=0;

for id=1:Ncity

%dist(ic,1)=dist(ic)+dcity(tour(ic,id),tour(ic,id+1)); ¨% distance

%dist(ic,1)=dist(ic)+c1t+c3t*dcity(tour(ic,id),tour(ic,id+1)); ¨% cout economique

%dist(ic,1)=dist(ic)+c1t(1,1)+c3t(1,1)*dcity(tour(ic,id),tour(ic,id+1)); % cout economique

%dist(ic,1)=dist(ic)+c1t(1,1)+c3t(1,1)*dcity(tour(ic,id),tour(ic,id+1)) +ro(1,1)*dcity(tour(ic,id),tour(ic,id+1)); %
cout economique + ecologique
end % id

%dist(ic,1)=dist(ic,1)*0.5+0.5*(dist(ic,1)*S*I*F);%CO2=ASIF

%dist(ic,1)=dist(ic,1)*0.8+0.2*(dist(ic,1)*C*EF);%CO2=ASIF

end % ic

Fonction : croisement
function [e1,e2] = ox_2pts_rest_ordre(I,J,N,p1,p2)

%I,J points

%N nbre de cities

%p1.2 parents

e1=zeros(1,N);

e12=zeros(1,N);

e13=zeros(1,N-(J-I+1));

e2=zeros(1,N);

e22=zeros(1,N);

e23=zeros(1,J-I+1);

e1([I:J]) = p1([I:J]);

e2([1:I-1])=p1([1:I-1]);

e2([J+1:size(p1,2)])=p1([J+1:size(p1,2)]);

%P2-E1=E12%%%%%%%%%%%

for c=1:N %parcourir p2

flag=1;

for cc=I:J %parcourir entre les pts de OX de p1=e1

if p2(c)==p1(cc)

flag=0;

end

end
if flag==1

e12(c)=p2(c);

end

end

%P2-E2=E22%%%%%%%%%%%

for c=1:N %parcourir p2

flag=1;

for cc=1:I-1 %parcourir entre les pts de OX de p1=e2 de debut a i-1

if p2(c)==p1(cc)

flag=0;

end

end

for cc=J+1:size(p1,2) %parcourir entre les pts de OX de p1=e2 de j+1 a la fin

if p2(c)==p1(cc)

flag=0;

end

end

if flag==1

e22(c)=p2(c);

end

end

%E13%%%%%%%%%%%%%

cc=1;

for c=1:N

if e12(c)~=0

e13(cc) = e12(c);

cc=cc+1;

end

end

%E23%%%%%%%%%%%%%

cc=1;

for c=1:N

if e22(c)~=0
e23(cc) = e22(c);

cc=cc+1;

end

end

%E1 = E1 FINALE

cc=1;

for c=1:N

if e1(c)==0

e1(c) = e13(cc);

cc=cc+1;

end

end

%E2 = E2 FINALE

cc=1;

for c=1:N

if e2(c)==0

e2(c) = e23(cc);

cc=cc+1;

end

end

end %fct

Fichier principal : corps de l’AG


%%

clc

clear

global iga x y

%____________________________________________________

%% Setup the GA

ff='tspfun'; % objective function

npar=52; %npar # optimization variables nbr of cities


%% XY of cities

% cities are at (xcity,ycity)

xy=load('berlin52.tsp');

x=xy(:,2);

y=xy(:,3);

%_______________________________________________________

%% Stopping criteria for the moment just to visualiaze results

maxit=1000; % max number of iterations

%_______________________________________________________

%% GA parameters

popsize=300; % set population size

mutRate=0.4;%what keeped from pop in the mutation process

selection=0.1; % fraction of population kept

keep=floor(selection*popsize); % #population members

M=ceil((popsize-keep)/2); % number of matings (pop -keep)/2

%% generation counter initialized

iga=0;

%% selection function

pref=ones(1,ceil(keep));%iwas keep/2 but be elitiste to the first is better

%pref=[pref 2*ones(1,ceil((keep+1-2)))];

for ii=2:keep %keep! element of 111111 222 33 within proba

pref=[pref ii*ones(1,ceil((keep+1-ii)/2)) ];%concat odd

end

Npref=length(pref);([1:keep]*100/Npref);%pourctge per rank

%_______________________________________________________

%% initialaize the initial pop in random n calculate its cost

pop=init_pop(popsize,npar);

%distance between cities

for ic=1:npar

for id=1:npar
dcity(ic,id)=sqrt((x(ic)-x(id))^2+(y(ic)-y(id))^2);

end % id

end %ic

cost=feval(ff,pop,dcity); % calculates population cost

figure(4);

pclr = ~get(0,'DefaultAxesColor');

imagesc(dcity);

title('Distance Matrix');

%% sort population with lowest using ff + min + mean

[cost,ind]=sort(cost); % min cost in element 1

pop=pop(ind,:); % sort population with lowest (lowest is 1st etc...)

minc(1)=min(cost); % minc contains min of population

meanc(1)=mean(cost); % meanc contains mean of population

varc(1)=var(cost);

%_______________________________________________________

%% Iterate through generations

while iga<maxit

iga=iga+1; % increments generation counter

%_______________________________________________________

%% Pair and mate

pick1=ceil(Npref*rand(1,M)); % mate #1 a random pick of M elements within pref -- from 1 to npref

pick2=ceil(Npref*rand(1,M)); % mate #2 same

% ma and pa contain the indicies of the parents

ma=pref(pick1); % M elements of mothers

pa=pref(pick2);%same for fathers

%_______________________________________________________

%% Performs mating 2 pts CrossX

for ic=1:M

mate1=pop(ma(ic),:);

mate2=pop(pa(ic),:);

indx=2*(ic-1)+1; % starts at one and skips every other one 1 3 5 ...M or M-1

%% MPX=========================

routeInsertionPoints = sort(ceil(npar*rand(1,2)));
I = routeInsertionPoints(1);

J = routeInsertionPoints(2);

[mate1,mate2] = ox_2pts_rest_ordre(I,J,npar,mate1,mate2);

pop(keep+indx,:)=mate1;

pop(keep+indx+1,:)=mate2;

end

%% Sort the costs and associated parameters and Do statistics

cost=feval(ff,pop,dcity);%part=pop; costt=cost;

[cost,ind]=sort(cost);

pop=pop(ind,:);

%_______________________________________________________

%% Mutation + exploration

for kk=1:(popsize-ceil(mutRate*popsize))%

k=randi(3,1,1);

%row1=ceil(rand*(popsize-5)) + 5;

row1=ceil(rand*(popsize-ceil(mutRate*popsize)))+ceil(mutRate*popsize);% ---- random value


between 1 and (popsize-ceil(mutRate*popsize))

switch k

case 1 % Flip

pop(row1,I:J) = pop(row1,J:-1:I);

case 2 % Swap

pop(row1,[I J]) = pop(row1,[J I]); %K-opt 2opt

case 3 % Slide

pop(row1,I:J) = pop(row1,[I+1:J I]);

otherwise % Do Nothing

end

end

%_______________________________________________________

%% Sort the costs and associated parameters and Do statistics

cost=feval(ff,pop,dcity);

[cost,ind]=sort(cost);

pop=pop(ind,:);

%_______________________________________________________
minc(iga)=min(cost);

meanc(iga)=mean(cost);

varc(iga)=var(cost);

%_______________________________________________________

%% figure

figure(1);

plot( x([pop(1,:) pop(1,1)]), y([pop(1,:) pop(1,1)]),'r.-


','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',10);

text(xy(:,2)+0.1, xy(:,3)+0.9, num2str((1:npar)'));set(gcf,'Color',[1,1,1]);

axis square

title(sprintf('Total Distance = %1.4f,Iteration = %d \n | Villes = %d | maxit = %d | popsize = %d | mutRate = %1.2f |


selection = %1.2f',cost(1),iga,npar,maxit,popsize,mutRate,selection));

end %iga

%_______________________________________________________

%% Displays the output

%------------------------------------------

figure(2);

day=clock;

disp(datestr(datenum(day(1),day(2),day(3),day(4),day(5),day(6)),0))

disp(['optimized function is ' ff])

format short g

disp([' best cost=' num2str(cost(1))])

disp(['best solution'])

disp([num2str(pop(1,:))])

subplot(3,1,2);

iters=1:maxit;

plot(iters,minc,'-r',iters,meanc,'-b');

legend('Minimum Cost','Mean Cost')

xlabel('generation');ylabel('cost');

subplot(3,1,3);
plot(iters,varc,'-g');

legend('variancce Cost') ;

xlabel('generation');ylabel('cost');

subplot(3,1,1);

plot( x([pop(1,:) pop(1,1)]), y([pop(1,:) pop(1,1)]),'rs-


','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',4);

axis square

title(sprintf('Total Distance = %1.4f,Iteration = %d \n | Villes = %d | maxit = %d | popsize = %d | mutRate = %1.2f |


selection = %1.2f',cost(1),iga,npar,maxit,popsize,mutRate,selection));

Das könnte Ihnen auch gefallen