Опpеделение кpатчайшего пути на сети с циклами
МИНИСТЕРСТВО ОБРАЗОВАНИЯ
УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ
«ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ
УНИВЕРСИТЕТ
ИМЕНИ ФРАНЦИСКА СКОРИНЫ»
Заочный факультет
Кафедра автоматизированных систем обработки информации
Опpеделение кpатчайшего пути на
сети с циклами
Курсовая работа
по дисциплине «Системный анализ и исследование операций»
Исполнитель
студент группы АС-32 Шелкунов А.А.
Руководитель
ассистент Давыдов В.С.
Гомель, 2010
Содержание
Введение
Транспортная задача (и ее варианты) – одна из многочисленных задач, которые можно сформулировать и решить с помощью сетевых моделей. Рассмотрим следующие конкретные примеры:
- Проектирование газопровода, соединяющие буровые скважины в Мексиканском заливе с находящейся на берегу приемной станцией. Следует выбрать проект, в котором строительство газопровода имеет минимальную стоимость.
- Определение кратчайшего пути между двумя городами, проходящего по существующей сети шоссейных дорог.
- Определение максимальной пропускной способности (в тоннах/год) трубопровода для транспортировки угольной пульпы с шахт Вайоминга на тепловые электростанции в Хьюстоне. (Уголь под напором воды поступает специально спроектированный трубопровод и перегоняется с шахт в пункты назначения).
Анализ указанных примеров показывает, что оптимизационные задачи на сети можно описать следующими тремя типами моделей:
- минимизация сети;
- нахождение кратчайшего маршрута;
- определение максимального потока;
Рассмотренные выше примеры связаны с определением расстояний и материальных потоков. Перечисленные выше задачи можно сформулировать и в принципе решить как задачи линейного программирования. Однако из-за огромного числа переменных и ограничений сетевых задач непосредственное применение симплекс- метода не целесообразно.
2 СЕТЕВАЯ МОДЕЛЬ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ
ОСНОВНЫЕ ПОНЯТИЯ И ОПРЕДЕЛЕНИЯ
Сетевой моделью (другие названия: сетевой график, сеть) называется экономико-компьютерная модель, отражающая комплекс работ (операций) и событий, связанных с реализацией некоторого проекта (научно-исследовательского, производственного и др.), в их логической и технологической последовательности и связи.
Анализ сетевой модели, представленной в графической или табличной (матричной) форме, позволяет, во-первых, более четко выявить взаимосвязи этапов реализации проекта и во-вторых, определить наиболее оптимальный порядок выполнения этих этапов в целях, например, сокращения сроков выполнения всего комплекса работ.
Математический аппарат сетевых моделей базируется на теории графов.
Графом называется совокупность двух конечных множеств:
- множества
точек, которые называются верш
Граф называется связным, если для любых двух его вершин существует путь, их соединяющий; в противном случае граф называется несвязным.
В экономике чаще всего используются два вида графов: дерево и сеть.
Дерево представляет собой связный граф без циклов, имеющий исходную вершину (корень) и крайние вершины; пути от исходной вершины к крайним вершинам называются ветвями.
Сеть — это ориентированный конечный связный граф, имеющий начальную вершину (источник) и конечную вершину (сток). Таким образом, сетевая модель представляет собой граф вида «сеть».
Если для нахождения кратчайшего пути между каждой парой узлов сети используется модель с промежуточными пунктами, то необходимо решить столько транспортных задач с промежуточными пунктами, сколько в сети содержится различных пар узлов.
Задачу о кратчайшем пути можно решить как задачу о максимальном потоке, в которой поток полагается равным единице.
Если сетевую оптимизационную задачу представить в виде задачи линейного программирования, то число переменных в ней будет равно числу дуг сети.
Сетевые модели могут строиться:
- в терминах событий: вершины- события, дуги- взаимосвязь событий;
- в терминах работ: вершины- работы, дуги- взаимосвязь работ;
- в терминах работ и событий: вершины- события результата работ (начало либо завершение), дуги- сами работы.
2 АЛГОРИТМ ОПPЕДЕЛЕНИЯ КPАТЧАЙШЕГО ПУТИ НА
СЕТИ С ЦИКЛАМИ
Алгоритм нахождения кратчайшего пути на сети, содержащей циклы, также основан на рекурсивных вычислениях. Однако в этом случае они не- сколько сложнее. Сначала опишем шаги вычислительной процедуры, а затем
проиллюстрируем её на числовом примере.
1 2 … n –1 n ui
1 d11 d12 … d1, n-1 d1n u1
2 d21 d22 … d2, n-1 d2n u2
M …
n dn1 dn2 … dn, n-1 dnn un
v1 v2 … vn-1 vn
Таблица 1
Пусть требуется определить кратчайший маршрут между узлом 1 и лю- бым другим узлом сети j, j = 2,…, n. Алгоритм удобно представить, записав расстояния dij между узлами i и j в виде таблице 1 (заметим, что dij могут от- личаться от dji). Таким образом, строка i (столбец j) представляет узел i (узел j). Шаги алгоритма можно представить следующим образом.
Шаг 1 Пусть vj – сумма длин дуг, образующих цепь, ведущую из узла 1 в узел j. Положим v1= 0 и ui равным vj, если i = j. При условии, что i и j и со- единены дугой, величина vj определяется как vj = min{ui + di j}.
Процесс начинается с i = 1 и v1 =u1 = 0.
Заметим, что ui включает расстояния до узла i, которое заметим исполь- зуется для определения ближайшего узла j. При этом требуется, чтобы обра- щение к значению ui (= vj) для i= j происходило сразу после появления vj и
прежде чем вычислено какое-либо новое значение vj.
Шаг 2 Положить i =1.
1) Вычислить vj-ui для всех j.
2) Если dij³ vj-ui для всех j, то между узлами i и j не существует более короткого пути. Если i = n, перейти к п. 4. Иначе положить i=i+1 и перейти к
п. 1.
3) Если di j< vj - ui, вычислить новые значения vj , v /j используя формулу
v /j = ui + di j .
Заменить vj и ui и для i = j на v /j. Если i = n, перейти к п. 4, в противном случае положить i=i+1 и перейти к п. 1.
4) Если значение vj изменялось в п. 3, повторить пункт 2, используя из- менённое значение. В противном случае перейти к шагу 3.
Шаг 3 Полученные значения vj определяют кратчайшее расстояние ме-
жду узлами 1 и j =2, 3, …, n. Для получения соответствующих цепей послед-
няя дуга
(i,
j)
в
цепи (i,
j) должна
удовлетворять
условию
u = v - d .
i1 j i j
После определения i1 предпоследняя вершина i2 должна удовлетворять
равенству
u = v - d .
i2 i
1
i 2i 1
Процесс продолжается, пока не будет достигнут узел 1.
Пример:
Рассмотрим сеть на рисунке 1. Сеть содержит циклы, возникающие из-за возможности двустороннего движения. Если дуга ориентирована (т.е. движение одностороннее), расстояние в другом направлении полагается равным ¥ .
Соответствующие величины dij вместе с предварительными значениями ui и vj и приведены в таблице 2. Исходные величины vj и ui определяются сле- дующим образом. Пусть u1 = v1 = 0 . При использовании формулы
vj = min{ui +di j}
Осуществляется последовательное обращение к величинами vj и ui по мере того как они становятся доступными. v2 = 0+2= 2, u2 =2,
v3
=
min {u1 + d13 , u2 + d23}= min {0+8, 2+3}= 5, u3 = 5,
i =1, 2
i =1, 2
v4
=
min {u1+d14 , u2+d34}= min {0+11, 5+ ¥ }=11, u4 = 11,
v5
=
i =1,3
min {u1+d15, u2+d25}=
i =1, 2
i =1,3
min {0+9, 2+5}=7, u5 =7,
i =1, 2
v6
=
min
i =2,3, 4,5
{u2+d26,u3+d36,u4+d46
,u5
+d56}=
min
i =2,3, 4,5
{2+1,5+2,11+2,7+7}= 3, u6= 3,
v7 = min
i =4,5,6
{u4
+ d47
, u5
+ d57, u6
+ d67,}=
min
i =4,5,6
{11+23,7+9,3+10}=13, u7=13.
5
8 7
5 1
2
9 2 8
3
2 4
4
8
1
1
9
4 7
1
10 2
6
10
3
2
23
5 2
3
5 9
4
11
Рисунок 1 − Пример сети с циклами
i/j 1 2 3 4 6 6 7 ui
1 2 8 11 9 0
2 4 3 5 1 2
3 1 4 ¥ 2 2 5
4 5 9 2 23 11
5 2 ¥ 7 9 7
6 8 3 5 1 10 3
7 10 4 2 13
vj 0 2 5 11 7 3 13
Таблица 2
При переходе к шагу 2 проводится проверка условия оптимальности п у- тём сравнения (vj-ui) с dij следующим образом.
j = 1:
j = 1 2 3 4 5 6 7 vj – u1 * 2 5 11 7 * * d1j * 2 8 11 9 * *
Поскольку vj-ui £ dij для всех j, величины vj пересчитывать не следует. Заметим, что для j=1, 6 и 7 расстояния dij не определены, поэтому эти вели- чины при сравнении не берутся. В процессе реализации алгоритма обнару- живается, что условие оптимальности первый раз нарушается при i=6.
При i = 6 условие оптимальности нарушается для j = 4 и 5. Величины v4
и v5 изменяются следующим образом:
v /4 = u6 + d64 = 3+5=8 (v4=u4=8),
v /5 =u6 + d65 =3+1= 4 (v5 =u5=4).
В последующих вычислениях, т.е. для i=7, используются изменённые значения v4 , v5 и u4 , u5.
j = 2:
j = 3: j = 4: j=5:
j = 1 2 3 4 5 6 7
vj – u2 -2 * 3 * 5 1 *
d2j 4 * 3 * 5 1 *
j = 1 2 3 4 5 6 7
vj – u3 -5 -3 * 6 * -2 *
d3j 1 4 * ¥ * 2 *
j = 1 2 3 4 5 6 7
vj – u4 -11 * -6 * * -8 2
d4j 5 * 9 * * 2 23
j = 1 2 3 4 5 6 7
vj – u5 -7 -5 * * * -4 6
d5j 2 ¥ * * * 7 9
j = 6:
j =7:
j = 1 2 3 4 5 6 7
vj – u6 * -1 2 8 4 * 10
d6j * 8 3 5 1 * 10
j = 1 2 3 4 5 6 7
vj – u7 * * * -5 -9 -10 *
d7j * * * 10 4 2 *
После этого повторяется шаг 2 с изменёнными значениями vj и ui. В таблице 3 приведены результаты сравнений, проведённых для i =1, 2, … ,7. Из этой таблицы видно, что в новых изменениях уже нет необходимости, и по- этому последние изменённые величины vj дают длину кратчайшего пути от 1 до j.
Покажем, каким образом используется ui и vj в таблице 2 для определения кратчайших расстояний между узлом 1 и каждым из узлов j=2, 3, … , 7. Проиллюстрируем процедуру на примере нахождения участков кратчайшего п ути между узлами 1 и 7.
Как уже известно, кратчайшее расстояние между узлами 1 и 7 равно v7 =
13. Определение участков сети должно начинаться с узла 7. Требуется найти узел, непосредственно предшествующий узлу 7. Из столбца 7 таблицы 2 видно, что равенство v7 =u1 + d17 , выполняется при i=5 и i=6, т. е. либо узел 5, либо узел 6 соединён с 7 (альтернативные решения).
Рассмотрим сначала узел 5. Из столбца 5 видно, что равенство v5=u1+d15 выполняется при i=6. Далее из столбца 6 следует, что равенство v6=u1+d16 вы- полняется при i=2. Наконец, как следует из столбца 2, равенство v2=u1+d12 выполняется при i=1. Получившиеся участки дают путь 1®2®6®5®7 с v7
=13.
Аналогичная процедура позволяет получить другой кратчайший путь между узлами 1 и 7, а также все пути между узлами 1 и j = 2, 3, 4, 5 и 6.
j
=1 2 3 4 5 6 7 ui
Таблица 3
i =1 * 2
* 2
i =2 -2 *
4 *
5 8 4
8 11 9
3 * 2
3 * 5
* * 0
* *
1 * 2
1 *
i =3 -5 -3 *
1 4 *
3 * -2 * 5
* 2 *
i =4 -8
5
* -3 *
* 9 *
* -5 5 8
* 2 23
i =5 -4
2
-2 * *
* *
* -1 9 4
* 7 9
i = 6 *
*
i = 7 *
*
-1 2
8 3
* *
* *
5 1
5 1
5 -9
10 4
*
*
-10
2
10 3
10
* 13
*
ЛИСТИНГ ПРОГРАММЫ
Алгоритм Форда-Беллмана
var a:array[1..20,1..20] of word; {матрица смежности}
c,pred,fl,d:array[1..20] of word;{c - массив кратчайших расстояний; pred - массив предыдущих вершин; fl - массив флагов; d - массив для записи пути}
i,j,k,n,first,last:byte;
f:text;{переменная для открытия in.txt}
{процедура обхода графа вглубь для поиска всех путей}
Procedure Dfs(x:word); {в качестве
параметра передаём текущую
var i:byte; {локальная переменная}
begin
if x=last then {если конечная вершина, то вводим путь}
begin
write(first,' ');
for i:=1 to j do {выводим путь}
write(d[i],' ');
writeln;
exit;{выходим из процедуры}
end;
fl[x]:=1; {помечаем что были в вершине}
for i:=1 to n do {если не были в вершине и существует дуга в неё}
if (fl[i]=0)and(a[x,i]<>32767) then
begin
inc(j);
d[j]:=i; {записываем в путь вершину}
dfs(i);
dec(j);
end;
fl[x]:=0; {помечаем что вершина свободна}
end;
{основная программа}
begin
assign(f,'in.txt'); {открываем файл для чтения}
reset(f);
readln(f, n); {считываем количество вершин}
for i:=1 to n do
for j:=1 to n do
read(f,a[i,j]); {считываем матрицу смежности}
writeln('Mатрица:');
for i:=1 to n do {выводим матрицу на экран}
for j:=1 to n do
if j=n then writeln(a[i,j])
else write(a[i,j],' ');
for i:=1 to n do {заменяем нули бесконечностью}
for j:=1 to n do
if a[i,j]=0 then a[i,j]:=32767;
writeln('Введите 1 вершину: ');
readln(first);
writeln('Введите 2 вершину');
readln(last);
close(f); {закрываем файл in.txt}
for j:=1 to n do
begin
c[j]:=a[first,j]; {записываем начальные значения}
if a[first,j]<32767 then
pred[j]:=first; {если существует дуга
то записываем предыдущую
end;
for i:=3 to n do
for j:=1 to n do
if j<>first then
for k:=1 to n do {если не бесконечность и путь более выгодный}
if (c[k]<32767) and (c[k]+a[k,j]<c[j]) then
begin
c[j]:=c[k]+a[k,j]; {записываем новое значение}
pred[j]:=k; {записываем pred вершину}
end;
if c[last]=32767 then writeln('Нет путей')
else {если бесконечность то нет пути}
begin
writeln;
writeln('Кратчайший путь:');
write(first,' ');
i:=last;
k:=1;
while i<>first do {в обратном порядке обходим путь}
begin
d[k]:=i; {записываем путь в массив}
k:=k+1;
i:=pred[i];
end;
for i:=k-1 downto 1 do {выводим кратчайший путь}
write(d[i],' ');
writeln;
writeln('Все пути:');
j:=0;
Dfs(first); {вызываем процедуру поиска всех путей}
end;
readln;
readln;
end.
ЗАКЛЮЧЕНИЕ
В данной курсовой работе мною была раскрыта тема «Определение кратчайшего пути на сети с циклами». Эта тема является достаточно важной в рассмотрении вопросов системного анализа.
В своей работе я привел задачи, решение которых осуществляется с помощью сетевых моделей:
минимизация сети;
кратчайший путь:
- сеть без циклов;
- сеть с циклами;
определение максимального потока;
Метод «Определение кратчайшего пути на сети с циклами» теоретически рассмотрен более подробно и к этому методу предложена программа, написанная на языке программирования Pascal.
Эта программа облегчает понимание данного метода и дает яркую картину принципа его работы.
При написании курсовой работы была использована различного рода литература.
ЛИТЕРАТУРА
- Дегтярев Ю.И. Методы оптимизации: Учеб. пособие для ВУЗов.-М.: Сов.радио, 1980.-272с.
- Дегтярев Ю.И. Исследование операций: Учеб. пособие для ВУЗов по спец.АСУ. -М.: Высш. шк., 1986.-320с.: ил.

- Опалення двосекційної семиповерхової житлової будівлі в місті Бердянськ
- Опалення та вентиляція
- Опасности и возможности предприятия
- Опасности модных тенденций среди молодёжи как социально- педагогическая проблема
- Опасность и вероятность кризисов в тенденциях циклического развития организации
- Опасность кризисов для развития организаций
- Опасность преступления
- ООО «Корал тревел» стратегические альянсы и их особенности в туристическом и гостиничном бизнесе
- ООО «Мастернет Урал Групп» как объект финансового анализа
- ООО “Ольвира“
- ООО «Фаворит» оценка влияния ценовой политики, на результаты его деятельности
- ООптимизация производственной программы АПП и управление запасами ресурсов
- Оосновные ообеностисоставления проекта федерального бюджета на 2011 год и плановый период 2012-2013 годов
- Оосновные подходы к исследованию систем управления