Bonjour,
Je travaille actuellement sur une application très gourmande en calcul, en fait il s'agit d'algorithme génétiques.
Une première étape a été de vouloir suivre graphiquement à l'aide de zedGraph la façon dont évoluait ma population. J'ai donc lancé la partie de mon code gérant l'algo génétique dans un nouveau thread, et je récupère périodiquement des données concernant l'état de l'algo via un callBack.
Ca ça marche bien, je construit dynamiquement mes courbes et je les affiche, sans freeze de mon WinForm. Pour info, j'ai en abscisse le nombre de générations, et en ordonnée 3 valeurs (Fitness la plus haute, Fitness moyenne de la population, nombre "d'individus" différents.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 // Callback public delegate void PointsDessin(int numGeneration, int Fitnessmax, int Fitnessmoy, int Distinct); public void dessine(int numGeneration, int Fitnessmax, int Fitnessmoy, int Distinct) { zgc.GraphPane.CurveList["Fitnessmax"].AddPoint(numGeneration, champion * multiplicateurY); zgc.GraphPane.CurveList["Fitnessmoy"].AddPoint(numGeneration, moyen * multiplicateurY); zgc.GraphPane.CurveList["Distinct"].AddPoint(numGeneration, distinct); refreshCourbes(); }
Maintenant, je voudrais pouvoir lancer plusieurs Threads gérant chacun une instance de mon algo, et moyenner leurs résultats.
J'avais pensé à cette solution :
- créer, par exemple pour la Fitnessmax, un
pour chaque courbe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int nombreDeThreads = 2; int[][] Fitnessmax = new int [nombreDeThreads][]; // suivie évidemment d'une boucle pour fixer la taille de chaque élément.
- Lors de la création du Thread, donner un numéro unique au thread via sa propriété name, et lors de l'appel du callback y ajouter ce numéro de thread,
- Du coup j'aurais pu faire ceci :
La question que je me pose, c'est que pour moi en théorie je ne devrais pas avoir de problèmes de concurrence entre threads dans ma fonction dessine, car effectivement ils peuvent aller en exécuter le code en même temps, mais puisque qu'ils écriront chacun dans leur Fitnessmax[] identifié par ThreadId on n'aura pas de problème de recouvrement de données.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public delegate void PointsDessin(int ThreadId, int numGeneration, int Fitnessmax, int Fitnessmoy, int Distinct); public void dessine(int ThreadId, int numGeneration, int Fitnessmax, int Fitnessmoy, int Distinct) { Fitnessmax[ThreadId][numGeneration] = Fitnessmax; // même chose pour Fitnessmoy et Distinct avec leurs tableaux de tableaux respectifs.... // puis mettre à jour mes courbes avec un timer par exemple }
Seulement ce que je vois un peu partout c'est qu'il vaudrait mieux locker mon tableau de tableau Fitnessmax[][] chaque fois que j'écris dedans. Cela m'ennuie pour des raisons de performance.
Auriez-vous un avis éclairé sur la question?
Si je ne suis pas très clair, n'hésitez pas à me demander des précisions ; les extraits de code que j'ai mis (et allégés) sont peut-être un peu justes.
Ivan.
Partager