пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Динамические структуры данных (ДСД). Граф. Алгоритм Дейкстры, его реализация. Алгоритм Флойда-Уоршелла. Задача коммивояжера, сложности ее решения.

Строение ДСД: набор узлов, объединенных с помощью ссылок. Вид узла: Данные+ссылки на другие узлы. Типы структур: Списки, деревья, графы.

Граф – это набор вершин (узлов) и соединяющих их ребер (дуг).

Направленный граф (ориентированный, орграф) – это граф, в котором все дуги имеют направления.

Цепь – это последовательность ребер, соединяющих две вершины (в орграфе – путь).

Цикл – это цепь из какой-то вершины в нее саму.

 

Взвешенный граф (сеть) – это граф, в котором каждому ребру приписывается вес (длина).

Связный граф – это граф, в котором существует цепь между каждой парой вершин.

k-cвязный граф – это граф, который можно разбить на k связных частей.

Кратчайшие пути (алгоритм Дейкстры)

Задача: задана сеть дорог между городами, часть которых могут иметь одностороннее движение. Найти кратчайшие расстояния от заданного города до всех остальных городов.

Та же задача: дан связный граф с N вершинами, веса ребер заданы матрицей W. Найти кратчайшие расстояния от заданной вершины до всех остальных.

Алгоритм Дейкстры:

1)присвоить всем вершинам метку ∞;

2)среди нерассмотренных вершин найти вершину j с наименьшей меткой;

3)для каждой необработанной вершины i: если путь к вершине i через вершину j меньше существующей метки, заменить метку на новое расстояние;

4)если остались необработанны вершины, перейти к шагу 2;

5)метка = минимальное расстояние.

Реализация:

Массивы:

1)массив a, такой что a[i]=1, если вершина уже рассмотрена, и a[i]=0, если нет.

2)массив b, такой что b[i] – длина текущего кратчайшего пути из заданной вершины x в вершину i;

3)массив c, такой что c[i] – номер вершины, из которой нужно идти в вершину i в текущем кратчайшем пути.

Инициализация:

1)заполнить массив a нулями (вершины не обработаны);

2)записать в b[i] значение W[x][i];

3)заполнить массив c значением x;

4)записать a[x]=1.

Основной цикл:

1)если все вершины рассмотрены, то стоп.

2)среди всех нерассмотренных вершин (a[i]=0) найти вершину j, для которой b[i] – минимальное;

3)записать a[j]:=1;

4)для всех вершин k: если путь в вершину k через вершину j короче, чем найденный ранее кратчайший путь, запомнить его: записать b[k]:=b[j]+W[j,k] и c[k]=j.

Вывод маршрута в вершину i (использование массива c):

1)установить z:=i;

2)пока c[i]<>x присвоить z:=c[z] и вывести z.

Сложность Алгоритма: 2 цикла по n шагов => n^2

Алгоритм Флойда-Уоршелла:

Задача: задана сеть дорог между городами, часть которых могут иметь одностороннее движение. Найти все кратчайшие расстояния, от каждого города до всех остальных городов.

Реализация:

Нет информации о маршруте, только кратчайшие расстояния!

for  k: =1 to N

 for  i: = 1 to N

            for  j: = 1 to N

            if W[i,j]  >  W[i,k] + W[k,j]  then

            W[i,j] := W[i,k] + W[k,j];

Если из вершины i в вершину j короче ехать через вершину k,мы едем через вершину k!

Версия с запоминанием маршрута:

for  i:= 1 to N

 for  j := 1 to N

            c[i,j] := i; // i–ая строка строится так же, как массив c в алгоритме Дейкстры

...

for  k: =1 to N

 for  i: = 1 to N

            for  j: = 1 to N

            if W[i,j]  >  W[i,k] + W[k,j]  then begin

            W[i,j] := W[i,k] + W[k,j];

            c[i,j] := c[k,j];

            end;

в конце цикла c[i,j] – предпоследняя вершина в кратчайшем маршруте из вершины i в вершину j

Сложность алгоритма: N^3

Задача коммивояжера

Коммивояжер (бродячий торговец) должен выйти из первого города и, посетив по разу в неизвестном порядке города 2,3,...N, вернуться обратно в первый город. В каком порядке надо обходить города, чтобы замкнутый путь (тур) коммивояжера был кратчайшим?

Это NP-полная задача, которая строго решается только перебором вариантов (пока)!

Точные методы(большое время счета для больших N. Сложность N!):

1)простой перебор;

2)метод ветвей и границ;

3)метод Литтла;

4)…

Приближенные методы(не гарантируется оптимальное решение):

1)метод случайных перестановок (Matlab);

2)генетические алгоритмы;

3)метод муравьиных колоний;

4)…


 

27.      


22.01.2015; 17:37
хиты: 206
рейтинг:0
Точные науки
информатика
Языки программирования
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь