Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Кратчайшие пути в графе




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

Алгоритм Дейкстры позволяет найти кратчайшие пути от произвольной фиксированной вершины графа или орграфа. Он представляет собой итерационную процедуру, на каждом шаге которой каждой вершине х сопоставляется пометка l(x), которая является либо постоянной и равной при этом расстоянию d(x1x) от начальной вершины x1 до данной вершины, либо временной - числом, являющимся оценкой сверху для d(x1x). В результате каждой итерации оценки уточняются, и при этом ровно одна временная метка (а именно наименьшая) переходит из разряда временных в постоянную (после чего уже не меняется).

Новые метки вычисляются для вершин по формуле:

LH(xj)=min {LC(xi); Rij+L*(xi)}, (2.1)

где LC(xi) – старая временная метка вершины xi;

LH(xj) – ее новая временная метка;

Rij – вес ребра, соединяющего вершины xj и xj;

L*(xi) – постоянная метка вершины xi.

Перед первой итерацией начальная вершина имеет постоянную метку l(x1)=0, у остальных вершин пометки временные и полагаются равными ∞.

Итерация алгоритма состоит в просмотре всех вершин x с временными метками, к которым ведут дуги из вершины xi – т.е. вершины, которая получила последней постоянную метку (для первой итерации xi= x1).

Замечание. Если граф не является простым, то его можно сделать таким, т.е. отбрасывая все петли и заменяя каждое множество кратных ребер кратчайшим ребром (ребром с наименьшим весом) из этого множества. Если граф не взвешен, то можно считать что все ребра имеют одинаковый вес.

Рассмотрим пример решения задачи, используя алгоритм Дейкстры для нахождения кратчайших путей.

Пример. Для графа представленного на рис. 2.3, используя алгоритм Дейкстры, найти длины кратчайших путей от вершины 1 до остальных вершин, построить остовное дерево кратчайших путей.

Решать задачу будем, согласно алгоритму, итерационными процедурами. Результаты вычислений представим в таблице 2.9, и на рисунке 2.10.

