public DataCase(int a, int b, int r) { rnd = new Random(); if (r % (b - 1) == 0) { MemoryAllocation(a, b, r); RandInitValues(); } else { Console.WriteLine("Недопустимые значения, инициализация по умолчанию!\n"); MemoryAllocation(); BaseInitValues(); //Метод инициализации проверочными значениями } Individ.StaticInit(numberOfCompany, numberOfAttachmentSizes, resources, tableOfOffers, sizeOfAttachment); }
public void GeneticAlg() //Отвратительно работает, когда количество компаний больше количества предложений, т.е. когда в оптимальном генотипе есть множество нулей { int populationSize = numberOfAttachmentSizes * numberOfCompany; Individ.StaticInit(numberOfCompany, numberOfAttachmentSizes, resources, tableOfOffers, sizeOfAttachment); Console.WriteLine("Стартовая популяция: "); Individ[] population = new Individ[populationSize]; for (int i = 0; i < populationSize; i++) { population[i] = new Individ(rnd, rnd.Next(2)); //Случайная генерация стартовой популяции //population[i].Print(); } Console.WriteLine("Конец стартовой популяции"); int counter = 0; while (counter++ < 100) { double sumFitness = 0; Individ[] child = new Individ[populationSize * 3]; for (int i = 0; i < populationSize; i++) { child[i] = new Individ(population[i]); sumFitness += child[i].GetFitness(); } for (int i = populationSize; i < populationSize * 3; i++) //Создание потомков путем одноточечного кроссовера { child[i] = Crossover(population, populationSize); //Можно вставить формулу, но так красивее sumFitness += child[i].GetFitness(); } for (int i = 0; i < populationSize / 10; i++) { sumFitness += child[rnd.Next(populationSize * 3)].Mutation(rnd); } double averageFitness = sumFitness / (populationSize * 3); population = WheelRotation(child, populationSize, Convert.ToInt32(Math.Ceiling(sumFitness))); //Console.WriteLine("Потомки:"); //for (int i = 0; i < populationSize * 2; i++) // child[i].Print(); //population = ProportionalSelection(population, child, populationSize, averageFitness); //Console.WriteLine("Суммарная приспособленность равна: " + sumFitness); //Console.WriteLine("Средняя приспособленность: " + averageFitness); //Округляет вверх всегда //for (int i = 0; i < populationSize; i++) // population[i].Print(); } //for (int i = 0; i < populationSize; i++) // population[i].Print(); Console.WriteLine("Наилучшее найденное решение: "); population[FindBest(population, populationSize)].Print(); }