Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Графы DAG






В этом разделе мы рассмотрим различные приложения графов DAG (directed acyclic graph — ориентированный ациклический граф). На то имеются две причины. Во-первых, они служат неявными моделями частичных порядков; во многих приложениях мы имеем дело непосредственно с графами DAG, и в силу этого обстоятельства нуждаемся в эффек­тивных алгоритмах обработки таких графов. Во-вторых, различные приложения дают нам возможность постижения природы графов DAG, а понимание графов DAG существенно упрощает понимание общих свойств орграфов.

Поскольку графы DAG являются особым видом орграфов, все задачи обработки гра­фов DAG элементарно сводятся к задачам обработки орграфов. Хотя мы и надеемся, что



Часть 5. Алгоритмы на графах


обработка графов DAG проще, чем обработка орграфа общего вида, тем не менее, мы знаем, что если мы столкнемся с задачей, которая трудно решается на графе DAG, то решение этой же задачи на орграфах общего вида едва ли окажется проще. Как мы смо­жем убедиться далее, задача вычисления транзитивного замыкания попадает именно в эту категорию. И наоборот, осознание сложности обработки графов DAG важно с той точ­ки зрения, что каждый орграф содержит некоторый DAG в качестве своего ядра (см. свойство 19.2), так что мы сталкиваемся с графами DAG даже в тех случаях, когда рабо­таем с орграфами, не являющимися графами DAG.

Приложение-прототип, в котором графы DAG возникают сами по себе, называется приложением составления расписаний (scheduling). В общем случае решение задачи состав­ления расписаний заключается в организации завершения решения некоторого множества задач (tasks) в условиях действия некоторого набора ограничений (constraints) путем зада­ния условий, когда и как эти задачи должны выполняться. Ограничениями могут быть не­которые функции от времени выполнения или от других ресурсов, потребляемых зада­чей. Наиболее важным типом ограничений является ограничения предшествования (precedence constraints), которые определяют, что одни задачи должны быть обязательно решены до того, как может быть начато решение других задач, благодаря чему на множество задач устанавливается некоторый частичный порядок. Различные виды дополнительных огра­ничений приводят к возникновению различных типов задач составления расписаний раз­ной степени сложности. Изучению подверглись буквально тысячи различных задач, при этом исследователи продолжают поиск более совершенных алгоритмов решения для мно­гих из них. Возможно, простейшую нетривиальную задачу составления расписания мож­но сформулировать следующим образом:

Составление расписаний. Пусть дано множество задач, требующих решения, на кото­ром задан частичный порядок, определяющий, что решение некоторых задач должны быть завершено, прежде чем начнется выполнение некоторых других задач. Каким образом можно организовать решение всех задач множества так, чтобы в конечном итоге все они были успешно завершены с соблюдением частичного порядка?

В своем основном виде задача составления расписания называется топологической сор­тировкой (topological sorting); при ее решении особых трудностей не возникает, как мы сможем убедиться в следующем разделе, в котором предлагаются два алгоритма ее реше­ния. В более сложных практических приложениях нам, возможно, придется накладывать дополнительные ограничения на то, как следует составлять расписание решения задач, и сложность топологической сортировки, естественно, возрастает. Например, задачи могут соответствовать курсам лекций в расписании занятий студентов, а частичный порядок может определяться некоторыми предварительными условиями. Топологическая сорти­ровка дает реальное расписание курса, удовлетворяющее предварительным условиям, но, по-видимому, не такое, какое учитывало бы другие виды ограничений, которые непло­хо было бы добавить в модель, такие как конфликт курсов, ограничения на прием сту­дентов и т.д. Еще один пример: задачи могут быть частью некоторого производственного процесса, при этом частичный порядок представляет собой требования к последователь­ности, в которой выполняются конкретные процессы. Топологическая сортировка пред­лагает нам способ планирования задач, но, возможно, существует другой такой способ, требующий меньше времени и денег или других ресурсов, не учтенных в модели. В гла-


Глава 19. Орграфы и ориентированные ациклические графы 195

вах 21 и 22 мы рассмотрим различные версии задачи составления расписаний, которые учитывают более общие ситуации, подобные описанным выше.

Часто первая наша задача заключается в том, чтобы определить, содержит ли задан­ный граф DAG направленный цикл. Как было показано в 19.2, мы легко можем реали­зовать класс, который позволяет клиентским программам проверять, является ли орграф общего типа графом DAG, за линейное время, путем проведения стандартного поиска в глубину и проверки, содержит ли полученный при этом лес DFS обратные ребра (см. уп­ражнение 19.75). Для реализации алгоритмов, ориентированных на работу с графами DAG, мы строим специальные клиентские классы нашего стандартного АТД GRAPH, который предполагает, что они производят обработку орграфов без циклов, возлагая обя­занность по проверке на присутствие циклов на клиентские программы. Подобная орга­низация допускает возможность того, что алгоритм обработки графа DAG воспроизводит полезные результаты даже в тех случаях, когда выполняется на орграфах с циклами, в чем время от времени возникает потребность. В разделах 19.6 и 19.7 анализируются реализа­ции классов топологической сортировки (DAGts) и классов определения достижимости в графах DAG (DAGts и DAGreach); программа 19.13 представляет собой пример клиен­та такого класса.

В некотором смысле, с одной стороны DAG - это дерево, с другой - это граф. Ес­тественно, мы воспользуемся преимуществами такой структуры графов DAG во время их обработки. Например, если захотим, мы можем рассматривать DAG как дерево. Предпо­ложим, мы хотим совершить обход ориентированного ациклического графа (DAG) D, как если бы он был деревом с корнем в вершине w, так что, например, результат обхода двух графов DAG на рис. 19.18 с помощью этой программы будет одним и тем же. Следующая простая программа выполняет эту задачу так же, как бы это сделал рекурсивный обход дерева:

void traverseR (Dag D, int v) {


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал