private void DoCrossoverForBestIndividuals() { int length = firstFront.Count; int numberOfConfigurations = allConfigurations.Count; while (nsgaPopulation.Count < numberOfConfigurations) { int index_parent1, index_parent2; int count = 10; do { index_parent1 = random.Next(0, bestIndividuals.Count); index_parent2 = random.Next(0, bestIndividuals.Count); count--; } while (index_parent1 == index_parent2 && count != 0); if (bestIndividuals.Count > 1) { if (count == 0) { index_parent1 = bestIndividuals.Count - 1; index_parent2 = bestIndividuals.Count - 2; } Configuration parent1 = bestIndividuals[index_parent1]; Configuration parent2 = bestIndividuals[index_parent2]; List <Configuration> resultedConfigurations = Crossover(parent1, parent2); allConfigurations.AddRange(resultedConfigurations); var newSimulatedConfigurations = sim.Run(resultedConfigurations, selectedTraces); foreach (var cfg in resultedConfigurations) { if (nsgaPopulation.Count < numberOfConfigurations) { double ipc_average = 0, power_average = 0, energy_average = 0; int ct = 0; foreach (var item in newSimulatedConfigurations) { if (item.cfg == cfg) { ipc_average += item.ipc; power_average += item.power; energy_average += item.energy; ct++; } } ipc_average /= ct; power_average /= ct; energy_average /= ct; GeneticIndividual tempIndividual = new GeneticIndividual(cfg, ipc_average, power_average, energy_average); nsgaPopulation.Add(tempIndividual); } } } } }
public bool InitRandomPopulation(List <string> selectedTraces) { ConfigurationGenerator cg = new ConfigurationGenerator(); for (int i = 0; i < populationSize; i++) { population.Add(cg.RandomConfig(individualID.ToString())); } allConfigurations.AddRange(population); var results = sim.Run(population, selectedTraces); for (int i = 0; i < population.Count; i++) { population[i] = new GeneticIndividual(population[i], 0.0, 0.0, 0.0); for (int j = 0; j < selectedTraces.Count; j++) { ((GeneticIndividual)population[i]).Ipc += 1.0 / results[i + population.Count * j].ipc; ((GeneticIndividual)population[i]).Power += results[i + population.Count * j].power; ((GeneticIndividual)population[i]).Energy += results[i + population.Count * j].energy; } if (selectedTraces.Count > 1) { ((GeneticIndividual)population[i]).Ipc /= selectedTraces.Count; ((GeneticIndividual)population[i]).Power /= selectedTraces.Count; ((GeneticIndividual)population[i]).Energy /= selectedTraces.Count; } nsgaPopulation.Add(new GeneticIndividual(population[i], ((GeneticIndividual)population[i]).Ipc, ((GeneticIndividual)population[i]).Power, ((GeneticIndividual)population[i]).Energy)); } return(true); }
public double Calculatedensity(GeneticIndividual individual, List <Configuration> pop) { foreach (var other in pop) { ((GeneticIndividual)other).distance = EuclideanDistance(((GeneticIndividual)individual), (GeneticIndividual)other); } var sorted = pop.OrderBy(c => (((GeneticIndividual)c).distance)).ToArray(); int k = (int)Math.Sqrt(pop.Count); return(1.0 / (((GeneticIndividual)sorted[k]).distance + 2.0)); }
public int Dominates(GeneticIndividual ind1, GeneticIndividual ind2) { if (ind1.Energy < ind2.Energy && ind1.Ipc < ind2.Ipc) { return(1); } if (ind1.Energy >= ind2.Energy && ind1.Ipc >= ind2.Ipc) { return(-1); } return(0); }
private void DoMutationAndSimulation() { foreach (var bestIndividual in bestIndividuals) { //preiau ultimul individ de pe primul front ( 0 ) Configuration configuration = new Configuration(); if (bestIndividual.FrontNumber == 0) { try { foreach (var individual in population) { if ((bestIndividual.Name.Substring(bestIndividual.Name.LastIndexOf('_') + 1)).Equals(individual.Name)) { configuration = individual; break; } } Configuration mutatedConfiguration = Mutate((Configuration)configuration.Clone()); mutatedConfiguration.Name = id.ToString(); id++; allConfigurations.Add(mutatedConfiguration); //rulare simulator doar pt mutatedConfiguration var newSimulatedConfigurations = sim.Run(new List <Configuration> { mutatedConfiguration }, selectedTraces); double ipc_average = 0, power_average = 0, energy_average = 0; foreach (var item in newSimulatedConfigurations) { ipc_average += item.ipc; power_average += item.power; energy_average += item.energy; } ipc_average /= newSimulatedConfigurations.Count; power_average /= newSimulatedConfigurations.Count; energy_average /= newSimulatedConfigurations.Count; GeneticIndividual tempIndividual = new GeneticIndividual(mutatedConfiguration, ipc_average, power_average, energy_average); nsgaPopulation.Add(tempIndividual); // Thread.Sleep(20); } catch (Exception e) { Console.WriteLine(e.Message); } } } }
public void CalculateObjectives() { results = sim.Run(population, selectedTraces); for (int i = 0; i < population.Count; i++) { population[i] = new GeneticIndividual(population[i], 0.0, 0.0, 0.0); for (int j = 0; j < selectedTraces.Count; j++) { ((GeneticIndividual)population[i]).Ipc += 1.0 / results[i + population.Count * j].ipc; ((GeneticIndividual)population[i]).Power += results[i + population.Count * j].power; ((GeneticIndividual)population[i]).Energy += results[i + population.Count * j].energy; } if (selectedTraces.Count > 1) { ((GeneticIndividual)population[i]).Ipc /= selectedTraces.Count; ((GeneticIndividual)population[i]).Power /= selectedTraces.Count; ((GeneticIndividual)population[i]).Energy /= selectedTraces.Count; } } }
private double EuclideanDistance(GeneticIndividual individual, GeneticIndividual other) { return(Math.Sqrt(Math.Pow(individual.Ipc - other.Ipc, 2) + Math.Pow(individual.Energy - other.Energy, 2))); }