3. Разрывающее множество ребер или вершин
Рисунок 3 - Разрывающее множество ребер или вершин
Необходимость в поиске разрывающего множества возникает из-за того, что многие задачи легче поддаются решению на бесконтурных орграфах (Контур (Cycle) — замкнутый путь в орграфе; контур называется простым или элементарным, если ни одна вершина в нем не встречается дважды.), чем на ориентированных графах общего вида. Рассмотрим, например, задачу планирования расписания работ с ограничивающими условиями очередности, т. е. задача А должна выполняться перед задачей В. Когда все ограничивающие условия не противоречат друг другу, то получается бесконтурный орграф, и для соблюдения условий вершины можно упорядочить посредством топологической сортировки. Но как составить расписание, когда существуют циклические ограничивающие условия, например, задание А нужно выполнить перед заданием В, которое нужно выполнить перед заданием С, которое нужно выполнить перед заданием А? Найдя разрывающее множество, мы определяем наименьшее количество ограничивающих условий, которые нужно отбросить, чтобы получить допустимое расписание. В задаче разрывающего множества ребер (или дуг) мы отбрасываем отдельные ограничивающие условия очередности. А в задаче разрывающего множества вершин мы отбрасываем целые задания вместе со связанными с ними ограничениями. Аналогичным образом устраняется состояние гонок в электронных схемах. Задача разрывающего множества также называется задачей поиска максимального ациклического подграфа. Еще одно приложение связано с определением рейтинга спортсменов. Допустим, нам требуется определить рейтинг участников шахматных или теннисных соревнований. Для этого мы можем создать ориентированный граф, в котором ребро идет от вершины х к вершине у, если игрок х победил игрока у. По идее, игрок более высокого класса должен победить игрока низшего класса, хотя противоположный (неожиданный) результат наблюдается довольно часто. Естественным определением рейтинга будет топологическое упорядочение, полученное после удаления из графа минимального разрывающего множества ребер, представляющих неожиданные результаты матча.
Решая задачу разрывающего множества, ответьте на следующие вопросы. Нужно ли отбросить какие-либо ограничивающие условия? Если граф уже является бесконтурным орграфом, что можно выяснить с помощью топологической сортировки, то никакие изменения не требуются. Один из способов поиска разрывающего множества состоит в модифицировании алгоритма топологической сортировки таким образом, чтобы при обнаружении конфликта удалялось проблемное ребро или вершина. Но это разрывающее множество может оказаться намного больше требуемого, т. к. на ориентированных графах задачи поиска разрывающего множества ребер и разрывающего множества вершин являются NP-полными. Как найти подходящее разрывающее множество ребер? Эффективный эвристический алгоритм с линейным временем исполнения создает вершинное упорядочение, а потом удаляет каждую дугу, идущую в неправильном направлении. При любом упорядочении вершин направление, по крайней мере, половины дуг должно быть одинаковым (слева направо или справа налево), поэтому в качестве разрывающего множества следует взять то, которое меньше. Как правильно выбрать начальную вершину? Вполне естественно отсортировать вершины по их реберной разбалансированности, т. е. по разности между степенью захода и степенью исхода.
Вывод
Таким образом мы провели исследование двух тем.
Первая тема показала нам возможность перестановок.
Вторая тема показала нам каким образом можно решать задачи наиболее быстрым образом при удалении некоторых условий.
Обе темы очень полезны в программировании и в дальнейшем помогут нам решать более сложные программные задачи.
Список литературы
http://ru.wikipedia.org/wiki/
http://msdn.microsoft.com/
Скиена С. Алгоритмы. Руководство по разработке. – 2-е изд.: Пер. с англ. – СПб.: БХБ-Петербург, 2011. – 720с.: ил.
