gwyrwch / travelling-salesman

1 stars 0 forks source link

Курсовая работа


Отчет в формате pdf

Тема: Фреймворк для решения оптимизационных задач на примере задачи коммивояжера

Цель проекта:

Используемые технологии:

Возможности фреймворка:

Возможность сравнивать различные решения для NP-полных задач, а также возможность сравнения некоторого собственного(возможно) решения с уже существующими. Возможность отслеживания динамики для собственного решения (было оно ухудшено или улучшено), то есть сравнение с предыдущими.

Описание проекта


Все классы решений и оптимизаций находятся в папке algo/.

В рамках данного проекта были реализованы следующие методы решения:

Также были реализованы следующие потимизаторы:

В папке datasets/ содержится некоторый набор тестов, которые имеют определенный формат для работы с фреймворком.

Фотмат теста:

NAME : test name
COMMENT : additional info about test
TYPE : TSP
DIMENSION : vertext amount (type: int)
EDGE_WEIGHT_TYPE : one from EUC_2D / GEO / ATT / EXPLICIT / CEIL_2D
EDGE_WEIGHT_FORMAT: FULL_MATRIX/UPPER_DIAG_ROW/LOWER_DIAG_ROW/UPPER_ROW (only if matrix is given: EXPLICIT)
NODE_COORD_SECTION/EDGE_WEIGHT_SECTION
...here coords or matrix..

В зависимости от того, какой EDGE_WEIGHT_TYPE выбран в тесте, будет выбрана соответсвующая функция для вычисления расстояния между вершинами (если не была дана матрица, т.е. EXPLICIT). Более подробно о том, как вычисляется расстояние можно найти здесь (стр.6). В проекте реализация данных функций находится в файле algo/Distance.cpp

Ипользование

Для того, чтобы можно было удобно передавать парметры в командную строку для запуска была использована сторонняя библиотека cxxopts. Описание того, как можно ее внедрить в свой проект и как ее правильно использовать можно найти здесь. У фреймворка есть несколько параметров, которые необходимо передать для корректной работы:

Параметр Возможные значения Описание
--mode run-solution, list-optimizers, list-solutions режимы фреймворка
--solution-name NaiveSolution, NearestNeighbour, MinimumSpanningTree, BranchAndBound, GeneticAlgorithm название решения
--solution-deadline 1000 дедлайн для решения в миллисекундах, default = 3000. для решений с отсечением по времени
--multi если указан, то решение будет работать в многопоточном режиме
--thread-count 8 количество потоков для многопоточного режима, default = 4
--testname a280, att48, ali535  и т.д из папки datasets/ название теста
--optimizer-name LocalSearch, SimulatedAnnealing название оптимизатора
--optimizer-deadline 3000 дедлайн для оптимизатора в миллисекундах, default = 3000
--comment комментарий к решению
--save-convergence для метода отжига и генетического метода возможность отслеживать сходимость метода

Пример запуска может выглядеть, например, так:

./tsp --mode run-solution --solution-name GeneticAlgorithm --test-name st70 --optimizer-name SimulatedAnnealing --optimizer-deadline 10000

Каждое решение записывается в файл с названием имеющим формат: <testname>_<solution_name>_<version>.tour и сохраняются в папку results/.
Инкремент версии происходит для каждого решения с каждым его запуском. Формат файла, содержащего решение:

NAME : test name
TYPE: TOUR
DIMENSION : vertext amount (type: int)
WEIGHT: best cost found by solution
TOUR_SECTION
...here vertex indices..

Сходимость методов

Сходимость генетического метода для некоторых тестов

Сходимость метода отжига для некоторых тестов

Сравнение решений

В проекте содержится файл research.ipynb в котором можно построить оптимальный ответ и найденный с использованием фреймворка на одном графике. Ниже расположены некоторые оптимальные маршруты и решения.

Также сравнительная таблица, где можно посмотреть на каком тесте какое решение с каким оптимизатором(или без) работает лучше.

alt text