You are on page 1of 4

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ОБРАЗОВАНИЯ

МОСКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ


ВЫСШАЯ ШКОЛА ПЕЧАТИ И МЕДИАИНДУСТРИИ

Институт Принтмедиа и информационных технологий Кафедра


Информатики и информационных технологий

направление подготовки 09.03.02


«Информационные системы и технологии»

ЛАБОРАТОРНАЯ РАБОТА № 5

Дисциплина: технологии обработки информации

Выполнил(а): студент(ка) группы 201-724

Гуляев Дмитрий Максимович


(Фамилия И.О.)

Дата, подпись ________________ ___________


(Дата) (Подпись)

Проверил: _________________________ ___________


(Фамилия И.О., степень, звание) (Оценка)

Дата, подпись ________________ ___________


(Дата) (Подпись)

Замечания: _________________________________________________________
____________________________________________________________________
____________________________________________________________________

2023
Цель работы.

Выполнить программную реализацию решения задачи коммивояжёра с


использованием генетического алгоритма.
Теоретическое обоснование.
Генетический алгоритм — это эвристический алгоритм поиска, используемый для
решения задач оптимизации и моделирования путем последовательного подбора,
комбинирования и вариации искомых параметров с использованием механизмов,
напоминающих биологическую эволюцию. Является разновидностью
эволюционных вычислений (англ. evolutionary computation). Отличительной
особенностью генетического алгоритма является акцент на использование
оператора «скрещивания», который производит операцию рекомбинации решений-
кандидатов, роль которой аналогична роли скрещивания в живой природе. «Отцом-
основателем» генетических алгоритмов считается Джон Холланд (англ. John
Holland), книга которого «Адаптация в естественных и искусственных системах»
(1992) (англ. Adaptation in Natural and Artificial Systems) является
основополагающим трудом в этой области исследований
Листинг
import numpy as np, random, operator
def fitness(route,
CityList):
score = 0 for i in
range(1, len(route)):
k = int(route[i -
1]) l =
int(route[i])
score += np.sqrt((CityList[k][0] - CityList[l][0]) ** 2 +
(CityList[k][1] -
CityList[l][1]) ** 2)
return score
def
crossover(a, b):
child = []
childB = []
geneA = int(random.random() *
len(a)) geneB =
int(random.random() * len(a))
start_gene = min(geneA, geneB)
end_gene = max(geneA, geneB)
childA = [a[i] for i in range(start_gene,
end_gene)] childB = [item for item in a if item
not in childA] child = childA + childB

return child
def mutate(route, probablity):
route = np.array(route) for
swaping_p in range(len(route)):
if random.random() < probablity:
swapedWith = np.random.randint(0, len(route))
temp1 =
route[swaping_p]

temp2 = route[swapedWith]
route[swapedWith] = temp1
route[swaping_p] = temp2 return
route
def rankRoutes(population,
cities):
fitnessResults = {
i: fitness(population[i], cities) for i in
range(len(population))
}
return sorted(fitnessResults.items(), key=operator.itemgetter(1),
reverse=False)
def next_gen(cities, cur_pop, mut,
el_count): population_rank =
rankRoutes(cur_pop, cities) result =
[i[0] for i in population_rank]
selection_result = [result[i] for i in range(el_count)]
mating_pool = [cur_pop[selection_result[i]]
for i in range(len(selection_result))
]
children = [crossover(mating_pool[i], mating_pool[i
+ 1]) for i in range(len(mating_pool) -
1)
]
new_gen = []
for i in children:
muated_child = mutate(i, mut)
new_gen.append(muated_child)
return new_gen
def genetic_algorithm(cities, size_p=1000, el_count=100,
mut=0.1, gen=1600):
pop = []
progress = []
Number_of_cities = len(cities)
pop = set(np.arange(Number_of_cities, dtype=int))
population = [list(random.sample(pop, Number_of_cities)) for _ in
range(size_p)]
progress.append(rankRoutes(population,
cities)[0][1]) print(f"Начальная дистанция:
{progress[0]}") print(f"Начальный путь:
{population[0]}") for _ in range(gen):
pop = next_gen(cities, population, mut,
el_count)
progress.append(rankRoutes(pop, cities)[0][1])
rank_ = rankRoutes(pop, cities)[0]
print(f"Лучшая дистанция: {rank_[1]}")
print(f"Лучший путь: {pop[rank_[0]]} ")

cityList = []
for _ in
range(20):
x = int(random.random() *
150) y =
int(random.random() * 150)
cityList.append((x, y))

genetic_algorithm(cities

Результат работы программы:

You might also like