Эволюционные алгоритмы поиска эйлерова цикла в графе — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 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

Постановка задачи

Определение:
Эйлеров цикл в графе — это путь, проходящий по всем рёбрам графа ровно по одному разу.

Задача — для заданного графа найти такой путь. Заметим, что это возможно тогда и только тогда, когда граф связный и степень каждой его вершины четна.

Предыдущие результаты

Перестановка ребер

Пусть для графа [math]G[/math] задан набор всех его ребер [math](e_1, e_2, \dots e_m)[/math]. На каждом шаге два случайно выбранных ребра меняются местами. Фитнес-функция — длина максимального пути в множестве ребер. Алгорим работает за экспоненциальное от количества ребер время.

Jump-оператор

Jump-оператор работает следующим образом. Для набора ребер [math](e_1, e_2, \dots e_m)[/math] оператор [math]jump(i,j)[/math] передвигает [math]i[/math]-й элемент на позицию [math]j[/math] и циклически сдвигает ребра между позициями [math]i[/math] и [math]j[/math] влево (если [math]i \gt j[/math] то вправо) . Таким образом набор [math](e_1, e_2, \dots e_m)[/math] превратиться в [math](e_1, e_2, \dots e_{i-1}, e_{i+1}, \dots e_j, e_i, e_{j+1}, \dots e_m)[/math]. Работает за [math]O(m^5)[/math], где [math]m[/math] — количество ребер в графе.

Улучшенный jump-оператор

Лучших результатов можно достичь, если использовать только операции вида [math]jump(i, 1)[/math]. Тогда время работы будет [math]O(m^5)[/math].

Алгоритм

Идея

Основная мысль — изменить структуру хранения графа. Ниже будет показан алгоритм, работающий за [math]O(m*log(m))[/math] (ранее лучшим считался результат [math]O(m^2*log(m))[/math] )

Представление графа

Пусть [math]G[/math] — неориентированный связный граф, [math]V[/math] — множество его вершин, [math]E[/math] — ребер. Будем хранить ребра в виде списков связности. Пусть [math]L_v[/math] — множество вершин, соединенных с [math]v[/math] ребром, [math]L[/math] — множество всех [math]L_v[/math]. Для каждой вершины [math]v[/math] введем также множество [math]M_v[/math], хранящее в себе неупорядоченные пары вершин из [math]L_v[/math]. Обозначим через [math]M[/math] множество всех [math]M_v[/math]

Фитнес функция

Операция мутации

Выбор вершин для мутации

Литература