Advertisement
CodeCrusader

Python Genetic Algorithm: Traveling Salesman Problem Solver

Jun 4th, 2023
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.96 KB | Source Code | 0 0
  1. import random
  2. import math
  3.  
  4. class Individual:
  5.     def __init__(self, cities):
  6.         self.cities = cities
  7.         self.fitness = 0
  8.  
  9.     def calculate_fitness(self):
  10.         total_distance = 0
  11.         for i in range(len(self.cities)):
  12.             current_city = self.cities[i]
  13.             next_city = self.cities[(i + 1) % len(self.cities)]
  14.             distance = calculate_distance(current_city, next_city)
  15.             total_distance += distance
  16.         self.fitness = 1 / total_distance
  17.  
  18. def calculate_distance(city1, city2):
  19.     x1, y1 = city1
  20.     x2, y2 = city2
  21.     distance = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
  22.     return distance
  23.  
  24. def create_initial_population(city_list, population_size):
  25.     population = []
  26.     for _ in range(population_size):
  27.         cities = random.sample(city_list, len(city_list))
  28.         individual = Individual(cities)
  29.         individual.calculate_fitness()
  30.         population.append(individual)
  31.     return population
  32.  
  33. def evolve_population(population, elite_size, mutation_rate):
  34.     elite = select_elite(population, elite_size)
  35.     offspring = crossover_population(elite, population)
  36.     population = mutate_population(offspring, mutation_rate)
  37.     return population
  38.  
  39. def select_elite(population, elite_size):
  40.     sorted_population = sorted(population, key=lambda individual: individual.fitness, reverse=True)
  41.     return sorted_population[:elite_size]
  42.  
  43. def crossover_population(elite, population):
  44.     offspring = elite
  45.     non_elite_size = len(population) - len(elite)
  46.     non_elite = random.sample(population, non_elite_size)
  47.     offspring += non_elite
  48.     return offspring
  49.  
  50. def mutate_population(population, mutation_rate):
  51.     for individual in population:
  52.         if random.random() < mutation_rate:
  53.             index1 = random.randint(0, len(individual.cities) - 1)
  54.             index2 = random.randint(0, len(individual.cities) - 1)
  55.             individual.cities[index1], individual.cities[index2] = individual.cities[index2], individual.cities[index1]
  56.             individual.calculate_fitness()
  57.     return population
  58.  
  59. # Main genetic algorithm function
  60. def genetic_algorithm(city_list, population_size, elite_size, mutation_rate, generations):
  61.     population = create_initial_population(city_list, population_size)
  62.     print("Initial distance: " + str(1 / max(population, key=lambda individual: individual.fitness).fitness))
  63.  
  64.     for _ in range(generations):
  65.         population = evolve_population(population, elite_size, mutation_rate)
  66.  
  67.     best_individual = max(population, key=lambda individual: individual.fitness)
  68.     print("Final distance: " + str(1 / best_individual.fitness))
  69.     return best_individual
  70.  
  71. # Usage example
  72. city_list = [(x, y) for x in range(10) for y in range(10)]
  73. population_size = 100
  74. elite_size = 20
  75. mutation_rate = 0.01
  76. generations = 100
  77.  
  78. best_route = genetic_algorithm(city_list, population_size, elite_size, mutation_rate, generations)
  79. print("Best route:", best_route.cities)
  80.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement