/// <summary> /// Creates instance of genetic algorithm /// </summary> /// <param name="graph">Graph on which algorithm will operate</param> /// <param name="problem">Problem for which algorithm will attempt to find solution</param> /// <param name="geneticOperators">Genetic operators used for breeding new generations</param> /// <param name="settings">General settings for solution finding process</param> /// <param name="startingPopulation">Starting population for algorithm</param> //TODO: Introduce SavedState complex type public GeneticAlgorithm(Graph graph, IProblem problem, GeneticOperators geneticOperators, GeneticAlgorithmSettings settings, ICollection <Individual> startingPopulation = null, uint currentGeneration = 0, Guid?id = null) : base(graph, problem, id) { if (geneticOperators == null) { throw new ArgumentNullException(nameof(geneticOperators)); } if (!geneticOperators.IsValid()) { throw new ArgumentException("Genetic operators are not valid", nameof(geneticOperators)); } if (settings == null) { throw new ArgumentNullException(nameof(settings)); } GeneticOperators = geneticOperators; Settings = settings; if (startingPopulation == null || startingPopulation.Count == 0 || !startingPopulation.All(IsIndividualValid)) { GenerateInitialPopulation(); } else { CurrentPopulation = new SortedSet <Individual>(); foreach (var element in startingPopulation) { CurrentPopulation.Add(element); } } CurrentGeneration = currentGeneration; }
public void test4() { Console.WriteLine("Running test 4, cos..."); NeuronSettings nSettings = new NeuronSettings(); NeuronLayerSettings layerSettings = new NeuronLayerSettings(nSettings); layerSettings.mNumNeuronsPerLayerMin = 1; layerSettings.mNumNeuronsPerLayerMax = 1; NeuronNetSettings nnSettings = new NeuronNetSettings(layerSettings); nnSettings.mNumInputs = 1; nnSettings.mNumOutputs = 1; nnSettings.mNumLayersMin = 0; nnSettings.mNumLayersMax = 0; GeneticAlgorithmSettings gaSettings = new GeneticAlgorithmSettings(nnSettings.mFactory); gaSettings.mMaxPopulation = 1000; GeneticAlgorithm ga = new GeneticAlgorithm(gaSettings); List <double> inputs = new List <double>() { 0 }; List <double> expected = new List <double>() { 0 }; int mNumEpochs = 100; Console.WriteLine("Learning..."); for (int iEpoch = 0; iEpoch < mNumEpochs; iEpoch++) { Console.Write(string.Format("Epoch: {0} / {1}\t", iEpoch + 1, mNumEpochs)); for (double x = -1.5; x <= 1.5; x += 0.001) { inputs[0] = x; expected[0] = Math.Sin(x); learnPopulation(ga, inputs, expected); } Console.Write(string.Format("Average: {0}\t", ga.AverageFitness)); Console.Write(string.Format("Best: {0}\t", ga.BestFitness)); Console.Write(string.Format("Worst: {0}\n", ga.WorstFitness)); ga.epoch(); } Console.Write(ga.SortedPopulation[0].ToString()); }
static void Main(string[] args) { var settings = new GeneticAlgorithmSettings(new BasicStockTrading(), BasicStockTrading.Prices.Count); settings.StopFunction = new BasicStopFunction { MinFitness = 335 }; settings.Rng = new StrongRandom(new BufferedRadnomProvider((settings.PopulationSize * settings.GenotypeLength + (3 * settings.PopulationSize)))); var algorithm = new GeneticAlgorithm(settings); algorithm.Run(); }
public static void GeneticAlgorithmTest() { // In this test case, the GA is tasked with finding two numbers A and B // where A to the power of B = 100 and the difference between A and B is // as great as possible. var settings = new GeneticAlgorithmSettings() { Objective = OptimisationObjective.Minimise, MaxGenerations = 1000, WildcardRate = 0.1, InitialBoost = 5, }; var solver = new TestGASolver(settings); var result = solver.Run(); var value = solver.CalculateValue(result); Core.Print("Result: " + result[0] + " ^ " + result[1] + " = " + value); }
/// <summary> /// Creates instance of genetic algorithm /// </summary> /// <param name="graph">Graph on which algorithm will operate</param> /// <param name="problem">Problem for which algorithm will attempt to find solution</param> /// <param name="geneticOperators">Genetic operators used for breeding new generations</param> /// <param name="settings">General settings for solution finding process</param> /// <param name="startingPopulation">Starting population for algorithm</param> //TODO: Introduce SavedState complex type public GeneticAlgorithm(Graph graph, IProblem problem, GeneticOperators geneticOperators, GeneticAlgorithmSettings settings, ICollection<Individual> startingPopulation = null, uint currentGeneration = 0, Guid? id = null) : base(graph, problem, id) { if (geneticOperators == null) throw new ArgumentNullException(nameof(geneticOperators)); if (!geneticOperators.IsValid()) throw new ArgumentException("Genetic operators are not valid", nameof(geneticOperators)); if (settings == null) throw new ArgumentNullException(nameof(settings)); GeneticOperators = geneticOperators; Settings = settings; if (startingPopulation == null || startingPopulation.Count == 0 || !startingPopulation.All(IsIndividualValid)) GenerateInitialPopulation(); else { CurrentPopulation = new SortedSet<Individual>(); foreach (var element in startingPopulation) CurrentPopulation.Add(element); } CurrentGeneration = currentGeneration; }
public TestGASolver(GeneticAlgorithmSettings settings) : base(settings) { }
public void test1() { Console.WriteLine("Running test 1..."); NeuronSettings nSettings = new NeuronSettings(); NeuronLayerSettings layerSettings = new NeuronLayerSettings(nSettings); layerSettings.mNumNeuronsPerLayerMin = 2; layerSettings.mNumNeuronsPerLayerMax = 2; NeuronNetSettings nnSettings = new NeuronNetSettings(layerSettings); nnSettings.mNumInputs = 1; nnSettings.mNumOutputs = 1; nnSettings.mNumLayersMin = 0; nnSettings.mNumLayersMax = 0; GeneticAlgorithmSettings gaSettings = new GeneticAlgorithmSettings(nnSettings.mFactory); gaSettings.mMaxPopulation = 100; GeneticAlgorithm ga = new GeneticAlgorithm(gaSettings); List <double> inputs = new List <double>() { 0 }; List <double> expected = new List <double>() { 0 }; int mNumEpochs = 100; Console.WriteLine("Learning..."); for (int iEpoch = 0; iEpoch < mNumEpochs; iEpoch++) { Console.Write(string.Format("Epoch: {0} / {1}\t", iEpoch + 1, mNumEpochs)); for (int x = 0; x <= 100; x++) { inputs.Clear(); expected.Clear(); inputs.Add((double)x / 100.0); expected.Add((double)x / 100.0); learnPopulation(ga, inputs, expected); } Console.Write(string.Format("Average: {0}\t", ga.AverageFitness)); Console.Write(string.Format("Best: {0}\t", ga.BestFitness)); Console.Write(string.Format("Worst: {0}\n", ga.WorstFitness)); ga.epoch(); } Console.WriteLine("Predicting..."); for (int x = 0; x <= 100; x++) { inputs[0] = (double)x / 100.0; var outputs = predict(ga, inputs); Console.WriteLine(string.Format("Input:\t{0}\t\tOutput:\t{1}", inputs[0], outputs[0])); } }
public void test5Thread() { Console.WriteLine("Running test 5, min..."); DateTime timeStart = DateTime.Now; NeuronSettings nSettings = new NeuronSettings(); NeuronLayerSettings layerSettings = new NeuronLayerSettings(nSettings); layerSettings.mNumNeuronsPerLayerMin = 2; layerSettings.mNumNeuronsPerLayerMax = 2; NeuronNetSettings nnSettings = new NeuronNetSettings(layerSettings); nnSettings.mNumInputs = 2; nnSettings.mNumOutputs = 1; nnSettings.mNumLayersMin = 2; nnSettings.mNumLayersMax = 2; GeneticAlgorithmSettings gaSettings = new GeneticAlgorithmSettings(nnSettings.mFactory); gaSettings.mMaxPopulation = 100; GeneticAlgorithm ga = new GeneticAlgorithm(gaSettings); List <double> inputs = new List <double>() { 0, 0 }; List <double> expected = new List <double>() { 0 }; int iEpoch = 0; Console.WriteLine("Learning..."); while (!mLearningStopped && iEpoch < 100) { Console.Write(string.Format("Epoch: {0}\t", iEpoch++)); for (double x = 0; x <= 1; x += 0.01) { for (double y = 0; y <= 1; y += 0.01) { inputs[0] = x; inputs[1] = y; expected[0] = x * y; learnPopulation(ga, inputs, expected); } } Console.Write(string.Format("Average: {0:0.00}\t", ga.AverageFitness)); Console.Write(string.Format("Best: {0:0.00}\t", ga.BestFitness)); Console.Write(string.Format("Worst: {0:0.00}\n", ga.WorstFitness)); ga.epoch(); } DateTime timeEnd = DateTime.Now; TimeSpan ts = timeEnd - timeStart; Console.WriteLine("Learning took: " + ts.ToString()); Console.WriteLine("Predicting..."); for (double x = 0; x < 1; x += 0.1) { for (double y = 0; y < 1; y += 0.1) { inputs[0] = x; inputs[1] = y; var outputs = predict(ga, inputs); Console.WriteLine(string.Format("Input:\t{0}, {1}\t\tOutput:\t{2:0.000}", inputs[0], inputs[1], outputs[0])); } } }