Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭММ_Часть2_печать.doc
Скачиваний:
43
Добавлен:
03.09.2019
Размер:
5.35 Mб
Скачать

6.2.Алгоритмы нахождения кратчайшего пути

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

6.2.1.Алгоритм для сетей без циклов

Сначала рассмотрим алгоритм на численном примере. Затем описанную процедуру объясним с точки зрения рекурсивных вычислений.

Пример 6.0:

Рис. 6.11. Пример сети с циклами

Рассмотрим сеть, изображённую на рис. 6.3. Узел 1 представляет начальную точку (исходный пункт), а узел 7 – конечную точку (пункт назначения). Заметим, что сеть не имеет циклов, поскольку нет ни одной цепи, связывающей узел с самим собой.

Прежде чем описать процедуру решения, введём следующие обозначения: dij – расстояние на сети между смежными узлами i и j,

uj – кратчайшее расстояние между узлами i и j, u1 = 0.

Процедура завершается, когда получено значение u7. Общая формула для вычисления uj имеет вид (6.1).

(6.29)

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

Для узла 1 можно вычислить лишь u2 и u3. (Заметим, что, хотя узел 4 соединён с узлом 1 дугой, соответствующее значение u4 вычислить нельзя, пока не будут определены u2 и u3.) Вычислительная схема состоит из следующих этапов.

Этап 1: u1 = 0.

Этап 2: u2 = u1 + d12 =0+2=2 (из 1);

u3 = u1 + d13=0+4=4 (из 1).

Этап 3: u4 =min{u1+d14, u2+d24 , u3+d34}= min{0+10, 2+11, 4+3}=7 (из 3).

Этап 4: u5=min{u2+d25 , u4+d45} =min{2+5, 7+8}=7 (из 2);

u6=min{u3+d36 , u4+d46} =min{4+1, 7+7}=5 (из 3).

Этап 5: u7=min{u5+d57 , u6+d67} =min{7+6, 5+9}=13 (из 5).

Минимальное расстояние между узлами 1 и 7 равно 13, а соответствующий маршрут 1257. Заметим также, что решение даёт кратчайшее расстояние между узлом 1 и любым из других узлов сети.

Все вычисления можно провести непосредственно на сети (рис.6.3). Величина uj для j узла вычисляется лишь после того, как получены ui для всех узлов i, предшествующих j. Таким образом, начиная с u1=0, получаем u2 =2 и u3 = 4. Далее можно вычислить u4 =7. После этого определяются u5 =7 и u6 =5. На последнем этапе получается u7 =13

Представленный выше тип вычислений интересен тем, что он имеет рекурсивный характер. Эти вычисления выполняются с использованием информации о всех кратчайших расстояниях до непосредственного предшествующего узла. Например, в узле 5 величина u5 вычисляется по кратчайшим расстояниям между узлом 1 и узлами 2 и 4, т. е. u2 и u4 .

Заметим, что не обязательно знать конкретный маршрут, дающий кратчайшее расстояние между узлами 1 и 4. Величина u4 включает всю информацию, необходимую для узла 4. Именно такая информация позволяет использовать рекурсивные вычисления. Рекурсивные вычисления представляют собой основу вычислительной схемы динамического программирования.