Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[169]

графе могут быть рёбра с отрицательным весом.)

25-3.6 Пусть взвешенный ориентированный граф G = (V, Е) имеет цикл отрицательного веса. Разработайте алгоритм, печатающий вершины такого цикла (хотя бы одного).

25.3. Кратчайшие пути в ациклическом ориентированном графе

В ациклическом ориентированном графе G = (V, Е) кратчайшие пути из одной вершины можно найти за время 0(V + Е), если проводить релаксацию ребер в порядке, заданном топологическим упорядочением вершин. Заметим, что в ациклическом ориентированном графе кратчайшие пути всегда определены, поскольку циклов отрицательного веса (и вообще циклов) нет.

В разделе 23.4 мы рассматривали алгоритм топологической сортировки вершин ациклического графа. Он располагает их в таком порядке, чтобы все рёбра графа вели от «меньших» вершин к «большим» (в смысле этого порядка). После этого мы просматриваем вершины в этом порядке и для каждой вершины подвергаем релаксации все выходящие из неё рёбра.

Dag-Shortest-Paths(G,w,s)

1топологически отсортировать вершины G

2Initialize-Single-Source(G,s)

3for (для) всех вершин и (в найденном порядке)

4do for (для) всех вершин v \in Adj[u]

5do Relax(u,v,w)

Пример работы этого алгоритма приведён на рис. 25.8.

Оценим время работы алгоритма Dag-Shortest-Paths. Как мы видели в разд. 23.4, стоимость топологической сортировки (строка 1) есть Q(V + Е), а стоимость инициализации в строке 2 есть 0(V). В цикле в строках 3-5 каждое ребро обрабатывается, как и в алгоритме Дейкстры, ровно один раз, но, в отличие от алгоритма Дейкстры, стоимость такой обработки есть 0(1). Стало быть, наш алгоритм выполняется за время Q(V + Е), пропорциональное

Рис. 25.8 (в оригинале в подписи была опечатка: v, тогда как надо и).

Рис. 25.8 25.8. Алгоритм для поиска кратчайших путей в ациклическом ориентированном графе. Вершины топологически отсортированы (на рисунке слева направо). Исходная вершина - s. В вершинах записаны значения функции d; для серых рёбер (u, v) имеем n[v] = и. (а) Перед первой итерацией цикла в строках 3-5. (б-ж) Последовательные состояния после каждой итерации цикла в строках 3-5. На каждом из этих рисунков прибавляется по одной чёрной вершине (которая была вершиной и во время соответствующей итерации цикла). Значения d на рисунке (ж) - окончательные.


объему памяти, необходимому на представление графа с помощью списков смежных вершин.

Покажем, что алгоритм Dag-Shortest-Paths правилен.

Теорема 25.15

Пусть взвешенный ориентированный граф G = (V, Е) с исходной вершиной s не содержит циклов. Тогда по окончании работы процедуры Dag-Shortest-Paths для всех в £ У будут выполнены равенства d[v] = S(s,v), а подграф предшественников Gv будет деревом кратчайших путей.

Доказательство

Согласно лемме 25.9, достаточно доказать равенства d[v] = S(s,v). Если вершина v недостижима из s, то d[v] = S(s,v) = оо по следствию 25.6. Пусть теперь вершина v достижима из s и р = (s = vo, v\,..., Vk = v) - кратчайший путь. После топологической сортировки вершины этого пути расположены как раз в указанном порядке, так что ребро, (г>о, v±) подвергалось релаксации до ребра (t>i,t>2), которое предшествовало ребру (2,3) и т.д. Индукция по г с использованием леммы 25.7 (как в доказательстве корректности алгоритма Беллмана-Форда) показывает теперь, что d[vi\ = S(s,Vi) для всех г, что и требовалось доказать.

Интересное приложение описанного алгоритма - нахождение критических путей в смысле так называемой «технологии PERT» (program evaluation and review technique). В этом приложении каждое ребро ациклического ориентированного графа обозначает какое-то дело, а вес ребра есть время, необходимое на его выполнение. Если имеются рёбра (и, v) и (v, ж), то работа, соответствующая ребру (и, v), должна быть выполнена до начала работы, соответствующей ребру (v, ж). Критический путь (critical path) - это длиннейший путь в графе; его вес равен времени, которое будет затрачено на выполнение всех работ, если мы по максимуму используем возможность выполнять некоторые работы параллельно. Чтобы найти критический путь, можно поменять знак у всех весов на противоположный и запустить алгоритм Dag-Shortest-Paths.

Упражнения

25-4.1 Примените алгоритм Dag-Shortest-Paths к графу рис. 25.8, выбрав вершину г в качестве исходной.

25-4.2 Докажите, что алгоритм Dag-Shortest-Paths останется правильным, если обрабатывать только первые \V\ - 1 вершин.

25-4.3 В задаче о планировании работ по технологии PERT можно рисовать граф иначе, считая, что работы соответствуют не рёбрам, а вершинам графа. При этом каждой вершине присвоен вес (требуемое время), а стрелки указывают определяли последовательность работ (ребро (и, v) требует завершить работу и до начала работы v). Модифицируйте алгоритм Dag-Shortest-Paths так, чтобы он за линейное время находил в ациклическом ориентированном графе путь с максимальной суммой весов вершин.


25-4.4 Разработайте эффективный алгоритм, подсчитывающий общее число путей в ациклическом ориентированном графе, и оцените время его работы.

25.4. Ограничения на разности и кратчайшие пути

Общая задача линейного программирования состоит в отыскании экстремума линейной функции на множестве, заданном системой линейных неравенств. В этом разделе мы рассмотрим специальный случай задачи линейного программирования, сводящийся к нахождению кратчайших путей из одной вершины. Таким образом, рассматриваемый частный случай задачи линейного программирования может быть решён с помощью алгоритма Беллмана-Форда.

Линейное программирование

Общая задача линейного программирования (linear-programming problem) состоит в следующем. Даны т X га-матрица А, то-вектор Ь и га-вектор с. Требуется найти га-вектор ж, являющийся точкой максимума целевой функции (objective function) 2~Г=1 cixi на мно~ жестве, заданном т неравенствами, которые мы можем записать как Ах Ь.

Задачи линейного программирования часто возникают в приложениях, поэтому ими много занимались. На практике задачи линейного программирования быстро решаются с помощью симплекс-метода (simplex algorithm). Симплекс-метод основан на просмотре вершин многогранника, задаваемого неравенствами-ограничениями Ах Ь, при котором значение целевой функции увеличивается. (Симплекс-метод подробно описан в книге Данцига [53].)

Можно, однако, построить последовательность задач линейного программирования, для которой симплекс-метод будет требовать экспоненциального (от размера входа) времени. Метод эллипсоидов (ellipsoid algorithm) решает любую задачу линейного программирования за полиномиальное время, но на практике работает медленно. Существует также полиномиальный алгоритм Кармаркара (Karmarkars algoritm), сравнимый по практической эффективности с симплекс-методом.

Мы не будем заниматься алгоритмами для решения общих задач линейного программирования (что требовало бы большего знакомства с линейной алгеброй, чем остальной материал книги), а сделаем только два замечания. Во-первых, если задачу можно свести к задаче линейного программирования с исходными данными полиномиального размера, то эта задача заведомо может быть решена с помощью полиномиального алгоритма. Во-вторых, для многих специальных задач линейного программирования существуют ал-



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]