Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы по ОМО 2025 / Baraeva_Elizaveta_lb5

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
511 Кб
Скачать
☆
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по дисциплине «Основы машинного обучения»
Тема: Генетические алгоритмы
Студентка гр. 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