Эволюционные алгоритмы поиска эйлерова цикла в графе — различия между версиями
Строка 1: | Строка 1: | ||
=== Постановка задачи === | === Постановка задачи === | ||
{{Определение | {{Определение | ||
− | |definition='''Эйлеров цикл в графе''' — это путь, проходящий по всем рёбрам графа ровно по одному разу | + | |definition='''Эйлеров цикл в графе''' — это путь, проходящий по всем рёбрам графа ровно по одному разу. |
}} | }} | ||
+ | Задача — для заданного графа найти такой путь. Заметим, что это возможно тогда и только тогда, когда граф связный и степень каждой его вершины четна. | ||
=== Предыдущие результаты === | === Предыдущие результаты === | ||
Строка 15: | Строка 16: | ||
Основная мысль — изменить структуру хранения графа. Ниже будет показан алгоритм, работающий за <tex>O(m*log(m))</tex> (ранее лучшим считался результат <tex>O(m^2*log(m))</tex> ) | Основная мысль — изменить структуру хранения графа. Ниже будет показан алгоритм, работающий за <tex>O(m*log(m))</tex> (ранее лучшим считался результат <tex>O(m^2*log(m))</tex> ) | ||
==== Представление графа ==== | ==== Представление графа ==== | ||
+ | Пусть <tex>G</tex> — неориентированный связный граф, <tex>V</tex> — множество его вершин, <tex>E</tex> — ребер. Будем хранить ребра в виде списков связности. Пусть <tex>L_v</tex> — множество вершин, соединенных с <tex>v</tex> ребром, <tex>L</tex> — множество всех <tex>L_v</tex>. Для каждой вершины <tex>v</tex> введем также множество <tex>M_v</tex>, хранящее в себе неупорядоченные пары вершин из <tex>L_v</tex>. Обозначим через <tex>M</tex> множество всех <tex>M_v</tex> | ||
==== Фитнес функция ==== | ==== Фитнес функция ==== | ||
==== Операция мутации ==== | ==== Операция мутации ==== |
Версия 21:23, 17 июня 2012
Содержание
Постановка задачи
Определение: |
Эйлеров цикл в графе — это путь, проходящий по всем рёбрам графа ровно по одному разу. |
Задача — для заданного графа найти такой путь. Заметим, что это возможно тогда и только тогда, когда граф связный и степень каждой его вершины четна.
Предыдущие результаты
Перестановка ребер
Пусть для графа
задан набор всех его ребер . На каждом шаге два случайно выбранных ребра меняются местами. Фитнес-функция — длина максимального пути в множестве ребер. Алгорим работает за экспоненциальное от количества ребер время.Jump-оператор
Jump-оператор работает следующим образом. Для набора ребер
оператор передвигает -й элемент на позицию и циклически сдвигает ребра между позициями и влево (если то вправо) . Таким образом набор превратиться в . Работает за , где — количество ребер в графе.Улучшенный jump-оператор
Лучших результатов можно достичь, если использовать только операции вида
. Тогда время работы будет .Алгоритм
Идея
Основная мысль — изменить структуру хранения графа. Ниже будет показан алгоритм, работающий за
(ранее лучшим считался результат )Представление графа
Пусть
— неориентированный связный граф, — множество его вершин, — ребер. Будем хранить ребра в виде списков связности. Пусть — множество вершин, соединенных с ребром, — множество всех . Для каждой вершины введем также множество , хранящее в себе неупорядоченные пары вершин из . Обозначим через множество всех