Esempio n. 1
0
 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);
 }
Esempio n. 2
0
        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();
        }