// Worker thread void SearchSolution() { // constants double[] constants = new double[10] { 1, 2, 3, 5, 7, 11, 13, 17, 19, 23 }; // create fitness function TimeSeriesPredictionFitness fitness = new TimeSeriesPredictionFitness( data, windowSize, predictionSize, constants); // create gene function IGPGene gene = (functionsSet == 0) ? (IGPGene)new SimpleGeneFunction(windowSize + constants.Length) : (IGPGene)new ExtendedGeneFunction(windowSize + constants.Length); // create population Population population = new Population(populationSize, (geneticMethod == 0) ? (IChromosome)new GPTreeChromosome(gene) : (IChromosome)new GEPChromosome(gene, headLength), fitness, (selectionMethod == 0) ? (ISelectionMethod)new EliteSelection() : (selectionMethod == 1) ? (ISelectionMethod)new RankSelection() : (ISelectionMethod)new RouletteWheelSelection() ); // iterations int i = 1; // solution array int solutionSize = data.Length - windowSize; double[,] solution = new double[solutionSize, 2]; double[] input = new double[windowSize + constants.Length]; // calculate X values to be used with solution function for (int j = 0; j < solutionSize; j++) { solution[j, 0] = j + windowSize; } // prepare input Array.Copy(constants, 0, input, windowSize, constants.Length); // loop while (!needToStop) { // run one epoch of genetic algorithm population.RunEpoch(); try { // get best solution string bestFunction = population.BestChromosome.ToString(); // calculate best function and prediction error double learningError = 0.0; double predictionError = 0.0; // go through all the data for (int j = 0, n = data.Length - windowSize; j < n; j++) { // put values from current window as variables for (int k = 0, b = j + windowSize - 1; k < windowSize; k++) { input[k] = data[b - k]; } // evalue the function solution[j, 1] = PolishExpression.Evaluate(bestFunction, input); // calculate prediction error if (j >= n - predictionSize) { predictionError += Math.Abs(solution[j, 1] - data[windowSize + j]); } else { learningError += Math.Abs(solution[j, 1] - data[windowSize + j]); } } // update solution on the chart chart.UpdateDataSeries("solution", solution); // set current iteration's info SetText(currentIterationBox, i.ToString()); SetText(currentLearningErrorBox, learningError.ToString("F3")); SetText(currentPredictionErrorBox, predictionError.ToString("F3")); } catch { // remove any solutions from chart in case of any errors chart.UpdateDataSeries("solution", null); } // increase current iteration i++; // if ((iterations != 0) && (i > iterations)) break; } // show solution SetText(solutionBox, population.BestChromosome.ToString()); for (int j = windowSize, k = 0, n = data.Length; j < n; j++, k++) { AddSubItem(dataList, j, solution[k, 1].ToString()); } // enable settings controls EnableControls(true); }
// Worker thread void SearchSolution() { // create population Population population = new Population(populationSize, new BinaryChromosome(chromosomeLength), userFunction, (selectionMethod == 0) ? (ISelectionMethod)new EliteSelection() : (selectionMethod == 1) ? (ISelectionMethod)new RankSelection() : (ISelectionMethod)new RouletteWheelSelection() ); // set optimization mode userFunction.Mode = (optimizationMode == 0) ? OptimizationFunction1D.Modes.Maximization : OptimizationFunction1D.Modes.Minimization; // iterations int i = 1; // solution double[,] data = new double[(showOnlyBest) ? 1 : populationSize, 2]; // loop while (!needToStop) { // run one epoch of genetic algorithm population.RunEpoch(); // show current solution if (showOnlyBest) { data[0, 0] = userFunction.Translate(population.BestChromosome); data[0, 1] = userFunction.OptimizationFunction(data[0, 0]); } else { for (int j = 0; j < populationSize; j++) { data[j, 0] = userFunction.Translate(population[j]); data[j, 1] = userFunction.OptimizationFunction(data[j, 0]); } } chart.UpdateDataSeries("solution", data); // set current iteration's info SetText(currentIterationBox, i.ToString()); SetText(currentValueBox, userFunction.Translate(population.BestChromosome).ToString("F3")); // increase current iteration i++; // if ((iterations != 0) && (i > iterations)) break; } // enable settings controls EnableControls(true); }
// Worker thread void SearchSolution() { // create fitness function TSPFitnessFunction fitnessFunction = new TSPFitnessFunction(map); // create population Population population = new Population(populationSize, (greedyCrossover) ? new TSPChromosome(map) : new PermutationChromosome(citiesCount), fitnessFunction, (selectionMethod == 0) ? (ISelectionMethod)new EliteSelection() : (selectionMethod == 1) ? (ISelectionMethod)new RankSelection() : (ISelectionMethod)new RouletteWheelSelection() ); // iterations int i = 1; // path double[,] path = new double[citiesCount + 1, 2]; // loop while (!needToStop) { // run one epoch of genetic algorithm population.RunEpoch(); // display current path ushort[] bestValue = ((PermutationChromosome)population.BestChromosome).Value; for (int j = 0; j < citiesCount; j++) { path[j, 0] = map[bestValue[j], 0]; path[j, 1] = map[bestValue[j], 1]; } path[citiesCount, 0] = map[bestValue[0], 0]; path[citiesCount, 1] = map[bestValue[0], 1]; mapControl.UpdateDataSeries("path", path); // set current iteration's info SetText(currentIterationBox, i.ToString()); SetText(pathLengthBox, fitnessFunction.PathLength(population.BestChromosome).ToString()); // increase current iteration i++; // if ((iterations != 0) && (i > iterations)) break; } // enable settings controls EnableControls(true); }
// Worker thread void SearchSolution() { // create fitness function SymbolicRegressionFitness fitness = new SymbolicRegressionFitness(data, new double[] { 1, 2, 3, 5, 7 }); // create gene function IGPGene gene = (functionsSet == 0) ? (IGPGene)new SimpleGeneFunction(6) : (IGPGene)new ExtendedGeneFunction(6); // create population Population population = new Population(populationSize, (geneticMethod == 0) ? (IChromosome)new GPTreeChromosome(gene) : (IChromosome)new GEPChromosome(gene, 15), fitness, (selectionMethod == 0) ? (ISelectionMethod)new EliteSelection() : (selectionMethod == 1) ? (ISelectionMethod)new RankSelection() : (ISelectionMethod)new RouletteWheelSelection() ); // iterations int i = 1; // solution array double[,] solution = new double[50, 2]; double[] input = new double[6] { 0, 1, 2, 3, 5, 7 }; // calculate X values to be used with solution function for (int j = 0; j < 50; j++) { solution[j, 0] = chart.RangeX.Min + (double)j * chart.RangeX.Length / 49; } // loop while (!needToStop) { // run one epoch of genetic algorithm population.RunEpoch(); try { // get best solution string bestFunction = population.BestChromosome.ToString(); // calculate best function for (int j = 0; j < 50; j++) { input[0] = solution[j, 0]; solution[j, 1] = PolishExpression.Evaluate(bestFunction, input); } chart.UpdateDataSeries("solution", solution); // calculate error double error = 0.0; for (int j = 0, k = data.GetLength(0); j < k; j++) { input[0] = data[j, 0]; error += Math.Abs(data[j, 1] - PolishExpression.Evaluate(bestFunction, input)); } // set current iteration's info SetText(currentIterationBox, i.ToString()); SetText(currentErrorBox, error.ToString("F3")); } catch { // remove any solutions from chart in case of any errors chart.UpdateDataSeries("solution", null); } // increase current iteration i++; // if ((iterations != 0) && (i > iterations)) break; } // show solution SetText(solutionBox, population.BestChromosome.ToString()); // enable settings controls EnableControls(true); }