Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по ОМО 2025 / Baraeva_Elizaveta_lb5
.pdf
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по лабораторной работе №5
по дисциплине «Основы машинного обучения»
Тема: Генетические алгоритмы
Студентка гр. 2383
Бараева Е. Н.
Преподаватель
Жангиров Т. Р.
Санкт-Петербург
2025

2
Цель работы.
Целью данной лабораторной работы является разработка и реализация
генетического алгоритма для решения задачи оптимизации маршрута
почтальона, доставляющего почту.
Задание.
Вариант D
Задача о воздушной почте. Почтальону необходимо доставить почту в N
(задается пользователем) городов с заданными координатами (x, y) (вводится
пользователем). Города находятся на местности 30 км. на 30 км. Известно, что
каждый город нельзя посещать больше одного раза, и нужно вернуться в город
вылета. Но у почтальона есть вертолет, и он может летать из любого города в
любой другой по прямой. У городов есть приоритет доставки, города с
большим приоритетом должны обязательно получать почту раньше городов с
меньшим приоритетом (приоритеты задаются пользователем, а также у
нескольких городов может быть одинаковый приоритет). А так как вертолет
старый, то нежелательно, чтобы один перелет между городами был больше 5
километров. Необходимо составить маршрут для почтальона, чтобы он
пролетел минимальное расстояние. Почтальон может начинать полет из
любого города.
1. Постановка задачи
1.1. Формализовать описание задачи в математическом виде. Выделить
жесткие и мягкие ограничения.
1.2. Описать представление решения в виде хромосомы. Пояснить
выбранное представление и какие ограничения есть на хромосому.

3
1.3. Разработать метрику для оценки качества решения. Пояснить
разработанную метрику, и как она позволяет соблюдать мягкие и
жесткие ограничения.
2. Выполнение ГА
2.1. Выбрать операции для ГА: метод отбора, метод скрещивания,
метод мутации. Обосновать выбор.
2.2. Подобрать параметры ГА: размер популяции, вероятность
скрещивания и мутации, количество поколений (если есть другие
параметры, то и их тоже). Описать процесс подбора параметров.
2.3. Провести оптимизацию и визуализировать полученное решение.
Графически отобразить решение. Например, траектория броска
мяча или в виде таблицы показать расписание работы.
2.4. Построить график зависимости лучшей и средней
приспособленности в зависимости от поколения.
Выполнение работы.
1. Постановка задачи:
1.1. Формализовать описание задачи в математическом виде. Выделить
жесткие и мягкие ограничения.
Дано:
– число городов с координатами (
,
), , где .
– приоритет доставки, (чем больше
, тем выше приоритет).
– максимальная длина перелета.
Пусть:
– расстояние между городами и .

4
– порядковый номер посещения -го города.
Жесткие ограничения:
• Каждый город посещается один раз, и после последнего города
почтальон возвращается в начальную точку (замкнутый маршрут):
• Исключение подциклов (условие целостности маршрута):
• Города с более высоким приоритетом должны идти раньше в
маршруте:
Мягкие ограничения:
Так как перелеты длиннее, чем
нежелательны, то для каждого
перелета
, если
, к целевой функции будет добавляться штраф:
Целевая функция:
Минимизировать общее расстояние маршрута с учетом штрафа за
превышение длины перелета:

5
Где
– суммарное расстояние;
–
штраф за превышение длины перелета; – весовой коэффициент штрафа (
).
1.2. Описать представление решения в виде хромосомы. Пояснить
выбранное представление и какие ограничения есть на хромосому.
Хромосома – это перестановка городов, задающая порядок их посещения
в маршруте.
– хромосома, где
– индекс
города, посещаемого на -ом шаге.
Таким образом, – перестановка длины : , где
– множество
всех перестановок
.
Ограничения:
• Каждый город должен быть посещен ровно один раз:
• Соблюдение приоритетов доставки. Если
, то город с более
высоким приоритетом должен быть раньше в маршруте:
Это означает, что в хромосоме города отсортированы по
невозрастающему приоритету (группами приоритетов), внутри
которых возможна перестановка.
Хромосома представляется в виде перестановки индексов городов,
отражающей порядок их посещения. Это удобно для задач маршрутизации,
исключает повторения и пропуски, и позволяет легко учитывать приоритеты.

6
1.3. Разработать метрику для оценки качества решения. Пояснить
разработанную метрику, и как она позволяет соблюдать мягкие и
жесткие ограничения.
Для оценки качества маршрута будет использоваться метрика – обратная
целевой функции (чем меньше общий путь и меньше превышений, тем выше
значение ):
Жесткие ограничения реализуются на уровне представления хромосомы
и поддерживаются при скрещивании и мутациях. В метрике они не
нарушаются, так как недопустимые маршруты не создаются.
Мягкие ограничения входят в метрику в виде штрафа. Если расстояние
между двумя городами превышает допустимое значение, оно добавляет штраф
в знаменатель, тем самым понижая приспособленность решения.
2. Выполнение ГА:
2.1. Выбрать операции для ГА: метод отбора, метод скрещивания, метод
мутации. Обосновать выбор.
Метод отбора: турнирный отбор.
Выбран из-за своей простоты, эффективности и независимости от
масштабирования метрики. Он не требует нормализации значений
приспособленности, легко распараллеливается и позволяет гибко настраивать
интенсивность отбора. Также удобен для применения с модифицируемыми
метриками.
Метод скрещивания: упорядоченное скрещивание.

7
Используется для сохранения последовательностей близко
расположенных городов, что важно при оптимизации длины маршрута. Он
гарантирует получение корректных перестановок без повторений.
Метод мутации: инверсия.
Инвертирует случайный подотрезок хромосомы. Часто приводит к
значительному улучшению маршрута за счет сокращения общей длины. При
этом сохраняется допустимость маршрута.
2.2. Подобрать параметры ГА: размер популяции, вероятность
скрещивания и мутации, количество поколений (если есть другие
параметры, то и их тоже). Описать процесс подбора параметров.
Для подбора параметров был написан код. Сначала импортируются
библиотеки random, numpy и deap. Затем создаются координаты городов и
приоритеты доставки, определяются функции для расчета расстояний между
городами, оценки маршрута (с учетом штрафа за превышение допустимого
расстояния между пунктами) и выполнения самого алгоритма.
Функция compute_distance_matrix рассчитывает матрицу расстояний
между всеми парами городов по их координатам, eval_route вычисляет длину
маршрута с учетом штрафов за превышение допустимой длины перелета.
Используется как функция оценки, run_ga запускает генетический алгоритм с
заданными параметрами (скрещивание, мутация, штраф и др.), возвращает
лучшее найденное решение и его оценку.
Основная функция – это функция hyperparameter_search, которая
случайным образом перебирает наборы параметров: вероятность скрещивания
и мутации, коэффициент штрафа и размер турнира. Для каждого набора
параметров запускается алгоритм, и измеряется итоговая длина маршрута с

8
учетом штрафов. Результаты всех запусков сравниваются, и выбирается
лучший набор параметров, при котором маршрут оказался наиболее коротким.
Реализация представлена в Листинге 2.2.1. Результат представлен в Листинге
2.2.2.
Листинг 2.2.1 – Подбор параметров ГА
import random
from deap import base, creator, tools, algorithms
import numpy as np
def compute_distance_matrix(coords):
N = len(coords)
D = np.zeros((N, N))
for i in range(N):
for j in range(N):
D[i][j] = np.hypot(coords[i][0] - coords[j][0],
coords[i][1] - coords[j][1])
return D
def eval_route(individual, dist_matrix, Dmax=5.0,
penalty_coef=10.0):
total = 0
penalty = 0
for i in range(len(individual)):
a = individual[i]
b = individual[(i+1) % len(individual)]
d = dist_matrix[a][b]
total += d
if d > Dmax:
penalty += (d - Dmax)
return total + penalty_coef * penalty,
def run_ga(coords, priorities, cxpb, mutpb, penalty_coef,
tour_size, ngen=100, pop_size=200):
dist_matrix = compute_distance_matrix(coords)
N = len(coords)
if not hasattr(creator, 'FitnessMin'):
creator.create("FitnessMin", base.Fitness, weights=(-
1.0,))
if not hasattr(creator, 'Individual'):
creator.create("Individual", list,
fitness=creator.FitnessMin)

9
toolbox = base.Toolbox()
toolbox.register("indices", random.sample, range(N), N)
toolbox.register("individual", tools.initIterate,
creator.Individual, toolbox.indices)
toolbox.register("population", tools.initRepeat, list,
toolbox.individual)
toolbox.register("evaluate", eval_route,
dist_matrix=dist_matrix, penalty_coef=penalty_coef)
toolbox.register("mate", tools.cxOrdered)
toolbox.register("mutate", tools.mutShuffleIndexes,
indpb=0.2)
toolbox.register("select", tools.selTournament,
tournsize=tour_size)
pop = toolbox.population(n=pop_size)
algorithms.eaSimple(pop, toolbox, cxpb=cxpb, mutpb=mutpb,
ngen=ngen, verbose=False)
best = tools.selBest(pop, 1)[0]
return best, best.fitness.values[0]
def hyperparameter_search(coords, priorities, trials):
best_score = float("inf")
best_params = None
for i in range(trials):
params = {
"cxpb": round(random.uniform(0.5, 1.0), 2),
"mutpb": round(random.uniform(0.01, 0.5), 2),
"penalty_coef": round(random.uniform(5.0, 30.0),
1),
"tour_size": random.randint(2, 8)
}
try:
best, score = run_ga(coords, priorities,
cxpb=params["cxpb"],
mutpb=params["mutpb"],
penalty_coef=params["penalty_coef"],
tour_size=params["tour_size"])
if score < best_score:
best_score = score
best_params = params
except Exception:
pass
print(f"Оценка: {best_score:.2f}")
print(f"Параметры: {best_params}")
return best_params

10
N = 30
coords = [(random.uniform(0, 30), random.uniform(0, 30)) for _
in range(N)]
priorities = [random.randint(1, 5) for _ in range(N)]
best_params = hyperparameter_search(coords, priorities, 30)
Листинг 2.2.2 – Лучшие параметры для ГА
Оценка: 249.15
Параметры: {'cxpb': 0.63, 'mutpb': 0.22, 'penalty_coef': 4.4,
'tour_size': 4}
Выполнилось 30 запусков алгоритма с различными комбинациями
параметров, случайно сгенерированными в допустимых диапазонах. Для
каждого набора оценивалось качество финального решения. Лучшие
параметры выбирались на основе минимального значения целевой функции.
Исходя из этого, были подобраны следующие параметры: вероятность
скрещивания – 0.63, вероятность мутации – 0.22, коэффициент штрафа – 4.4,
размер турнира – 4. Количество поколений всегда равнялось 200
(эмпирическое наблюдение), а размер популяции всегда 100 (эмпирическое
наблюдение).
2.3. Провести оптимизацию и визуализировать полученное решение.
Графически отобразить решение. Например, траектория броска мяча
или в виде таблицы показать расписание работы.
Сначала импортируется библиотека matplotlib.pyplot для визуализации
графика. Затем для 30 городов генерируются случайные координаты и
приоритеты городов, запускается генетический алгоритм и возвращается
наилучшее найденное решение. Функция GA создает популяцию случайных
маршрутов (перестановок городов), применяет к ним операции скрещивания,
мутации и отбора, возвращает лучший найденный маршрут и его длину с
Соседние файлы в папке Лабы по ОМО 2025
