void InitialiseAgents(int MinMaxFlag, double[,] Bounds, ParameterTypes[] VariableType) { Agents = new double[PopulationSize, Dimensionality]; Scores = new double[PopulationSize]; SobolRNG initialisationRNG = new SobolRNG(Dimensionality, 777); double[] randoms; for (int i = 0; i < PopulationSize; ++i) { while (true) { randoms = initialisationRNG.Next(); for (int j = 0; j < Dimensionality; ++j) { Agents[i, j] = AdjustValueForVariableType(VariableType[j], randoms[j] * Bounds[j, 0] + (1 - randoms[j]) * Bounds[j, 1]); } if (!PreviousParameterSets.ContainsKey(Agents.Row(i))) { PreviousParameterSets.Add(Agents.Row(i), true); break; } } } Scores = ScoreGeneration(MinMaxFlag, Agents); for (int i = 0; i < PopulationSize; ++i) { if (double.IsNaN(Scores[i])) { StringBuilder sb = new StringBuilder("Error initialising differential evolution! ("); for (int j = 0; j < Dimensionality - 1; ++j) { sb.Append(Agents[i, j] + ","); } sb.Append(Agents[i, Dimensionality - 1] + ")"); throw new Exception(sb.ToString()); } } }
public void Initialise(int dimensionality, int populationSize, double differentialWeight, double crossoverProbability) { Dimensionality = dimensionality; PopulationSize = populationSize; DifferentialWeight = differentialWeight; CrossoverProbability = crossoverProbability; ParallelOptions = new ParallelOptions(); ParallelOptions.MaxDegreeOfParallelism = 1; // It's not possible to run this in parallel because generations need to run sequentially in // order to converge towards good solutions. //ParallelOptions.MaxDegreeOfParallelism = Environment.ProcessorCount; InitialisationRNG = new SobolRNG(Dimensionality, 777); MutationRNG = new SobolRNG(4, 123); RecombinationRNG = new SobolRNG(Dimensionality, 456); PreviousParameterSets = new Dictionary <double[], bool>(); }