- •Постановка задачи:
- •Формализовать описание задачи в математическом виде. Выделить жесткие и мягкие ограничения.
- •Описать представление решения в виде хромосомы. Пояснить выбранное представление и какие ограничения есть на хромосому.
- •Разработать метрику для оценки качества решения. Пояснить разработанную метрику, и как она позволяет соблюдать мягкие и жесткие ограничения.
- •Выполнение га:
- •Выбрать операции для га: метод отбора, метод скрещивания, метод мутации. Обосновать выбор.
- •Подобрать параметры га: размер популяции, вероятность скрещивания и мутации, количество поколений (если есть другие параметры, то и их тоже). Описать процесс подбора параметров.
- •Провести оптимизацию и визуализировать полученное решение. Графически отобразить решение. Например, траектория броска мяча или в виде таблицы показать расписание работы.
- •Построить график зависимости лучшей и средней приспособленности в зависимости от поколения.
Построить график зависимости лучшей и средней приспособленности в зависимости от поколения.
Сначала из логов алгоритма извлекаются данные о поколениях, среднем и минимальном значениях функции приспособленности. Затем строится график, где отображается, как изменялась средняя и лучшая приспособленность от поколения к поколению. Это позволяет наглядно проследить, как алгоритм улучшал решения в процессе эволюции. Реализация представлена в Листинге 2.4.1. Результат представлен на Рисунке 2.4.2.
Листинг 2.4.1 – Построение графика приспособленности
def plot_fitness_stats(log): gen = [entry["gen"] for entry in log] avg = [entry["avg"] for entry in log] min_ = [entry["min"] for entry in log]
plt.figure(figsize=(10, 6)) plt.plot(gen, avg, label="Средняя приспособленность", color="blue") plt.plot(gen, min_, label="Лучшая приспособленность", color="green") plt.xlabel("Поколение") plt.ylabel("Значение функции приспособленности") plt.title("Эволюция приспособленности") plt.legend() plt.grid(True) plt.tight_layout() plt.show()
plot_fitness_stats(log) |
Рисунок 2.4.2 – График приспособленности
Как можно заметить, у начального поколения (0-25) идет резкое снижение значений функции. Это означает, что генетический алгоритм быстро находит хорошие начальные решения, улучшая маршрут и снижая число длинных перелетов. У среднего поколения (25–75) улучшения становятся более плавными. Алгоритм находит все более оптимальные маршруты, но прирост качества замедляется. У позднего поколения (после ~75) зеленая линия (лучшее решение) стабилизируется – достигается локальный минимум, который сохраняется до конца. Синяя линия (среднее по популяции) продолжает колебаться, что говорит о сохраняющемся разнообразии в популяции.
Вывод.
В ходе лабораторной работы была изучена и реализована методика решения задачи оптимизации маршрута доставки с помощью генетического алгоритма. Были сформированы входные данные (координаты городов и приоритеты доставки), построена функция оценки, учитывающая как длину маршрута, так и штрафы за превышение допустимого расстояния между городами.
На основе генетического алгоритма были подобраны параметры (вероятность скрещивания, мутации, размер популяции, количество поколений), обеспечивающие стабильное нахождение хороших решений. Были выбраны подходящие операции: турнирный отбор, упорядоченное скрещивание и инверсионная мутация, которые позволяют корректно обрабатывать перестановочные хромосомы.
Полученное оптимальное решение было визуализировано и был построен график приспособленности, что позволило оценить качество маршрута и соблюдение ограничений.
