Автор: Пользователь скрыл имя, 03 Ноября 2012 в 16:36, контрольная работа
В течение последних десятилетий были достигнуты большие успехи в конструировании и анализе комбинаторных алгоритмов. С одной стороны, было обнаружено много новых, более эффективных методов решения комбинаторных задач с помощью ЭВМ, с другой — получены теоретические результаты, свидетельствующие все более явно о том, что для широкого класса проблем не существует «достаточно эффективных» алгоритмов.
Введение…………………………………………………………… 3
Основные понятия………………………………………………… 4
Алгоритм поиска гамильтонова пути в графе…………………… 8
Заключение………………………………………………………… 11
Список использованной литературы…………………………….. 12
Введение…………………………………………………………
Основные понятия……………………………………
Алгоритм поиска гамильтонова пути в графе…………………… 8
Заключение……………………………………………………
Список использованной литературы…………………………….. 12
В течение
последних десятилетий были
В настоящей работе
Первый, самый большой пункт данной
работы содержит изложение
Во втором пункте представлен
алгоритм поиска гамильтонова пути в
графе, а затем примеры, иллюстрированные
рисунками и объяснением
В этом разделе приводятся
основные определения и
Начнем с
логических и теоретико-
Последовательность длины n, члены которой суть a1, . . . , an, будем обозначать через ( a1, . . . , an), либо просто через a1, . . . , an. Последовательность (a, b) длины два будем называть упорядоченной парой. Декартово произведение A´B множеств A и B определяется как множество всевозможных пар (a, b), где aÎ A, bÎ B. Под бинарным отношением (с левой областью A и правой областью B) подразумевается произвольное подмножество RÍ A´ B. Если A = B, то будем говорить о бинарном отношении на множестве A. Вместо (a, b)Î R часто пишут aRb.
По поводу отношения R на множестве X говорят, что оно:
• (а) рефлексивно, если xRx для каждого xÎ X,
• (б) транзитивно, если (xRy Ù yRz) Þ xRz для произвольных x, y, z Î X,
• (в) симметрично, если xRy Þ yRx для произвольных x, yÎ X,
• (г) антисимметрично, если (xRy Ù yRx) Þ x = y для произвольных x, y Î X.
Произвольное
бинарное отношение,
x ³ y для y £ x, x < y для x £ y Ù x¹ y и т.д. Примером частично упорядоченного множества может служить множество целых чисел с отношением делимости, множество целых (или вещественных) чисел с
обычным отношением меньше или равно «£», а также множество r(X) с отношением включения Í.
Если функция (отображение) f сопоставляет каждому элементу x Î X элемент f(x) Î Y , то будем писать f : X → Y (такая функция может трактоваться как отношение R Í X ´ Y с тем свойством, что для каждого
x Î X существует в R точно одна пара вида (x, y), y Î Y , для наших же целей достаточно, однако, интуитивного понятия функции). Для произвольных
AÎX, BÎ Y определим
f(A) = {y Î Y : существует такое x Î A, что y = f(x)}
f−1(B) = {x Î X : f(x) Î B}
(вместо f−1({b}) будем просто писать f−1(b)).
Если f(X) = Y , то будем говорить о функции из X на Y . Функция
f : X → Y называется обратимой (взаимно однозначной), если для произвольных a, b Î X верно что a ¹ b Þ f(a) ¹ f(b).
Мы часто
будем использовать понятие
Ориентированным графом (или орграфом) будем называть такую произвольную пару G =(V,E), что EÎ V´ V и в обоих случаях множества V и E будем называть
соответственно множеством вершин и множеством ребер графа G.
Граф обычно
изображается на плоскости в
виде множества точек,
Рис 1.1: а) неориентированный граф; б) ориентированный граф.
В контексте определенного графа G = (V,E) будем часто использовать обозначения u - v, u → v вместо {u, v} Î E и (u, v)Î E соответственно. Если ребро e имеет вид {u, v} или (u, v), то будем говорить, что ребро e инцидентно вершинам u и v, в то время как вершины u и v смежны между собой. Степень вершины определим как число ребер, инцидентных ей. Для вершин орграфа определяются полустепени захода (число заходящих в вершину дуг) и исхода (число выходящих дуг). Степень вершины определяется как сумма полустепеней захода и исхода. Вершину нулевой степени будем называть изолированной (например, вершина v5 на рис.1.1, а)). Путем в графе G = (V,E) назовем последовательность вершин v0, v1, . . . , vn, такую, что k ≥ 0 и vi - vi+1 (или vi →vi +1, если граф G — ориентированный), i = 0, . . . , k - 1. Вершины v0 и vk будем называть соответственно началом и концом пути, а число k — длиной пути. Путь, начало и конец которого совпадают, будем называть циклом. Если все вершины пути v1, . . . , vk различны, то будем говорить об элементарном пути. Соответственно цикл v1, . . . , vk (v1 = vk) будем называть элементарным, если вершины v1, . . . , vk различны. Подграфом графа G = (V,E) будем называть такой произвольный граф G¢ = (V¢,E¢), что V¢Í V и E¢Í E.
Пусть G = (V,E) — произвольный неориентированный граф, и пусть
vÎ V. Пусть A — множество тех вершин u Î V , к которым существует путь из v. Множество A вместе с ребрами графа G, инцидентными вершинам из A, определяет некоторый подграф, называемый компонентой связности графа G. Очевидно, что множества вершин компонент связности произвольного графа попарно не пересекаются. Например, для графа на рис.1.1, а это суть множества V1 = {v1, v2, v3, v4, v6}, V2 = {v5} и V3 = {v7, v8, v9, v10, v11, v12}.
Будем говорить, что графы G = (V,E), G¢ = (V¢,E¢) изоморфны, если существует такое взаимно однозначное отображение f из V на V¢, что для произвольных u, v Î V имеем
{u, v}Î E Û {f(u), f(v)} Î E¢ ((u, v) Î E Û (f(u), f(v)) Î Е¢
в случае ориентированных графов. Обычно изоморфные графы не различаются между собой.
Для произвольного
Перейдем теперь к понятиям, связанным
с алгоритмами. Алгоритмы
Рассмотрим теперь задачу, где нас будет интересовать путь, проходящий в точности один раз через каждую вершину (а не каждое ребро) данного графа. Вспомним, что путь с указанным свойством называется гамильтоновым путем (гамильтонов цикл определяется очевидным образом). Пример гамильтонова пути в графе и графа, в котором такого пути не существует, показан на рис. 1.2.
Рис 1.2: а) Гамильтонов путь в графе; б) Граф, в котором не существует гамильтонова пути.
В отличие от эйлеровых путей
не известно ни одного
такого алгоритма не существует. Проблема существования гамильтонова пути принадлежит к классу так называемых NP-полных задач. Отметим здесь только, что это — широкий класс задач, включающий фундаментальные задачи из теории графов, логики, теории чисел, дискретной оптимизации и других дисциплин, ни для одной из которых неизвестен полиномиальный алгоритм (т.е. с числом шагов, ограниченным полиномом от размерности задачи).
Вернемся к конкретной задаче
существования гамильтонова
Опишем теперь общий метод,
позволяющий значительно
(x1, . . . , xi, xi +1) можно расширить до некоторого решения (либо
(x1, . . . , xi+1) уже является решением). Если такое предполагаемое, но еще не использованное значение xi+1 существует, то мы добавляем его к нашему частичному решению и продолжаем процесс для последовательности (x1, . . . , xi, xi+1). Если его не существует, то мы возвращаемся к нашему частичному решению (x1, . . . , xi−1) и продолжаем наш процесс, отыскивая новое, еще не использованное допустимое значение xi¢ — отсюда название «алгоритм с возвратом» (англ.: backtracking).
Точнее говоря, мы предполагаем, что для каждого k > 0 существует некоторое множество Ak, из которого мы будем выбирать кандидатов для k-й координаты частичного решения. Очевидно, что множества Ak должны быть определены таким образом, что для каждого целочисленного решения (x1, . . . , xn) нашей задачи и для каждого k ≤ n множество Ak содержало элемент xk (на практике мы не можем вообще исключить ситуацию, когда множество Ak содержит некоторые «лишние» элементы, не появляющиеся в k-й координате ни одного целочисленного решения). Мы предполагаем также, что существует некоторая простая функция, которая произвольному частичному решению (x1, . . . , xi) ставит в соответствие значение P(x1, . . . , xi) (истина либо ложь) таким образом, что если P(x1, . . . , xi)=ложь, то последовательность (x1, . . . , xi) несомненно нельзя расширить до решения. Если P(x1, . . . , xi)=истина, то мы говорим, что значение xi допустимо (для частичного решения (x1, . . . , xi−1), но это отнюдь не означает, что (x1, . . . , xi−1), обязательно расширяется до полного решения. Этот процесс можно записать в виде следующей схемы:
1 begin
2 k := 1;
3 while k > 0 do
4 if существует еще не использованный элемент y Î Ak,