ГЕНЕТИЧЕСКИЙ АЛГОРИТМ ЗАДАЧА КОММИВОЯЖЕРА PYTHON
Генетический алгоритм – это эвристический алгоритм поиска, который использует принципы наследственности и естественного отбора для решения задач оптимизации. Одной из таких задач является задача коммивояжера, то есть поиск кратчайшего маршрута, который проходит через все города, при условии, что каждый город посещается только один раз, а маршрут начинается и заканчивается в одном и том же городе.
Для решения задачи коммивояжера с помощью генетического алгоритма нужно определить представление решения (индивида), функцию приспособленности, операторы генетических вариации и штрафные функции для валидации решений.
Пример кода решения задачи коммивояжера на Python:
import numpy as np
from scipy.spatial import distance_matrix
class TSP_GA:
def __init__(self, coords, pop_size=100, elite_size=20, mutation_rate=0.1, generations=500):
self.coords = coords
self.pop_size = pop_size
self.elite_size = elite_size
self.mutation_rate = mutation_rate
self.generations = generations
self.dist_matrix = distance_matrix(coords, coords)
self.best_solution = []
self.best_distance = np.inf
self.population = self.create_population()
def create_population(self):
population = []
for i in range(self.pop_size):
solution = np.random.permutation(len(self.coords))
population.append(solution)
return population
def rank_routes(self):
distances = []
for i in range(len(self.population)):
dist = self.distance(self.population[i])
distances.append((i, dist))
return sorted(distances, key=lambda x: x[1])
def distance(self, solution):
route_distance = 0
for i in range(len(solution)):
if i == len(solution)-1:
from_city = solution[i]
to_city = solution[0]
else:
from_city = solution[i]
to_city = solution[i+1]
route_distance += self.dist_matrix[from_city][to_city]
return route_distance
def select_parents(self):
parents = []
for i in range(self.elite_size):
parents.append(self.population[self.ranked_routes[i][0]])
for i in range(len(self.population)-self.elite_size):
parent1 = self.tournament_selection()
parent2 = self.tournament_selection()
parents.append(parent1)
parents.append(parent2)
return parents
def breed_population(self):
children = []
parents = self.select_parents()
num_new = len(self.population) - len(parents)
for i in range(len(parents)):
child = self.crossover(parents[i % len(parents)], parents[(i+1) % len(parents)])
children.append(child)
for i in range(num_new):
child = np.random.permutation(len(self.coords))
children.append(child)
return children
def crossover(self, parent1, parent2):
start = np.random.randint(len(parent1))
end = np.random.randint(start, len(parent1))
child = [-1] * len(parent1)
for i in range(start, end+1):
child[i] = parent1[i]
remaining_cities = [x for x in parent2 if x not in child]
count = 0
for i in range(len(child)):
if child[i] == -1:
child[i] = remaining_cities[count]
count += 1
return child
def mutate_population(self, population):
for i in range(len(population)):
if np.random.rand() < self.mutation_rate:
ind1 = np.random.randint(len(population[i]))
ind2 = np.random.randint(len(population[i]))
pop[i][ind1], pop[i][ind2] = pop[i][ind2], pop[i][ind1]
return population
def evolve(self):
for i in range(self.generations):
self.ranked_routes = self.rank_routes()
elite = [self.population[x[0]] for x in self.ranked_routes][:self.elite_size]
self.population = self.breed_population()
self.population.extend(elite)
self.population = self.mutate_population(self.population)
if self.distance(self.population[0]) < self.best_distance:
self.best_solution = self.population[0]
self.best_distance = self.distance(self.population[0])
print(f'Generation: {i}; Best distance: {self.best_distance}')
coords = np.random.random((25,2))
tsp = TSP_GA(coords)
tsp.evolve()
Выполнение данного кода позволит найти кратчайший маршрут для 25 городов, однако алгоритм также работает для меньшего или большего количества городов.
#1. Основные этапы работы генетического алгоритма - Генетические алгоритмы на Python
Решение задачи коммивояжера с помощью библиотеки python-tsp
Генетический алгоритм задача коммивояжера
Генетический алгоритм и задача коммивояжера
Самый короткий тест на интеллект Задача Массачусетского профессора
Генетический алгоритм история и возможности - Генетические алгоритмы на Python
генетический алгоритм
#2. Делаем генетический алгоритм для задачи OneMax - Генетические алгоритмы на Python
ГЕНЕТИЧЕСКИЙ АЛГОРИТМ НА PYTHON
Виртуальная генетика - генетический алгоритм на python #1
Новые материалы:
- Django подписка на автора
- От перестановки мест python
- Python проверка на nan
- Аналитик данных на python skillbox
- Дано название футбольного клуба напечатать его на экране столбиком python
- Проверка на положительное число python
- Как отменить действие в python
- Elasticsearch python пример
- Python проверка на none
- Geekbrains python разработчик торрент
- Numpy применить функцию к массиву
- Последний элемент списка python