Нулевая итерация. Зададим начальные условия - вершина x1 имеет постоянную метку L*(1 =0, а остальные вершины – метку ∞. Запишем эти данные в таблицу 2.2.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Рис. 2.3

Таблица 2.2
Итерация                 L*(i)
    1

Первая итерация. Вычислим расстояния от вершины 1 с постоянной меткой 0. Для этого запишем множество вершин связанных с вершиной 1 ребрами. Это множество последователей вершины 1:. F (1)={2, 3, 4, 6} и эти вершины имеют временные метки. Поэтому найдем для них новые временные метки согласно формуле (2.1).

LH(2)=min {LC(2); R12+L*(1)}=min{∞;6+0}=6;

LH(3)=min {LC(3); R13+L*(1)}=min{∞;4+0}=4;

LH(5)=min {LC(5); R15+L*(1)}=min{∞;6+0}=6;

LH(6)=min {LC(6); R16+L*(1)}=min{∞;8+0}=8.

Остальные вершины имеют прежние метки - ∞. Запишем это в строку итерации 1 в таблице 2.3.

Среди всех вершин, имеющих временные метки находим вершину с наименьшей временной меткой и считаем ее постоянной.

min L(j)=min{L(2), L(3), L(4), L(5), L(6), L(7), L(8)}= min{6, 4, ∞, 6, 8, ∞}=4.

Наименьшее значение 4 достигается на метки 3. Поэтому это значение в таблице выделим.

Таблица 2.3
Итерация                 L*(i)
    1
  -         3

Приступим к построению дерева минимальных путей, которое будем строить последовательно, итерацией за итерацией. Процесс построения дерева представлен рисунками *.1 - *. х. Первая итерация дала постоянную метку вершине 3, как последователю вершины 1. В дереве кратчайших путей это соответствует появлению ребра, соединяющего вершины 1 и 3. На рис. 2.4 изображены все вершины графа, так как искомое дерево остовное, это значит, что вершины должны совпадать с вершинами исходного графа. Проведем первое найденное ребро, соединяющее вершины 1 и 3.

 
 
 
 
 
 
 
 

Рис. 2.4

Вторая итерация. Определим множество последователей вершины 3: F(3)={1, 2, 4, 5, 7, 8}. Вершина 1 уже имеет постоянную метку, поэтому новые метки найдем для вершин 2, 4, 5, 7, 8.

LH(2)=min {LC(2); R32+L*(3)}=min{6;4+4}=6;

LH(4)=min {LC(4); R34+L*(3)}=min{ ∞; 13+4 }=17;

LH(5)=min {LC(5); R35+L*(3)}=min{6;5+4}=6;

LH(7)=min {LC(7); R37+L*(3)}=min{∞;18+4}=22;

LH(8)=min {LC(8); R38+L*(3)}=min{∞;25+4}=29.

Замечаем, что для вершин 2 и 5 метки остались прежними, поэтому не заносим их в строку второй итерации таблицы 2.4, остальные обновления заносим в клетки строки. Среди всех вершин имеющих временные пометки, ищем вершину с наименьшим значением:

min L(j)= min{L(2), L(4), L(5), L(6), L(7), L(8)} = min{6, 17, 6, 8, 22, 29}=6.

Минимальную метку имеют две вершины 2 и 6, поэтому постоянную метку можно присвоить любой из этих вершин. Например, присвоим постоянную метку вершине 2: L*(2)=6.

 

Таблица 2.4
Итерация                 L*(i)
    1
  -         3
  -   -           2

В результате выполнения второй итерации получено второе ребро из дерева минимальных путей. Поскольку постоянную метку получила вершина 2 и найдена эта метка была на первой итерации как последователь вершины 1, то очередное ребро соединяет именно эти вершины. Получившийся подграф изображен на рис. 2.5.

 
 
 
 
 
 
 
 
 

Рис. 2.5

Третья итерация. Множество последователей вершины 2: F(2)={1, 3, 4}. Среди этих вершин только 4 имеет временную метку. Переопределим ее:

LH(4)=min {LC(4); R24+L*(2)}=min{17;13+6}=17.

Выберем новую постоянную метку.

min L (j)= min{L(4), L(5),L (6),L(7), L(8)}=min{17, 6, 8, 22, 29}=6.

Таким образом, вершина 5 получает постоянную пометку: L*(5)=6.

Таблица 2.5
Итерация                 L*(i)
    1
  -         3
  -   -           2
  - - -           5

Заполняем столбец третьей итерации в табл. 2.5 (поскольку единственная найденная новая метка совпадает со старой, в строке указываем только вершину, которая получила постоянную метку). А в дерево кратчайших путей добавляем ребро, соединяющее вершины 1 и 5 (см. рис. 2.6).

 
 
 
 
 
 
 
 

Рис. 2.6

Четвертая итерация. F(5)={1, 3, 6, 7}. Находим новые метки для вершин6 и 7, так как вершины 1 и 3 уже имеют постоянные.

LH(6)=min {LC(6); R56+L*(5)}=min{8;5+6}=8;

LH(7)=min {LC(7); R57+L*(5)}=min{22;10+6}=16.

Заполняем строку итерации 4 в таблице *. 5: метка для вершины 6 не изменилась, поэтому заносим только метку для 7 вершины.

Таблица 2.6
Итерация                 L*(i)
    1
  -         3
  -   -           2
  - - -           5
  - - -   -       6

Выберем теперь постоянную метку: min L (j)= min{ L (4), L (6), L (7), L (8)} = min{ 17, 8, 16, 29}=8. Следовательно, L*(6)=8.

В дерево добавляется ребро, соединяющее вершины 1 и 6 (рис. 2.7).

Пятая итерация. Множество последователей вершины 6: F(6)={1, 5, 7}. Среди этих вершин только 7 вершина имеет временную метку. Переопределим ее:

LH(7)=min {LC(7); R67+L*(6)}=min{16;12+8}=16. Метка не изменилась, поэтому в строку 5 итерации таблицы 2.7 занесем новую постоянную пометку, которую выберем как

min L(j)=min{L(4), L(7), L(8)=min{17, 16, 29}=16.

 
 
 
 
 
 
 
 

Рис. 2.7

Вершина 7 получает постоянную метку L*(7)=16, а дерево ребро, соединяющее вершины 5 и 7 (см. рис. 2.8).

Таблица 2.7
Итерация                 L*(i)
    1
  -         3
  -   -           2
  - - -           5
  - - -   -       6
  - - -   - -     7

 
 
 
 
 
 
 
 

Рис. 2.8

Шестая итерация. Определим множество последователей вершины 7 - F(7)={3, 5, 6, 8}. Находим новые метки для 8 вершины:

LH(8)=min {LC(8); R78+L*(7)}=min{29;12+16}=28.

Остальные вершины уже имеют постоянные пометки, поэтому заполняем строку 6 итерации (табл. 2.8) и выбираем постоянную пометку.

min L(j)=min{L(4), L(8)}=min{17,28}=17.

Следовательно, L*(4)=17.

Таблица 2.8
Итерация                 L*(i)
    1
  -         3
  -   -           2
  - - -           5
  - - -   -       6
  - - -   - -     7
  - - -   - - -   4

Эту метку вершина получила как последователь вершины 3 на второй итерации, поэтому следующее ребро соединяет вершины 3 и 4. В результате получили подграф, изображенный на рис. 2.9.

 
 
 
 
 
 
 
 

Рис. 2.9

Седьмая итерация. F(4)={2, 3, 8}. Все вершины, кроме 8, имеют постоянные метки, поэтому для нее находим новую временную метку:

LH(8)=min {LC(8); R48+L*(4)}=min{28; 10+17}=28.

Следовательно, L*(8)=28. Заносим результат в таблицу 2.9, которая и будет окончательной таблицей решения задачи.

Вычисления постоянных меток закончено. Последняя полученная метка позволяет построить последнее ребро подграфа, соединяющее вершины 4 и 8, исходного графа, который как видно из рис. 2.10, действительно остовное дерево кратчайших путей от вершины 1 до остальных.

Замечание. При выполнении соответствующего задания нет необходимости заполнять таблицы 2.2 – 2.9 и рисовать рис. 2.3 – 2.10. Достаточно последовательно заполнять одну таблицу и одновременно рисовать рисунок.

Таблица 2.9
Итерация                 L*(i)
    1
  -         3
  -   -           2
  - - -           5
  - - -   -       6
  - - -   - -     7
  - - -   - - -   4
  - - - - - - -   8

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Рис. 2.10

 

Задача сетевого планирования и управления PERT

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

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

Считается, что время выполнения этапа – это вес дуги .

В PERT требуется вычислить минимальное время выполнения проекта – время, за которое можно пройти по всем дугам графа, двигаясь от начальной вершины к конечной вершине, причем движение по каждой дуге может начаться только после того, как пройдены все дуги, заходящие в ее начало. Т.е. необходимо найти самый длинный путь от начальной вершине к конечной.

Алгоритм и его реализацию рассмотрим на примере решения задачи.

Пример. Граф, изображенный на рисунке 2.11, описывает некоторый проект. Дуги графа uiuj соответствуют этапам проекта, а вес дуги обозначает время t(uiuj) выполнения этапа. Найти наименьшее время выполнения проекта, критические пути и резерв времени для выполнения операции ui®uj.

 
3
3
3
3
3
 
 
 
 
 
 
 
u1
u4
u3
u2
u7
u8
u6
u5

 

 

Рис. 2.11

Решение задачи разобьем на этапы.

Этап 1. Найдем наибольшее время l(uj) начала операции, соответствующие дугам, исходящим из вершины ui, где i=1, 2,…, n, j>i, по формуле 2.2:

(2.2)

При этом считаем, что l(u1)=0 – начальное условие алгоритма.

l(u2)= l(u1)+t(u1u2)=0+3=3;

l(u3)= max(l(u1)+t(u1u3); l(u2)+t(u2u3))= max(0+3;3+3)=6;

l(u4)= max(l(u1)+t(u1u4); l(u2)+t(u2u4))= max(0+4;3+2)=5;

l(u5)= max(l(u2)+t(u2u5); l(u4)+t(u4u5))= max(3+2;5+3)=8;

l(u6)= max(l(u4)+t(u4u6); l(u5)+t(u5u6))= max(5+5;8+2)=10;

l(u7)= l(u3)+t(u3u7)= 6+4=10;

l(u8)= max(l(u5)+t(u5u8); l(u6)+t(u6u8); l(u7)+t(u7u8))= max(8+4;10+3; 10+2)= 13.

Результаты вычислений запишем во вторую строку таблицы 2.10. По результатам вычислений пучили, что минимальное время выполнения проекта равно l(u8)=13.

Этап 2. Теперь определим критические пути, т.е. наибольшие пути от начальной вершины графа к конечной. Как видно из 1 этапа таких путей 2:

1 путь - u1®u2®u4®u6®u8;

2 путь - u1®u2®u4®u5®u6®u8.

Этап 3. Найдем самое позднее время начала операций L(ui), отвечающих дугам, исходящим из вершины ui, при котором весь проект все еще может быть выполнен за минимальное время. Для этого:

а) поменяем ориентацию каждой дуги (рис. 2.12), при этом поменяются местами начальная и конечная вершины, т.е. u8 станет начальной вершиной графа, а u1 – конечной;

 

u1
u3
u2
u7
u8
3
3
3
3
 
 
 
 
 
 
 
 
3
u6
u4
u5

 

 

Рис. 2.12

б) найдем самый длинный путь l¢(uj) от вершины u8 до вершины u1, используя алгоритм 1 этапа:

