Эволюционные алгоритмы поиска эйлерова цикла в графе — различия между версиями
(→Фитнес функция) |
|||
Строка 19: | Строка 19: | ||
==== Фитнес функция ==== | ==== Фитнес функция ==== | ||
Фитнес функция для эволюционные алгоритмы поиска эйлерова цикла в графе выглядит так: <tex>f(M) = m - |M| + k</tex>, где | Фитнес функция для эволюционные алгоритмы поиска эйлерова цикла в графе выглядит так: <tex>f(M) = m - |M| + k</tex>, где | ||
− | <tex>m</tex> — количество ребер в графе; | + | #<tex>m</tex> — количество ребер в графе; |
− | <tex>|M|</tex> — размер множества <tex>M</tex>; | + | #<tex>|M|</tex> — размер множества <tex>M</tex>; |
− | <tex>k</tex> — количество путей в <tex>M</tex> | + | #<tex>k</tex> — количество путей в <tex>M</tex> |
− | |||
==== Операция мутации ==== | ==== Операция мутации ==== | ||
+ | Операция мутации вводится для двух вершин <tex>u</tex> и <tex>w</tex> из <tex>L_v</tex>. Как их выбрать описано в следующем разделе. Происходит он так: | ||
+ | * если <tex>u=w</tex>, то ничего не делаем; | ||
+ | * если для <tex>u</tex> и для <tex>w</tex> нет пары, то добавляем к <tex>M_v</tex> пару <tex>(u,w)</tex>; | ||
+ | * если <tex>u</tex> и <tex>v</tex> уже содержатся в <tex>M_v</tex> как пара, то удалим ее; | ||
+ | * если <tex>u</tex> в паре с некоторой если вершиной <tex>p</tex, а <tex>w</tex> без пары, то удалим <tex>(u,p)</tex> из <tex>M_v</tex> и добавим <tex>(u,w)</tex>; | ||
+ | * если <tex>w</tex> в паре с некоторой если вершиной <tex>p</tex, а <tex>u</tex> без пары, то удалим <tex>(w,p)</tex> из <tex>M_v</tex> и добавим <tex>(u,w)</tex>; | ||
+ | * если <tex>u</tex> в паре с некоторой если вершиной <tex>p</tex, а <tex>w</tex> в паре с некоторой <tex>k</tex>, то удалим <tex>(u,p)</tex> и <tex>(w,k)</tex> из если <tex>M_v</tex> и добавим <tex>(u,w)</tex> и <tex>(p,k)</tex>; | ||
+ | Если после операции мутации фитнес функция уменьшилась, то операцию не применяют. | ||
==== Выбор вершин для мутации ==== | ==== Выбор вершин для мутации ==== | ||
===Литература=== | ===Литература=== | ||
* [http://rain.ifmo.ru/~tsarev/teaching/ea-2012/lectures/p1203-doerr.pdf Doerr B., Johannsen D. Adjacency List Matchings - An Ideal Genotype for Cycle Covers] | * [http://rain.ifmo.ru/~tsarev/teaching/ea-2012/lectures/p1203-doerr.pdf Doerr B., Johannsen D. Adjacency List Matchings - An Ideal Genotype for Cycle Covers] |
Версия 21:53, 17 июня 2012
Содержание
Постановка задачи
Определение: |
Эйлеров цикл в графе — это путь, проходящий по всем рёбрам графа ровно по одному разу. |
Задача — для заданного графа найти такой путь. Заметим, что это возможно тогда и только тогда, когда граф связный и степень каждой его вершины четна.
Предыдущие результаты
Перестановка ребер
Пусть для графа
задан набор всех его ребер . На каждом шаге два случайно выбранных ребра меняются местами. Фитнес функция — длина максимального пути в множестве ребер. Алгорим работает за экспоненциальное от количества ребер время.Jump-оператор
Jump-оператор работает следующим образом. Для набора ребер
оператор передвигает -й элемент на позицию и циклически сдвигает ребра между позициями и влево (если то вправо) . Таким образом набор превратиться в . Работает за , где — количество ребер в графе.Улучшенный jump-оператор
Лучших результатов можно достичь, если использовать только операции вида
. Тогда время работы будет .Алгоритм
Идея
Основная мысль — изменить структуру хранения графа. Ниже будет показан алгоритм, работающий за
(ранее лучшим считался результат )Представление графа
Пусть
— неориентированный связный граф, — множество его вершин, — ребер. Будем хранить ребра в виде списков связности. Пусть — множество вершин, соединенных с ребром, — множество всех . Для каждой вершины введем также множество , хранящее в себе неупорядоченные пары вершин из . Обозначим через множество всех . Таким образом если для всех вершин вершины из разбиты на пары в , то с точностью до первого ребра на задан порядок обхода: пара в означает, что придя из далее нужно идти в (или наоборот).Фитнес функция
Фитнес функция для эволюционные алгоритмы поиска эйлерова цикла в графе выглядит так:
, где- — количество ребер в графе;
- — размер множества ;
- — количество путей в
Операция мутации
Операция мутации вводится для двух вершин
и из . Как их выбрать описано в следующем разделе. Происходит он так:- если , то ничего не делаем;
- если для и для нет пары, то добавляем к пару ;
- если и уже содержатся в как пара, то удалим ее;
- если в паре с некоторой если вершиной без пары, то удалим из и добавим ;
- если в паре с некоторой если вершиной без пары, то удалим из и добавим ;
- если в паре с некоторой если вершиной в паре с некоторой , то удалим и из если и добавим и ;
Если после операции мутации фитнес функция уменьшилась, то операцию не применяют.