Эволюционные алгоритмы поиска эйлерова цикла в графе — различия между версиями
Строка 16: | Строка 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>. Таким образом если для всех вершин <tex>v</tex> вершины из <tex>L_v</tex> разбиты на пары в <tex>M_v</tex>, то с точностью до первого ребра на <tex>G</tex> задан порядок обхода: пара <tex>(u,w)</tex> в <tex>L_v</tex> означает, что придя из <tex>u</tex> далее нужно идти в <tex>w</tex> (или наоборот). | + | Пусть <tex>G</tex> — неориентированный связный граф, <tex>V</tex> — множество его вершин, <tex>E</tex> — ребер; всего вершин <tex>n</tex>, а ребер <tex>m</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>. Таким образом если для всех вершин <tex>v</tex> вершины из <tex>L_v</tex> разбиты на пары в <tex>M_v</tex>, то с точностью до первого ребра на <tex>G</tex> задан порядок обхода: пара <tex>(u,w)</tex> в <tex>L_v</tex> означает, что придя из <tex>u</tex> далее нужно идти в <tex>w</tex> (или наоборот). |
==== Фитнес функция ==== | ==== Фитнес функция ==== | ||
Фитнес функция для эволюционные алгоритмы поиска эйлерова цикла в графе выглядит так: <tex>f(M) = m - |M| + k</tex>, где | Фитнес функция для эволюционные алгоритмы поиска эйлерова цикла в графе выглядит так: <tex>f(M) = m - |M| + k</tex>, где | ||
Строка 32: | Строка 32: | ||
Если после операции мутации фитнес функция уменьшилась, то операцию не применяют. | Если после операции мутации фитнес функция уменьшилась, то операцию не применяют. | ||
==== Выбор вершин для мутации ==== | ==== Выбор вершин для мутации ==== | ||
− | Напомним, что <tex>d(v)</tex> — степень вершины <tex>v</tex> (количество ребер, которые из нее выходят). Пусть <tex>d(G)</tex> — средняя степень среди вершин <tex>G</tex>, <tex>\Delta G</tex> — максимальная степень среди вершин <tex>G</tex>, а <tex>\delta d(G) = \frac{1} {2m} \sum_{v \in V}d(v)^2</tex> | + | Напомним, что <tex>d(v)</tex> — степень вершины <tex>v</tex> (количество ребер, которые из нее выходят). Пусть <tex>d(G)</tex> — средняя степень среди вершин <tex>G</tex>, <tex>\Delta G</tex> — максимальная степень среди вершин <tex>G</tex>, а <tex>\delta d(G) = \frac{1} {2m} \sum_{v \in V}d(v)^2</tex>. |
+ | Есть три способа выбрать две вершины для мутации. | ||
+ | |||
+ | '''Ориентированный на вершины''' | ||
+ | |||
+ | Сначала выбираем случайно <tex>v</tex> из <tex>V</tex>. Затем случайно и независимо выбираем <tex>u</tex> и <tex>w</tex> из <tex>L_v</tex>. Вероятность <tex>p</tex> выбрать пару <tex>(u,w)</tex> в <tex>L_v</tex> удовлетворяет соотношению: | ||
+ | |||
+ | <tex>p = \frac{1} {d(v)^2n} = \frac{d(G)} {2d(v)^2m} \ge \frac{d(G)} {2 \Delta (G)^2m}</tex> | ||
+ | |||
+ | '''Ориентированный на ребра''' | ||
+ | |||
+ | Выбираем случайно вершину <tex>u</tex> из всех <tex>2m</tex> вершин во всех списках <tex>L</tex>. Пусть она оказалась в <tex>L_v</tex>. Далее случайно выбираем <tex>w</tex> из <tex>L_v</tex>. Вероятность <tex>p</tex> выбрать пару <tex>(u,w)</tex> в <tex>L_v</tex> удовлетворяет соотношению: | ||
+ | |||
+ | <tex>p = \frac{1} {2d(v)m} \ge \frac{1} {2 \Delta (G)m}</tex> | ||
+ | |||
+ | '''Ориентированный на пары вершин''' | ||
+ | |||
+ | Выбираем случайно пару <tex>(u,w)</tex> из всех пар для всех <tex>2m</tex> вершин во всех списках <tex>L</tex> вершин во всех списках <tex>L</tex>. Пусть обе вершины присутствуют в <tex>L_v</tex>. Тогда вероятность <tex>p</tex> выбрать пару <tex>(u,w)</tex> в <tex>L_v</tex> удовлетворяет соотношению: | ||
+ | |||
+ | <tex>p = \frac{1} {2\delta d(G)m} | ||
===Литература=== | ===Литература=== | ||
* [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] |
Версия 22:36, 17 июня 2012
Содержание
Постановка задачи
Определение: |
Эйлеров цикл в графе — это путь, проходящий по всем рёбрам графа ровно по одному разу. |
Задача — для заданного графа найти такой путь. Заметим, что это возможно тогда и только тогда, когда граф связный и степень каждой его вершины четна.
Предыдущие результаты
Перестановка ребер
Пусть для графа
задан набор всех его ребер . На каждом шаге два случайно выбранных ребра меняются местами. Фитнес функция — длина максимального пути в множестве ребер. Алгорим работает за экспоненциальное от количества ребер время.Jump-оператор
Jump-оператор работает следующим образом. Для набора ребер
оператор передвигает -й элемент на позицию и циклически сдвигает ребра между позициями и влево (если то вправо) . Таким образом набор превратиться в . Работает за , где — количество ребер в графе.Улучшенный jump-оператор
Лучших результатов можно достичь, если использовать только операции вида
. Тогда время работы будет .Алгоритм
Идея
Основная мысль — изменить структуру хранения графа. Ниже будет показан алгоритм, работающий за
(ранее лучшим считался результат )Представление графа
Пусть
— неориентированный связный граф, — множество его вершин, — ребер; всего вершин , а ребер . Будем хранить ребра в виде списков связности. Пусть — множество вершин, соединенных с ребром, — множество всех . Для каждой вершины введем также множество , хранящее в себе неупорядоченные пары вершин из . Обозначим через множество всех . Таким образом если для всех вершин вершины из разбиты на пары в , то с точностью до первого ребра на задан порядок обхода: пара в означает, что придя из далее нужно идти в (или наоборот).Фитнес функция
Фитнес функция для эволюционные алгоритмы поиска эйлерова цикла в графе выглядит так:
, где — количество ребер в графе; — размер множества ; — количество путей в .Операция мутации
Операция мутации вводится для двух вершин
и из . Как их выбрать описано в следующем разделе. Происходит она так:- если , то ничего не делаем;
- если для и для нет пары, то добавляем к пару ;
- если и уже содержатся в как пара, то удалим ее;
- если в паре с некоторой если вершиной , а без пары, то удалим из и добавим ;
- если в паре с некоторой если вершиной , а без пары, то удалим из и добавим ;
- если в паре с некоторой если вершиной , а в паре с некоторой , то удалим и из если и добавим и ;
Если после операции мутации фитнес функция уменьшилась, то операцию не применяют.
Выбор вершин для мутации
Напомним, что
— степень вершины (количество ребер, которые из нее выходят). Пусть — средняя степень среди вершин , — максимальная степень среди вершин , а . Есть три способа выбрать две вершины для мутации.Ориентированный на вершины
Сначала выбираем случайно
из . Затем случайно и независимо выбираем и из . Вероятность выбрать пару в удовлетворяет соотношению:
Ориентированный на ребра
Выбираем случайно вершину
из всех вершин во всех списках . Пусть она оказалась в . Далее случайно выбираем из . Вероятность выбрать пару в удовлетворяет соотношению:
Ориентированный на пары вершин
Выбираем случайно пару
из всех пар для всех вершин во всех списках вершин во всех списках . Пусть обе вершины присутствуют в . Тогда вероятность выбрать пару в удовлетворяет соотношению:<tex>p = \frac{1} {2\delta d(G)m}