l¢(u8)=0 – начальное условие;

l¢(u7)= l¢(u8)+t(u8u7)= 0+2=2;

l¢(u6)= l¢(u8)+t(u8u6)= 0+3=3;

………………………………….;

l(u1)= max(l¢(u2)+t(u2u1); l¢(u3)+t(u3u1); l¢(u4)+t(u4u1))= max(10+3;6+3; 8+4)= 13.

Результаты вычислений заносим в третью строку таблицы 2.10.

в) вычислим самое позднее время начала операций по формуле 2.3:

L(uj)= l(u8)- l¢(uj) (2.3)

Результаты вычислений записаны в последней строке таблицы 2.10.

 

Таблица 2.10
i                
l(ui)                
l¢(ui)                
L(ui)                

Этап 4. И, наконец, определим резерв времени r(uiuj) для каждой операции проекта по формуле 2.4:

r(uiuj)= L(uj)- l(uj)- t(uiuj) (2.4)

Например, посчитаем резерв времени для дуги (u3u7), не входящей в критический путь. Он будет равен:

r(u3u7)= L(u7)- l(u3)- t(u3u7)=11-6-4=1.

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

Потоки в сетях

Сетью называется взвешенный орграф с двумя выделенными вершинами: истоком и стоком. Исток имеет нулевую полустепень захода, а сток – нулевую полустепень исхода.

