private Population GetPopulation() { string algorithmName = (string)algorithmsComboBox.SelectedItem; string tspProblemName = (string)tspProblemsComboBox.SelectedItem; IAlgorithm algorithm; CitiesSequence citiesSequence; switch (algorithmName) { case "Genetic algorithm": algorithm = new GeneticAlgorithm(); break; default: throw new InvalidOperationException($"Algorithm '{algorithmName}' is not supported."); } switch (tspProblemName) { case "TSP problem 1": citiesSequence = CitiesSequence.GetDefaultSequence(); break; default: throw new InvalidOperationException($"TSP problem '{tspProblemName}' is not supported."); } return(new Population(citiesSequence, algorithm)); }
public Population(CitiesSequence baseCitiesSequence, IAlgorithm algorithm, int populationSize = 50) { BaseCitiesSequence = baseCitiesSequence; Algorithm = algorithm; _populationSize = populationSize; CreateNewPopulation(); }
public List <CitiesSequence> SeedPopulation(CitiesSequence baseSequence, int populationSize) { PopulationSize = populationSize; return(Enumerable.Range(0, populationSize) .Select(_ => GenerateRandomSequence(baseSequence)) .ToList()); }
private CitiesSequence CrossBreed(CitiesSequence s1, CitiesSequence s2) { int[] bounds = new int[2]; bounds[0] = bounds[1] = _random.Next(s1.Cities.Count); // probably should be -1 while (bounds[0] == bounds[1]) { bounds[1] = _random.Next(s1.Cities.Count); } bounds = bounds.OrderBy(e => e).ToArray(); var availableCities = s1.Cities.ToList(); var usedCities = new List <City>(); var newSequence = new City[s1.Cities.Count]; for (int i = 0; i < s1.Cities.Count; i++) { // todo: check >= bound if (i < bounds[0] || i >= bounds[1]) { newSequence[i] = s1.Cities[i]; availableCities.Remove(s1.Cities[i]); usedCities.Add(s1.Cities[i]); } } // fill unused cities between bounds for (int i = bounds[0]; i < bounds[1]; i++) { var tryCity = s2.Cities[i]; if (usedCities.Contains(tryCity)) { newSequence[i] = availableCities.First(); availableCities.RemoveAt(0); usedCities.Add(newSequence[i]); } else { newSequence[i] = tryCity; availableCities.Remove(tryCity); usedCities.Add(tryCity); } } var result = new CitiesSequence(); result.Cities.AddRange(newSequence); result.CalculateCost(); return(result); }
private CitiesSequence GenerateRandomSequence(CitiesSequence baseSequence) { var availableCities = baseSequence.Cities.ToList(); var newSequence = new CitiesSequence(); while (availableCities.Count > 0) { var city = availableCities[_random.Next(availableCities.Count)]; availableCities.Remove(city); newSequence.Cities.Add(city); } return(newSequence); }
private void RandomMutation(CitiesSequence sequence) { // todo: make constant if (_random.NextDouble() > 0.05) { int i1, i2; i1 = i2 = _random.Next(sequence.Cities.Count); while (i1 == i2) { i2 = _random.Next(sequence.Cities.Count); } var temp = sequence.Cities[i1]; sequence.Cities[i1] = sequence.Cities[i2]; sequence.Cities[i2] = temp; } sequence.CalculateCost(); }