private Person cross(Person parent1, Person parent2) { int nbSeq = (int)(_nbNote * new Random().NextDouble()); int[] aNote = new int[_nbNote]; Person newPerson = new Person(_nbNote); for (int i = 0; i < _nbNote; i++) { if (i > nbSeq) { aNote[i] = parent2.notes[i]; } else { aNote[i] = parent1.notes[i]; } } newPerson.notes = aNote; if (parent1.fitness >= parent2.fitness) { newPerson.instrument = parent1.instrument; } else { newPerson.instrument = parent2.instrument; } return newPerson; }
public Population() { random = new Random(); _mutationRate = 1 / _nbNote; _persons = new Person[_nbPerson]; for (int i = 0; i < _nbPerson; i++) { _persons[i] = new Person(_nbNote, random.Next(1,129)); _persons[i].generateRandomNotes(random); } }
private Person mutation(Person person) { for (int i = 0; i < _nbNote; i++) { if (random.NextDouble() <= _mutationRate) { person.notes[i] = random.Next(0,127); } } return person; }
//survive if sum of fitness >= survivalRate private Person selectBest() { int sumFitness = 0; Person best = new Person(_nbNote); for (int i = 0; i < _nbPerson; i++) { sumFitness += _persons[i].fitness; if (_persons[i].fitness > best.fitness) { best = _persons[i]; best.fitness = 0; } } if (sumFitness / _nbPerson < _survivalRate) { best = null; } return best; }
public void newGeneration() { int i = 0; Person bestPerson = selectBest(); Person[] newPopulation = new Person[_nbPerson]; if (bestPerson != null) { Person person = new Person(_nbNote); person = bestPerson; person.fitness = 0; newPopulation[i] = person; i++; } for (; i < _nbPerson; i++) { Person person = selection(); if (random.NextDouble() < _crossoverRate) { Person crossPerson = selection(); person = cross(person, crossPerson); } person = mutation(person); person.fitness = 0; newPopulation[i] = person; } _persons = newPopulation; }