Вес дуги означает ее пропускную способность.

Поток – еще одно число, приписанное дуге. Поток должен быть не больше ее пропускной способности и может меняться.

Если поток дуги равен ее пропускной способности, то такая дуга называется насыщенной потоком.

Поток называется полным, если он содержит одну насыщенную дугу.

Поток выходит из истока без потерь, и в том же объеме входит в сток. Условие равновесия также выполняется и для каждой вершины сети. Другими словами, поток не возникает и не накапливается в промежуточных вершинах.

Величина потока (или максимальный поток сети) W - сумма потоков по дугам, исходящим из источника. Или же это сумма потоков входящих в сток.

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

Для решения такого рода задач используется алгоритм Форда-Фелкерсона. Алгоритм состоит из трех частей – насыщение потока, его перераспределение и определение максимального потока сети.

В первой части алгоритма разыскиваются цепи из истока в сток и все дуги цепи насыщаются одинаковым возможно большим потоком, определяемым пропускной способностью наиболее «тонкой» дуги или наименьшей разностью между пропускной способностью и потоком в дуге. Различные цепи могут иметь общие дуги. Полученный поток согласован с условием сохранения в узлах, т.е. поток входящий в вершину, равен потоку выходящему из нее.. Поток проходит по цепям из истока в сток, т.е. не допустим многократный проход по отдельной дуге. Первая часть задачи считается решенной, если нет ненасыщенных цепей из истока в сток. Первая часть не имеет единственного решения

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

И в третьей части подсчитывается максимальный поток сети, как сумма входящих поток в сток или сумма выходящих потоков из истока.

