Example #1
0
        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);
            }
        }
Example #2
0
        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);
            }
        }
Example #3
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++;
        }
Example #4
0
        // 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]);
        }
Example #5
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++;
        }
Example #6
0
        // 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();
            }
        }