русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Лекция 3. Кратчайшие пути между всеми парами узлов


Дата добавления: 2013-12-23; просмотров: 1674; Нарушение авторских прав


 

Рассмотрим задачу поиска кратчайших путей между всеми парами узлов сети.

Пусть , , , …,, - кратчайший путь из Vi в Vq. Тогда кратчайший путь из Vi в Vj должен представлять собой единственную дугу еij , кратчайший путь из Vj в Vk — дугу ejk, и т. д.

Назовем дугу еij базисной, если она представляет собой кратчайший путь из Vi в Vj. Из данного определения следует, что кратчайший путь состоит только из базисных дуг.

Алгоритм, который мы опишем, заменяет все небазисные дуги базисными. Т.е., алгоритм строит дуги, соединяющие каждую пару узлов, не соединенную базисной дугой. Длина каждой построенной дуги равна крат­чайшему расстоянию между двумя узлами. Для данного узла Vj рассмотрим следующую простую операцию:

(3.1)

Операция выполняется для каждого фиксированного j и всевозможных i и k, не равных j. Для трех узлов Vj, Vj и Vk и трех дуг с длинами dik , dij и djk данная операция сравнивает длину дуги еik , с длиной пути, состоящего из двух дуг, с промежуточным узлом Vj. Этот случай показан на рис. 8. Операция (2.1) называется тройственной операцией.

 

Рис. 8.

 

Для всевозможных пар узлов Vi и Vk, смежных с Vj , выполним следующие операции.

- Если dik dij + djk, то никаких действий не производим.

- Если dik > dij + djk,, то создаем новую дугу, ведущую из Vi в Vk с dik = dij + djk .

Схема алгоритма:

1) Фиксируем j = 1 и выполняем тройственную операцию (3.1) для всех i, k = 2,3, . . . , n.

2) Фиксируем j = 2 и выполняем тройственную операцию (3.1) для всех i, k = 1, 3, . . . , n.

Замечание. Все новые дуги, добавленные при j = 1, используются далее при j = 2, и т.д.

Как только все тройственные операции будут выполнены для j = n, сеть будет состоять только из базисных дуг и, числа, приписанные каждой ориентированной дуге, ведущей из Vp в Vq, являются кратчайшими расстояниями из Vp в Vq. Докажем это утверждение на примере.



В исходной сети рассмотрим любой кратчайший путь из Vp в Vq. Кратчайший путь должен состоять из базисных дуг этой сети. Если в результате тройственной операции создается дуга с длиной, равной сумме длин всех ба­зисных дуг кратчайшего пути, то это докажет корректность алгоритма.

Рассмотрим кратчайший путь, изображенный на рис. 9.

Рис. 9.

 

При j = 1 тройственная операция создает новую дугу с d63 = d61 + d13.

При j = 2 тройственная операция никак не скажется на данном отдельном кратчайшем пути.

При j = 3 дуга с d63 = d61 + d13 уже построена, следовательно, тройствен­ная операция построит дугу с d63 = d63 + d39 = (d61 + d13) + d39.

При j = 4 будет построена дуга с d26 = d24 + d46.

При j = 6 будет построена дуга длины d29= d26 + d69=(d24 + d46) + (d63 + d39)= d24 + d46 + d61 + d13 + d39.

На рис. 9 построенные дуги изображены пунктирной линией. Числа рядом указывают порядок, в котором эти дуги появлялись. Таким образом, базисная дуга е63 построена первой, а базисная дуга е69 построена второй. Некоторые базисные дуги, которые также будут построены в результате тройственной операции, например, e41 , не изображены на рисунке, так как они не влияют на рассматриваемый кратчайший путь.

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

Замечание 2. Если в сети отсутствуют отрицательные циклы, то любой кратчайший путь должен быть простым и должен состоять не более чем из n - 1 дуг и не более чем из n - 2 различных промежуточных узлов.

Приведенный алгоритм легко может быть запрограммирован на компьютере. Длины дуг сети с n узлами могут быть заданы массивом n х n.

Пример 3.1. Для сети, изображенной на рис. 10, матрица расстояний представлена в таблице 1.

Рис. 10. Сеть, пример 2

 

При j = 1 мы сравниваем каждый элемент di,k () с dj,1 + d1,k.

Если di,k >dj,1 + d1,k, то элемент di,k заменяется на эту сумму. В противном случае элемент не меняется.

 

 

Табл. 1. Матрица расстояний, пример 2

узел

 

При j = 2 мы сравниваем каждый элемент di,k () с dj,2 + d2,k. Минимум из чисел di,k и dj,2 + d2,k становится новым значением элемента di,k.

Замечание 3. В описанных вычислениях при j = 2 мы использовали результаты, полу­ченные при j = 1.

Для фиксированного значения j мы должны просмотреть элементы в (n — 1) х (n — 1) матрице (диагональные элементы всегда равны 0). Каждый элемент сравнивается с суммой двух других элементов: один из той же строки и один из того же столбца. Алгоритм завершает свою работу, когда мы заканчиваем вычисления для j = n.

Замечание 4. Все длины в неориентированной сети симметричны, поэтому достаточно вычислить только одну из двух длин.

Решение примера 2.1. Выполним тройственную операцию для j = 1,2,3,4,5 и запишем только вычисления, которые приводят к изменению в матрице расстояний.

При j = 1

d25 = min{d25, d21 + d15} = min{∞, 1 + 4} = 5.

Изменения расстояний занесены в табл. 2

 

Табл. 2.

узел

 

При j = 2

d13 = min{d13, d12 + d23} = min{∞, 1 + 5} = 6,

d14 = min{d14, d12 + d24} = min{∞, 1 + 1} = 2,

d35 = min{d35, d32 + d25} = min{∞, 5 + 5} = 10.

Изменения расстояний занесены в табл. 3.

При j = 3

изменений нет.

При j = 4

d13 = min{d13, d14 + d43} = min{6, 2 + 2} = 4,

d15 = min{d15, d14 + d45}= min{4, 2 + 1} = 3,

d23 = min{d23, d24 + d43} = min{5, 1 + 2} = 3,

d25 = min{d25, d24-+ d45} = min{5, 1 + 1} = 2,

d35 = min{d35, d34 + d45} = min{10, 2 + 1} = 3.

Изменения расстояний занесены в табл. 4

 

 

Табл. 3.

узел
5
5

 

 

Табл. 4.

узел

 

 

При j = 5изменений нет.

Кратчайшие расстояния между каждой парой узлов найдены. Итоговая таблица кратчайших расстояний – это табл. 4. Но необходимо найти промежуточные (внутренние) узлы для кратчайших путей.

Чтобы зафиксировать порядок, в котором появляются эти узлы, мы используем матрицу [pi,k],в которой элемент i-ой строки и k-ro столбца указывает на первый внутренний узел в пути из Vi в Vj,. Если Рik = j, то кратчайший путь имеет вид Vi, Vj,..., Vk. Далее, если pj,k = s, то кратчайший путь имеет вид Vi,Vj, Vs,..., Vk. Изначально мы полагаем Pi,k = k для всех i, k. Например, таблице 1 соответствует таблица 5.

 

Таблица 5. Начальная таблица промежуточных узлов

узел

 

.

Таким образом, предполагается, что каждая дуга — базисная (до тех пор, пока не установлено обратное), и первым внутренним узлом на пути из Vi в Vk является сам Vk.

Во время выполнения тройственной операции над таблицей 1 мы также обновляем данные в таблице промежуточных узлов. Элементы таблицы промежуточных узлов изменяются согласно следующему правилу:

pi,k = (3.2)

 

Например, когда мы присваиваем элементу d25 значение d21 + d15 = 5, мы также полагаем

p25 = p21 = 1.

Когда мы присваиваем элементу d14значение d12+d24 = 2, мы также полагаем

p14 = p12 = 2.

Когда мы присваиваем элементу d15 значение d14+d45, = 2, мы также полагаем

p15 = p 14 = p 12 = 2.

Когда мы присваиваем элементу d25 значение d24+d45 = 2, мы также полагаем

p25=p24=4.

Итак, по окончании вычислений мы имеем

p15 = 2, p25 = 4.

Так как дуга e45 — базисная, то на протяжении всех вычислений р45 = 5.

p15 = 2 означает, что V2есть первый промежуточный узел на пути из V1в V5.

p25 = 4 означает, что V4 есть первый промежуточный узел на пути из V2 в V5.

p45 = 5 означает, что V5 есть первый промежуточный узел на пути из V4в V5.

Таким образом, мы можем выписать все промежуточные узлы на пути из V1 в V5 ими являются V1, V2, V4и V5.

В общем случае, чтобы найти кратчайший путь из Vg в Vt, мы находим первый промежуточный узел pgt.

Если pst = a, то ищем pat =?

Если pat = b, то ищем рbt =?

Эти действия завершаются, когда pzt=t. Тогда Vs , Va , Vb ,. . . , Vz , Vt — узлы кратчайшего пути.

Элементы таблицы 5 изменяются по формулам (3.2) в то же самое время, когда элементы таблицы 1 изменяются по формулам (3.1). В конце вычислений по формулам (3.1), когда мы получаем таблицу 4 кратчайших расстояний, мы также получаем таблицу 6 промежуточных узлов, вычисленную по формулам (3.2).

 

Табл. 6. Таблица промежуточных узлов. Пример 2.1

узел

 

Замечание 5. Несмотря на то, что таблица 1 симметрична, таблица 6 таковой не является. Для того, чтобы получить всю таблицу 6, мы должны провести все вычисления над таблицей 1, а не только половину вычислений, которые мы выполнили в примере.

Например, когда мы полагаем d25 = d51 + d12 = 5, мы также должны выполнить присваивания p52 = p51 = 1.

 

 



<== предыдущая лекция | следующая лекция ==>
Алгоритм Дейкстры | Поиск остовного дерева в ширину и поиск в глубину


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.008 сек.