Пример. Задана пропускная способность дуг транспортной сети (рис. 2.13) с началом в вершине 1 и концом в вершине 8. Используя алгоритм Форда-Фелкерсона, найти максимальный поток по сети.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 


Рис. 2.13

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

2/0
7/0
4/0
11/0
7/0
8/0
4/0
4/0
9/0
2/0
5/0
6/0
6/0
 
 
 
 
 
 
 
 

 

Рис. 2.14

Далее разыскиваем цепи из истока в сток, и все дуги цепи насыщаем одинаковым возможно большим потоком, который определяется пропускной способностью наиболее «тонкой» дуги.

Рассмотрим путь 1-2-4-6-8. Пропустим через этот путь поток, равный 4 (так как 4 – наименьшая пропускная способность, встречающаяся на рассматриваемом пути). При этом дуги [2, 4] и [4, 6] будут насыщенными. Аналогично, путь 1-3-5-7-8 насытим потоком 4. Дуга [7, 8] будет насыщенной. Распределение потока отметим на графе (рис. 2.15, жирными линиями выделены рассматриваемые пути).

Из вершины 1 в вершину 8 есть еще один путь 1-3-2-5-4-7-6-8, поток в котором можно увеличить на 2. При этом насытятся дуги [1, 3], [2, 5] и [4, 7] (рис. 2.16).

2/0
7/4
4/4
11/0
7/4
8/0
4/4
4/4
9/4
2/0
5/0
6/4
6/4
 
 
 
 
 
 
 
 

 

Рис. 2.15

Из 1 в 8 больше нет ненасыщенных путей. Так как по дуге [1, 3] двигаться нельзя - она уже насыщена, а движение по дуге [1, 2] заканчивается в вершине 2 – обе выходящие из нее дуги насыщены. Поэтому первый этап решения задачи считаем решенным.

 

4/4
4/4
2/20
7/6
4/4
11/2
7/4
8/2
9/4
2/2
5/2
6/6
6/4
 
 
 
 
 
 
 
 

 

Рис. 2.16

2 этап – перераспределение потока. Найдем последовательность вершин от 1 к 8, такую, что дуги, соединяющие соседние вершины, направленные из 1 в 8, не насыщены, а дуги, направленные в обратном направлении не пусты (знаменатель не равен нулю).

7/6
11/2
7/4
 
 
 
 
 
 
 
6/4
5/2
9/4
+1
+1
+1
+1
+1
-1
процесс перераспределение потока

 

Рис. 2.17

В нашем графе есть единственная такая последовательность: 1-2-3-5-7-6-8 (рис. 2.17). Перераспределяем поток. Для этого поток в дугах прямого назначения увеличиваем на 1, а поток в дугах обратного направления уменьшаем на 1. Процесс продолжаем до тех пор, пока одна из прямых дуг не будет насыщена или какая-нибудь обратная дуга не будет пуста. В данном примере процесс заканчиваем на первом шаге перераспределения, так как дуга [6, 8] стала насыщенной (см. рис. 2.18).

3 этап – нахождение максимального потока по сети. Поток в насыщенной сети можно посчитать по потоку, выходящему из истока 1 или входящему в сток 8. Очевидно, эти числа должны быть равны. Кроме того, для проверки решения следует проверить условие сохранения потока по узлам. Для каждого узла суммарный входящий поток должен быть равен выходящему.

4/4
4/4
2/20
7/7
4/4
11/3
7/5
8/2
9/5
2/2
5/1
6/6
6/5
 
 
 
 
 
 
 
 

 

Рис. 2.18

Проверим условие сохранения потока. Возьмем произвольную вершину, например 5. В нее входят дуги [2, 5] и [3, 5] с потоками 2 и 5 соответственно, поэтому их суммарный поток будет равен 2+5=7. Суммарный выходящий поток посчитаем сложением потоков дуг [5, 4] и [5, 7], он равен тоже 7. Поэтому делаем вывод, что задача решена верна.

Теперь найдем максимальный поток сети. Для истока сети 1 он равен W(1)=5+6=11, т.е. сумме потоков дуг [1, 2] и [1, 3]). Для стока 8 поток сети получаем сложением потоков дуг [6, 8] и [7, 8]: W(8)=7+4=11.

В результате решения задачи получили, что поток равен 11.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных