русс | укр

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

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

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

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


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

Алгоритм


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


 

Алгоритм решения этой задачи позволяют определить кратчайший путь и его длину за конечное число шагов. Каждая вершина графа получает некоторую числовую метку на первом шаге. Затем метки, вообще говоря, могут меняться, становясь на некотором шаге постоянным числом. Установившаяся метка данной вершины есть кратчайшее расстояние от этой вершины до вершины x0. Если пути, соединяющего x0 и xn, не существует, будем считать длину кратчайшего пути между этими вершинами равной + .

Алгоритм состоит в последовательном выполнении следующих операций:

1. На первом шаге ставим следующие метки: для вершины x0:l0=0, для любой другой вершины xi lj=+ (i=1,…,n);

2. Ищем на графе такую дугу (xi,xj), для которой lj-li>l(xi,xj). Причем разность - считаем равной 0. Если такая дуга найдется, меняем метку вершины xj на . Если такой дуги не найдется, то пути, соединяющего x0 с xn, не существует, т.к. из x0 ни в какую другую вершину графа не идет ни одна дуга.;

3. Повторяем процедуру пункта 2 до тех пор, пока метки вершин не перестанут меняться.

Установившиеся метки обозначим l*i (i=1,2,…,n). При этом может быть два случая:

1) l*n=+ .

Это значит, что пути, соединяющего x0 и xn, не существует. Длина кратчайшего пути равна + .

2) l*n – конечное число.

Оно равно кратчайшему расстоянию между вершинами x0 и xn.

Кратчайший путь получаем следующим образом. Ищем вершину такую, что , затем , для которой и т.д. до тех пор, пока не придем в вершину = x0. Путь, проходящий через отмеченные вершины , является кратчайшим.

Как следует из построения и правил изменения меток, метки вершины xi (i=1,…,n) могут меняться конечное число раз (метка вершины x0 l0=0 не меняется), т.к. конечная метка всякой вершины равна длине некоторого пути из x0 в данную вершину xi.

Из построения следует, что отмеченный путь
m ( ) – есть кратчайший путь. В самом деле, пусть существует другой путь из вершины x0 в xn, проходящий через вершины x0, y1, y2, …, yr, xn. Из построения следует, что



 

Складывая эти неравенства и учитывая, что = 0, получим , т.е. . Заметим, что решение задачи может не быть однозначным, т.е. существует несколько путей минимальной длины из вершины x0 в xn.

Рассмотренный алгоритм известен в литературе как алгоритм Форда.

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

. (3.3.1)

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

Обратимся к приведенному выше примеру. Определим кратчайший путь, соединяющий пункты x0 и x5. При этом будем пользоваться формулой (3.3.1)

Для вершины x0 полагаем l0=0. Для всех остальных вершин li=+ (i=1…,5). Затем ищем дугу, для которой lj-l0>l(x0,xj). Начнем с вершины x1.

l1-l0= >l(x0,x1)=2.

Следовательно, меняем метку вершины x1 на

l’1=l0+l(xo,x1)=2.

 

Аналогично определяем метку вершины X2

 

l’2=l0+l(xo,x2)=4.

 

Чтобы найти изменившуюся метку вершины x3, следует воспользоваться формулой (3.3.1), т.к. в вершину x3 направлены две дуги, идущие из двух разных верши x0 и x1:

 

l’3=min{[l’1+l(x1,x3)],[ l0+l(x0,x3)]}=min{(2+4),(0+5)}=5. (xo)
   

 

Аналогично определяем новые метки для вершин x4 и x5:

 

l’4=min{[l’1+l(x1,x4)],[ l’3+l(x3,x4)]}=min{(2+3),(5+6)}=5, (x1)
l’5=min{[l’2+l(x2,x5)],[l’3+l(x3,x5)],[l’4+l(x4,x5)]}= =min{(4+7),(5+4),(5+2)}=7. (x4)

 

В данном случае получили установившиеся метки вершин на втором шаге (на первом шаге полагали l0=0, li=+ ). Каждая из меток l’j – длина кратчайшего пути из вершин xi в данную вершину xj. Длина кратчайшего пути из x0 в x5 есть

 

l*5=l’5=7.

При подсчете значений l’j справа в скобках отмечены вершины, по которым достигается минимум. Так, для x5 l’5=7, если прийти в эту вершину из вершины x4, т.е. l’5=l’4+l(x4,x5). Метка для вершины x5 примет большее значение, если прийти в x5 из x2 или x3. Следовательно, кратчайший путь в x5 проходит через вершину x4 (p1=4 в приведенных выше обозначениях). В x4 он идет через вершину x1 (p2=1), в x1 из x0 (p34=0). Итак, кратчайший путь из вершины x0 в x5 проходит через вершины x0,x1,x4,x5. Искомый путь m есть (x0,x1,x4,x5); l(m)=7.

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

 

 

Сети. Отношение порядка между вершинами
ориентированного графа

 

Ориентированный граф без циклов, имеющий одну вершину без входящих дуг (вход графа) и одну вершину без выходящих дуг (выход графа), называется сетью.

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

В любом ориентированном графе без циклов можно установить отношение порядка между его вершинами.

Вершина xi предшествует вершине xj, , если существует дуга из xi в xj. Это отношение порядка удовлетворяет аксиомам порядка:

1) если xi предшествует xj, то xj не предшествует xi;

2) если xi предшествует xj, а xj предшествует xk, то xi предшествует xk.

«Правильная» нумерация вершин графа заключается в том, что если xi предшествует xj, то номера i и j должны удовлетворять неравенству i<j.

На графе-сети практически это можно сделать, используя распределение вершин по рангам методом вычерчивания дуг. Вычеркиваем дуги, исходящие из входа графа, вершины x0. Вершины, соответствующие концам этих дуг и не имеющие после этой операции входящих дуг, относим к вершинам I-го ранга. На графе G (рис.3.3.1) вершинами I-го ранга являются вершины x1 и x2. Вершины I-го ранга получают первые порядковые номера 1,2. Внутри одного ранга нумерация произвольна.

Затем вычеркиваем дуги, выходящие из вершин I-го ранга. Вершины, соответствующие концам таких дуг и не имеющие после этих операций входящих дуг, относим к вершинам 2-го ранга. Они получают следующие порядковые номера. В нашем примере к вершинам 2-го ранга относится одна вершина x3.

Процесс вычеркивания дуг продолжается до тех пор, пока все вершины графа не будут занумерованы. Последний порядковый номер получит вершина xn – выход графа.

В рассмотренном примере все вершины распределены по 4 рангам. К вершинам 3-го ранга принадлежит x4, а к вершинам 4-го ранга – x5.

Существуют и другие способы «правильной» нумерации вершин графа, в том числе алгоритм Форда для нумерации вершин графа.

 

 

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



<== предыдущая лекция | следующая лекция ==>
Экстремальные задачи на графах | Алгоритм


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


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

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

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


 


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

 
 

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

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