public IGeneration Crossover(List <IChromosome> parents)
        {
            Generation newGeneration = new Generation();

            int[] swapPoints = new int[parents.Count / 2];
            for (int i = 0; i < swapPoints.Length; i++)
            {
                int index;
                do
                {
                    index = r.Next(parents.Count);
                } while (swapPoints.Contains(index));
                swapPoints[i] = index;
            }

            while (newGeneration.individuals.Count < population.NumberOfIndividuals)
            {
                //2 szülő kiválasztása:
                AdvAlg_OSSK0O.Problems.TravellingSalesman.Route parent1, parent2, child;
                parent1 = parents[r.Next(0, parents.Count)] as AdvAlg_OSSK0O.Problems.TravellingSalesman.Route;
                do
                {
                    parent2 = parents[r.Next(0, parents.Count)] as AdvAlg_OSSK0O.Problems.TravellingSalesman.Route;
                } while (parent1 == parent2);

                //leszármazott létrehozása:


                var firstParentGenes = new List <AdvAlg_OSSK0O.Problems.TravellingSalesman.Town>(parent1.TownList);

                child          = new TravellingSalesman.Route();
                child.TownList = parent1.TownList.ToList();
                for (int i = 0; i < population.NumberOfObjects; i++)
                {
                    if (swapPoints.Contains(i))
                    {
                        var gene = parent2.TownList[i];
                        firstParentGenes.Remove(gene);
                        firstParentGenes.Insert(i, gene);
                    }
                }
                //child.ReplaceGenes(0, firstParentGenes.ToArray());
                AdvAlg_OSSK0O.Problems.TravellingSalesman.Town[] p1 = firstParentGenes.ToArray();
                for (int i = 0; i < p1.Length; i++)
                {
                    child.TownList[i] = p1[i];
                }

                newGeneration.individuals.Add(child);
            }

            return(newGeneration);
        }
        public void InitialisePopulation(bool random)
        {
            IGeneration g = new Generation();

            if (random)
            {
                Logol("Towns (random):\n");
                //for (int i = 0; i < population.NumberOfObjects; i++)
                //{
                //    (Problem as TravellingSalesman).Towns.Add(new AdvAlg_OSSK0O.Problems.TravellingSalesman.Town() { X = r.Next(20, 400), Y = r.Next(20, 250), Index = (i + 1) });
                //    Logol("(" + (Problem as TravellingSalesman).Towns[i].X + "," + (Problem as TravellingSalesman).Towns[i].Y + ") ");
                //}


                for (int i = 0; i < population.NumberOfObjects / 4; i++)
                {
                    (Problem as TravellingSalesman).Towns.Add(new AdvAlg_OSSK0O.Problems.TravellingSalesman.Town()
                    {
                        X = r.Next(50, 100), Y = r.Next(20, 250), Index = (i + 1)
                    });
                    Logol("(" + (Problem as TravellingSalesman).Towns[i].X + "," + (Problem as TravellingSalesman).Towns[i].Y + ") ");
                }
                for (int i = 0; i < population.NumberOfObjects / 4; i++)
                {
                    (Problem as TravellingSalesman).Towns.Add(new AdvAlg_OSSK0O.Problems.TravellingSalesman.Town()
                    {
                        X = r.Next(350, 400), Y = r.Next(20, 250), Index = (i + 1)
                    });
                    Logol("(" + (Problem as TravellingSalesman).Towns[i].X + "," + (Problem as TravellingSalesman).Towns[i].Y + ") ");
                }
                for (int i = 0; i < population.NumberOfObjects / 4; i++)
                {
                    (Problem as TravellingSalesman).Towns.Add(new AdvAlg_OSSK0O.Problems.TravellingSalesman.Town()
                    {
                        X = r.Next(50, 400), Y = r.Next(50, 100), Index = (i + 1)
                    });
                    Logol("(" + (Problem as TravellingSalesman).Towns[i].X + "," + (Problem as TravellingSalesman).Towns[i].Y + ") ");
                }
                for (int i = 0; i < population.NumberOfObjects / 4; i++)
                {
                    (Problem as TravellingSalesman).Towns.Add(new AdvAlg_OSSK0O.Problems.TravellingSalesman.Town()
                    {
                        X = r.Next(50, 400), Y = r.Next(200, 250), Index = (i + 1)
                    });
                    Logol("(" + (Problem as TravellingSalesman).Towns[i].X + "," + (Problem as TravellingSalesman).Towns[i].Y + ") ");
                }

                //for (int i = 10; i < 400; i+=50)
                //{
                //    for (int j = 10; j < 300; j+=50)
                //    {

                //        (Problem as TravellingSalesman).Towns.Add(new AdvAlg_OSSK0O.Problems.TravellingSalesman.Town() { X = i, Y = j, Index = (i + 1) });
                //        //Logol("(" + (Problem as TravellingSalesman).Towns[i].X + "," + (Problem as TravellingSalesman).Towns[i].Y + ") ");
                //    }

                //}
                population.NumberOfObjects     = (Problem as TravellingSalesman).Towns.Count;
                population.NumberOfIndividuals = population.NumberOfObjects * 2;

                for (int i = 0; i < population.NumberOfIndividuals; i++)
                {
                    AdvAlg_OSSK0O.Problems.TravellingSalesman.Route route = new TravellingSalesman.Route()
                    {
                        TownList = (Problem as TravellingSalesman).Towns.ToList()
                    };
                    for (int j = 0; j < population.NumberOfObjects; j++)
                    {
                        int from = r.Next(0, population.NumberOfObjects);
                        int to   = r.Next(0, population.NumberOfObjects);

                        AdvAlg_OSSK0O.Problems.TravellingSalesman.Town temp = route.TownList[from];
                        route.TownList[from] = route.TownList[to];
                        route.TownList[to]   = temp;
                    }
                    g.individuals.Add(route);
                }
            }
            else
            {
                Logol("Towns (from file):\n");
                using (StreamReader reader = new StreamReader("towns.txt"))
                {
                    int    i = 1;
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        string[] coord = line.Split('\t');
                        Problems.TravellingSalesman.Town town = new AdvAlg_OSSK0O.Problems.TravellingSalesman.Town()
                        {
                            X = int.Parse(coord[0]), Y = int.Parse(coord[1]), Index = i
                        };
                        (Problem as TravellingSalesman).Towns.Add(town);
                        Logol(town.Index + ".: (" + town.X + "," + town.Y + ") ");
                        i++;
                    }
                }
                int townsNumber = (Problem as TravellingSalesman).Towns.Count;
                population.NumberOfObjects = townsNumber;
                for (int i = 0; i < population.NumberOfIndividuals; i++)
                {
                    AdvAlg_OSSK0O.Problems.TravellingSalesman.Route route = new TravellingSalesman.Route()
                    {
                        TownList = (Problem as TravellingSalesman).Towns.ToList()
                    };
                    for (int j = 0; j < townsNumber; j++)
                    {
                        int from = r.Next(0, townsNumber);
                        int to   = r.Next(0, townsNumber);

                        AdvAlg_OSSK0O.Problems.TravellingSalesman.Town temp = route.TownList[from];
                        route.TownList[from] = route.TownList[to];
                        route.TownList[to]   = temp;
                    }
                    g.individuals.Add(route);
                }
            }



            population.AddNewGeneration(g);
        }