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