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); }