//генерация первой популяции private void GenerateFirstPopulation() { for (int i = 0; i < dataContext.GAParams.PCount; i++) { //забили входные параметры population[i] = Randomize(); //посчитали выходные параметры est = new Estimation(population[i]); popResults[i] = new Results(); popResults[i] = est.Estimate(); //посчитали фитнесс FitnessCalc(population[i], popResults[i]); } }
private void OnExecuteMainWindow() { est = new Estimation(dataContext.Inputs); if (dataContext.Inputs.IsOptimizing) { gaView = new GAParameters(); gaView.DataContext = dataContext; gaView.Show(); } else { ResultsView resView = new ResultsView(est.Estimate()); resView.Show(); } }
private void Breeding() { //посчитали сумму фитнесса sumFitness = 0; for (int i = 0; i < dataContext.GAParams.PCount; i++) { sumFitness += popResults[i].Fitness; } dataContext.GAmodel.AverageFitness = sumFitness / dataContext.GAParams.PCount; //определили долю фитнесса каждого for (int i = 0; i < dataContext.GAParams.PCount; i++) { popResults[i].Crossingover = popResults[i].Fitness / sumFitness; } //выдали каждому диапазон вероятности для скрещивания (от 0 до 1) popResults[0].CrossChanceStart = 0; popResults[0].CrossChanceEnd = popResults[0].Crossingover; for (int i = 1; i < dataContext.GAParams.PCount; i++) { popResults[i].CrossChanceStart = popResults[i - 1].CrossChanceEnd; popResults[i].CrossChanceEnd = popResults[i].CrossChanceStart + popResults[i].Crossingover; } //отбираем родителей методом рулетки Roulette(); //скрещиваем Crossingover(); //мутация Mutation(); //посчитали выходные параметры для детей childrenResults = new Results[dataContext.GAParams.ChildrenCount]; for (int i = 0; i < dataContext.GAParams.ChildrenCount; i++) { est = new Estimation(children[i]); childrenResults[i] = new Results(); childrenResults[i] = est.Estimate(); } //считаем фитнесс для детей for (int i = 0; i < children.Length; i++) { FitnessCalc(children[i], childrenResults[i]); } //Формирование нового поколения wholePopulation = new Inputs[dataContext.GAParams.PCount + dataContext.GAParams.ChildrenCount]; wholePopResults = new Results[dataContext.GAParams.PCount + dataContext.GAParams.ChildrenCount]; NewGeneration(); //Сортировка по фитнессу FitnessSort(); dataContext.GAmodel.BestFitness = wholePopResults[0].Fitness; //умерщвление самых слабых //wholePopResults[0].Fitness = 0; population = new Inputs[dataContext.GAParams.PCount]; popResults = new Results[dataContext.GAParams.PCount]; Array.Copy(wholePopulation, population, dataContext.GAParams.PCount); Array.Copy(wholePopResults, popResults, dataContext.GAParams.PCount); int same = 0; for (int i = 1; i < dataContext.GAParams.PCount / 5 + 1; i++) { if (popResults[i].Fitness == popResults[i - 1].Fitness) { same++; } } //проверка условий остановки if ((generationCounter >= dataContext.GAParams.Generations) || (same >= dataContext.GAParams.PCount / 5)) { stop = true; } }