Эволюционные алгоритмы поиска эйлерова цикла в графе
Содержание
Постановка задачи
| Определение: |
| Эйлеров цикл в графе — это путь, проходящий по всем рёбрам графа ровно по одному разу. |
Задача — для заданного графа найти такой путь. Заметим, что это возможно тогда и только тогда, когда граф связный и степень каждой его вершины четна.
Предыдущие результаты
Перестановка ребер
Пусть для графа задан набор всех его ребер . На каждом шаге два случайно выбранных ребра меняются местами. Фитнес функция — длина максимального пути в множестве ребер. Алгорим работает за экспоненциальное от количества ребер время.
Jump-оператор
Jump-оператор работает следующим образом. Для набора ребер оператор передвигает -й элемент на позицию и циклически сдвигает ребра между позициями и влево (если то вправо) . Таким образом набор превратиться в . Работает за , где — количество ребер в графе.
Улучшенный jump-оператор
Лучших результатов можно достичь, если использовать только операции вида . Тогда время работы будет .
Алгоритм
Идея
Основная мысль — изменить структуру хранения графа. Ниже будет показан алгоритм, работающий за (ранее лучшим считался результат )
Представление графа
Пусть — неориентированный связный граф, — множество его вершин, — ребер. Будем хранить ребра в виде списков связности. Пусть — множество вершин, соединенных с ребром, — множество всех . Для каждой вершины введем также множество , хранящее в себе неупорядоченные пары вершин из . Обозначим через множество всех . Таким образом если для всех вершин вершины из разбиты на пары в , то с точностью до первого ребра на задан порядок обхода: пара в означает, что придя из далее нужно идти в (или наоборот).
Фитнес функция
Фитнес функция для эволюционные алгоритмы поиска эйлерова цикла в графе выглядит так: , где
— количество ребер в графе; — размер множества ; — количество путей в