public void InitPopulation() { individus = new List<Individu>(); averages = new List<double>(); // création de la population de base for (int i = 1; i <= 12; i++) { Individu individu = new Individu(); individu.SongNumber = i; individus.Add(individu); } }
public void InitPopulation() { individus = new List <Individu>(); averages = new List <double>(); // création de la population de base for (int i = 1; i <= 12; i++) { Individu individu = new Individu(); individu.SongNumber = i; individus.Add(individu); } }
public void NextGeneration() { Individu newIndividu; Individu parent; int nbParent; int i; List <Individu> nextGen = new List <Individu>(); List <Individu> parents = new List <Individu>(); nextGen.Clear(); // 1) SURVIE // élitisme, nous conservons que le meilleur nextGen.Add(meilleur()); nextGen[0].SongNumber = 1; for (i = 2; i <= 12; i++) { parents.Clear(); // 2) SELECTION des parents nbParent = (rand.Next(0, 100) <= crossoverRate ? 2 : 1); parent = meilleur(tirage(2)); for (int a = 1; a <= nbParent; a++) { while (parents.Contains(parent)) { parent = meilleur(tirage(2)); } parents.Add(parent); } // 3) CROSSOVER newIndividu = new Individu(parents); // 4) MUTATION newIndividu.muter(mutationRate); newIndividu.SongNumber = i; nextGen.Add(newIndividu); } // on vide la liste des individus de la génération actuelle individus.Clear(); // on met les individus de la génération suivante dans la liste des individus de la génération actuelle individus = nextGen; nbGeneration++; }
// cette méthode va renvoyer l'individu ayant la meilleure note parmis une liste d'individus // si plusieurs individus sont les meilleurs (même note), alors nous allons en renvoyer un aléatoirement parmi eux public Individu meilleur(List <Individu> listIndividus = null) { // si pas de paramètre saisi, alors nous faisons un "élitisme" sur l'ensemble des individus, sinon sur les individus transmis dans la liste listIndividus = (listIndividus == null ? this.individus : listIndividus); Individu meilleur = listIndividus[0]; List <Individu> meilleurs = new List <Individu>(); meilleurs.Add(meilleur); int i; for (i = 1; i <= listIndividus.Count - 1; i++) { if (listIndividus[i].Note > meilleur.Note) { meilleurs.Clear(); meilleurs.Add(listIndividus[i]); meilleur = listIndividus[i]; } else if (listIndividus[i].Note == meilleur.Note) { meilleurs.Add(listIndividus[i]); } } // si 1 seul individu a la meilleure note, on le retourne if (meilleurs.Count == 1) { return(meilleur); } // si on a plusieurs individus avec la même note, on a va devoir faire un rdm int index; index = rand.Next(0, meilleurs.Count); // return du 1er élément de la liste récupérée return(tirage(1, meilleurs)[0]); }
public void NextGeneration() { Individu newIndividu; Individu parent; int nbParent; int i; List<Individu> nextGen = new List<Individu>(); List<Individu> parents = new List<Individu>(); nextGen.Clear(); // 1) SURVIE // élitisme, nous conservons que le meilleur nextGen.Add(meilleur()); nextGen[0].SongNumber = 1; for (i = 2; i <= 12; i++) { parents.Clear(); // 2) SELECTION des parents nbParent = (rand.Next(0, 100) <= crossoverRate ? 2 : 1); parent = meilleur(tirage(2)); for (int a = 1; a <= nbParent; a++) { while (parents.Contains(parent)) parent = meilleur(tirage(2)); parents.Add(parent); } // 3) CROSSOVER newIndividu = new Individu(parents); // 4) MUTATION newIndividu.muter(mutationRate); newIndividu.SongNumber = i; nextGen.Add(newIndividu); } // on vide la liste des individus de la génération actuelle individus.Clear(); // on met les individus de la génération suivante dans la liste des individus de la génération actuelle individus = nextGen; nbGeneration++; }
// Méthode principale void CreateAndPlayMusic(int songNumber, bool onlyRecord) { // s'il y a un fichier en cours de lecture on l'arrête if (isPlaying) { mplayer.Stop(); mplayer.Close(); isPlaying = false; } // Générateur aléatoire Individu individu = population.Individus[songNumber]; // 1) Créer le fichier MIDI // a. Créer un fichier et une piste audio ainsi que les informations de tempo MIDISong song = new MIDISong(); song.AddTrack("Piste1"); song.SetTimeSignature(0, 4, 4); song.SetTempo(0, individu.Tempo); // b. Choisir un instrument entre 1 et 128 // Liste complète ici : http://fr.wikipedia.org/wiki/General_MIDI song.SetChannelInstrument(0, 0, individu.Instrument); // c. Ajouter des notes foreach (Note note in individu.Genes) { song.AddNote(0, 0, note.Valeur, note.Duration); } // d. Enregistrer le fichier .mid (lisible dans un lecteur externe par exemple) // on prépare le flux de sortie MemoryStream ms = new MemoryStream(); song.Save(ms); ms.Seek(0, SeekOrigin.Begin); byte[] src = ms.GetBuffer(); byte[] dst = new byte[src.Length]; for (int i = 0; i < src.Length; i++) { dst[i] = src[i]; } ms.Close(); // et on écrit le fichier try { strFileName = "Fichier" + nbFile + ".mid"; FileStream objWriter = File.Create(strFileName); objWriter.Write(dst, 0, dst.Length); objWriter.Close(); objWriter.Dispose(); objWriter = null; } catch (Exception E) { MessageBox.Show("Veuillez fermer la mélodie qui est en cours de lecture", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error); } if (!onlyRecord) { // 2) Jouer un fichier MIDI mplayer.Open(new Uri(strFileName, UriKind.Relative)); nbFile++; isPlaying = true; mplayer.Play(); } }