L`algorithme des nuées dynamiques

publicité
GBM – Imagerie numérique – TP Nuées dynamiques
L'algorithme des nuées dynamiques
INTRODUCTION
Soit un ensemble I de nVertex points à partitionner, dans l'espace R². Ces partitions ou classes
seront structurées autour de centres également appelés noyaux. On désire constituer nNoyaux
classes. Pour cela, on va utiliser la méthode de classification autour de centres mobiles
également appelée dans ce cas algorithme des nuées dynamiques. Les étapes de l'algorithme
sont illustrées par la figure suivante (nNoyaux = 2, nVertex = 20).
MISE EN PLACE
DONNEES
On déclarera en variables globales les données suivantes :
int
float
float
int
nVertex ;
*Vertex_X, *Vertex_Y
;
MaxX, MinX, MaxY, MinY ;
*Point_App ;
/*
/*
/*
/*
Nombre de points */
Coordonnées 2D des points */
Limites du nuage de points */
Appartenance des points à une classe */
int
nNoyaux ;
float *Noyaux_X, *Noyaux_Y ;
float *PrecNoyaux_X, *PrecNoyaux_Y ;
/* Nombre de noyaux */
/* Coordonnées 2D des noyaux */
/* Idem pour l'étape précédente */
INITIALISATION DES DONNEES
L'ensemble (nuage) de points sera lu dans un fichier texte de la forme suivante :
Nombre de points nVertex
X Y du point 0
X Y du point 1
…
X Y du point nVertex-1
Ecrire une fonction LireFichier (adaptation d'une fonction déjà programmée) qui lira
nVertex, allouera de façon dynamique les tableaux de coordonnées (en flottants) des points
GBM – Imagerie numérique – TP Nuées dynamiques
et les lira. Dans cette fonction, on calculera également les dimensions Min et Max en X et Y
du nuage. Toujours dans cette fonction, on saisira au clavier le nombre de noyaux nNoyaux
puis on allouera les tableaux de coordonnées des noyaux de même que les tableaux de
coordonnées des noyaux à l'étape précédente. On allouera enfin le tableau Point_App (de
dimension nVertex) qui donnera les appartenances des points
ALGORITHME DE CLASSIFICATION
INITIALISATION
Dans un premier temps, les nNoyaux sont affectés aléatoirement. Il est donc pratique de les
initialiser aux premiers points de l'ensemble chargé.
Rédiger une fonction Nuees_Dynamiques() qui contiendra l'ensemble de l'algorithme. On
commencera donc par son initialisation.
ALGORITHME
Rédiger une fonction float Distance (float X1, float Y1, float X2, float Y2)qui
calcule la distance euclidienne entre (X1,Y1) et (X2,Y2).
Rédiger une fonction Affecte_Points_Classe () qui pour chaque point i du nuage va
chercher le noyau n qui lui est le plus proche et affecter n à Point_App[i].
L'algorithme est itératif. On va donc réaliser une boucle qui va faire évoluer les noyaux
(centres des classes) jusqu'à leur immobilité d'une étape à l'autre.
La trame de l'algorithme est la suivante :
Initialisation
Faire
• Sauvegarde les noyaux de l'étape précédente
• Affecte_Points_Classe() // Calcul des classes
• Calculer les nouveaux noyaux qui sont les isobarycentres des classes
• Calculer la distance globale d qui traduit l'évolution des noyaux de
l'étape précédente à cette étape
Tant que d < 0.01
AFFICHAGE DU RESULTAT
La fenêtre OpenGL est paramétrée dans un winInit() avec la fonction gluOrtho2D, utilisée
avec les limites du rectangle englobant du nuage de points.
Les points des nuages et les noyaux pourront être affichés de deux couleurs différentes.
N'hésitez pas à donner un peu d'épaisseur aux noyaux au moyen de la fonction
glPointSize().
Il peut également être intéressant de voir l'algorithme évoluer en affichant les noyant à chaque
étape.
Bon courage…
Téléchargement