Автор: Пользователь скрыл имя, 09 Октября 2012 в 07:11, курсовая работа
Транспортная задача (и ее варианты) – одна из многочисленных задач, которые можно сформулировать и решить с помощью сетевых моделей. Рассмотрим конкретные примеры.
Введение 3
1 Сетевая модель линейного программирования 4
Основные понятия и определения 4
2 Алгоритм нахождения кратчайшего пути на
сети с циклами 5
Листинг программы 11
Заключение 16
Литература
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.
Эта программа облегчает понимание данного метода и дает яркую картину принципа его работы.
При написании курсовой работы была использована различного рода литература.
ЛИТЕРАТУРА
Информация о работе Опpеделение кpатчайшего пути на сети с циклами