Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Пошук найкоротшого шляху. Графи

Содержание

Задача Прима-КраскалаЗавдання: з'єднати N міст телефонною мережею так, щоб довжина телефонних ліній була мінімальною. Те ж завдання: дано зв'язний граф з N вершинами, веги ребер задані ваговою матрицею W. Потрібно знайти набір ребер, що з'єднує всі
ГрафиПошук найкоротшого шляху© К.Ю. Поляков, 2008-2010Переклад: Р. М. Васильчик Задача Прима-КраскалаЗавдання: з'єднати N міст телефонною мережею так, щоб довжина телефонних ліній Жадібний алгоритмЖадібний алгоритм – це багатокроковий алгоритм, в якому на кожному кроці Реалізація алгоритму Прима-КраскалаПроблема: як перевірити, що  1) ребро не вибрано, і Реалізація алгоритму Прима-КраскалаСтруктура «ребро»:type rebro = record    i, j: Реалізація алгоритму Прима-Краскалаfor k:=1 to N-1 do begin min := MaxInt; for Складність алгоритмуОсновний цикл:O(N3)for k:=1 to N-1 do begin ...  for i:=1 Найкоротші шляхи (алгоритм Дейкстри)Завдання: задана мережа доріг між містами, частина яких можуть Алгоритм Дейкстри Реалізація алгоритму ДейкстриМасиви:масив a, такий що a[i]=1, якщо вершина вже розглянута, і Реалізація алгоритму ДейкстриОсновний цикл:якщо всі вершини розглянуті, то стоп.серед всіх нерозглянутих вершин Реалізація алгоритму ДейкстриКрок 2:Крок 3: Як вивести маршрут?Результат роботи алгоритму Дейкстри:довжини шляхівМаршрут з вершини 0 в вершину Алгоритм Флойда-УоршеллаЗавдання: задана мережа доріг між містами, частина яких може мати односторонній Алгоритм Флойда-УоршеллаВерсія з запам'ятовуванням маршруту:for i:= 1 to N for j := Завдання комівояжераЗавдання комівояжера. Комівояжер (бродячий торговець) повинен вийти з першого міста і, Інші класичні завданняЗавдання на мінімум суми. Є N населених пунктів, у кожному
Слайды презентации

Слайд 2 Задача Прима-Краскала
Завдання: з'єднати N міст телефонною мережею так,

Задача Прима-КраскалаЗавдання: з'єднати N міст телефонною мережею так, щоб довжина телефонних

щоб довжина телефонних ліній була мінімальною.
Те ж завдання:

дано зв'язний граф з N вершинами, веги ребер задані ваговою матрицею W. Потрібно знайти набір ребер, що з'єднує всі вершини графа (остовне дерево) і має найменшу вагу.

Слайд 3 Жадібний алгоритм
Жадібний алгоритм – це багатокроковий алгоритм, в

Жадібний алгоритмЖадібний алгоритм – це багатокроковий алгоритм, в якому на кожному

якому на кожному кроці приймається рішення, краще в даний

момент.

Крок в задачі Прима-Краскала – це вибір ще невибраного ребра і додавання його до рішення.


Слайд 4 Реалізація алгоритму Прима-Краскала
Проблема: як перевірити, що 1) ребро

Реалізація алгоритму Прима-КраскалаПроблема: як перевірити, що 1) ребро не вибрано, і

не вибрано, і 2) ребро не утворює циклу з

вибраними ребрами.
Рішення: присвоїти кожній вершині свій колір і перефарбовувати вершини при додаванні ребра.

3

2

4

5

Алгоритм:
пофарбувати всі вершини в різні кольори;
зробити N-1 раз в циклі:
вибрати ребро (i,j) мінімальної довжини з усіх ребер, що з'єднують вершини різного кольору;
перефарбувати всі вершини, що мають колір j, в колір i.
вивести знайдені ребра.

4


Слайд 5 Реалізація алгоритму Прима-Краскала
Структура «ребро»:
type rebro = record

Реалізація алгоритму Прима-КраскалаСтруктура «ребро»:type rebro = record  i, j: integer;

i, j: integer; { номери вершин }


end;

const N = 5;
var W: array[1..N,1..N] of integer;
Color: array[1..N] of integer;
i, j, k, min, col_i, col_j: integer;
Reb: array[1..N-1] of rebro;
begin
... { тут треба ввести матрицю W }
for i:=1 to N do { розфарбувати в різні кольори }
Color[i] := i;
... { основний алгоритм – заповнення масиву Reb }
... { вивести знайдені ребра (масив Reb)}
end.

Основна програма:

вагова матриця

колір вершин


Слайд 6 Реалізація алгоритму Прима-Краскала
for k:=1 to N-1 do begin

Реалізація алгоритму Прима-Краскалаfor k:=1 to N-1 do begin min := MaxInt;

min := MaxInt;
for i:=1 to N do

for j:=i+1 to N do
if (Color[i] <> Color[j]) and
(W[i,j] < min) then begin
min := W[i,j];
Reb[k].i := i;
Reb[k].j := j;
col_i := Color[i];
col_j := Color[j];
end;
for i:=1 to N do
if Color[i] = col_j then
Color[i] := col_i;
end;

Основний алгоритм:

потрібно вибрати всього N-1 ребро

цикл по всіх парах вершин

враховуємо тільки пари з різним кольором вершин

запам'ятовуємо ребра і кольори вершин

перефарбовуєм вершини кольору col_j


Слайд 7 Складність алгоритму
Основний цикл:
O(N3)
for k:=1 to N-1 do begin

Складність алгоритмуОсновний цикл:O(N3)for k:=1 to N-1 do begin ... for i:=1

...
for i:=1 to N do
for

j:=i+1 to N do
...
end;

три вкладених цикли, в кожному кількість кроків <=N

зростає не швидше, ніж N3

Необхідна пам'ять:

var W: array[1..N,1..N] of integer;
Color: array[1..N] of integer;
Reb: array[1..N-1] of rebro;

O(N2)


Кількість операцій:


Слайд 8 Найкоротші шляхи (алгоритм Дейкстри)
Завдання: задана мережа доріг між

Найкоротші шляхи (алгоритм Дейкстри)Завдання: задана мережа доріг між містами, частина яких

містами, частина яких можуть мати односторонній рух. Знайти найкоротші

відстані від заданого міста до всіх інших міст.

Та же завдання: дано зв'язний граф з N вершинами, ваги ребер задані матрицею W. Знайти найкоротші відстані від заданої вершини до всіх інших.

присвоїти всім вершинам мітку ∞;
серед нерозглянутих вершин знайти вершину j з найменшою міткою;
для кожної необробленої вершини i: якщо шлях до вершини i через вершину j менше існуючої мітки, замінити мітку на нову відстань;
якщо залишилися необроблені вершини, перейти до кроку 2;
мітка = мінімальна відстань.

Алгоритм Дейкстри (E.W. Dijkstra, 1959)


Слайд 9 Алгоритм Дейкстри

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

Слайд 10 Реалізація алгоритму Дейкстри
Масиви:
масив a, такий що a[i]=1, якщо

Реалізація алгоритму ДейкстриМасиви:масив a, такий що a[i]=1, якщо вершина вже розглянута,

вершина вже розглянута, і a[i]=0, якщо ні.
масив b, такий

що b[i] – довжина поточного найкоротшого шляху з заданої вершини x в вершину i;
масив c, такий що c[i] – номер вершини, з якої потрібно йти в вершину i в поточному найкоротшому шляху.
Ініціалізація:
заповнити масив a нулями (вершини не оброблені);
записати в b[i] значення W[x][i];
заповнити масив c значеннями x;
записати a[x]=1.

Слайд 11 Реалізація алгоритму Дейкстри
Основний цикл:
якщо всі вершини розглянуті, то

Реалізація алгоритму ДейкстриОсновний цикл:якщо всі вершини розглянуті, то стоп.серед всіх нерозглянутих

стоп.
серед всіх нерозглянутих вершин (a[i]=0) знайти вершину j, для

якої b[i] – мінімальне;
записати a[j]:=1;
для всіх вершин k: якщо шлях в вершину k через вершину j коротший, ніж знайдений раніше найкоротший шлях, запам'ятати його: записати b[k]:=b[j]+W[j,k] і c[k]=j.

Крок 1:


Слайд 12 Реалізація алгоритму Дейкстри
Крок 2:
Крок 3:

Реалізація алгоритму ДейкстриКрок 2:Крок 3:

Слайд 13 Як вивести маршрут?
Результат роботи алгоритму Дейкстри:
довжини шляхів
Маршрут з

Як вивести маршрут?Результат роботи алгоритму Дейкстри:довжини шляхівМаршрут з вершини 0 в

вершини 0 в вершину 4:
4


5
2
0



Складність алгоритму Дейкстри:
O(N2)
два вкладених цикли

по N кроків

Виведення маршруту в вершину i (використання масиву c):
встановити z:=i;
поки c[i]<>x присвоїти z:=c[z] і вивести z.


Слайд 14 Алгоритм Флойда-Уоршелла
Завдання: задана мережа доріг між містами, частина

Алгоритм Флойда-УоршеллаЗавдання: задана мережа доріг між містами, частина яких може мати

яких може мати односторонній рух. Знайти всі найкоротші відстані,

від кожного міста до всіх інших міст.

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!


Слайд 15 Алгоритм Флойда-Уоршелла
Версія з запам'ятовуванням маршруту:
for i:= 1 to

Алгоритм Флойда-УоршеллаВерсія з запам'ятовуванням маршруту:for i:= 1 to N for j

N
for j := 1 to N
c[i,j]

:= i;
...
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;

i–ий рядок будується так само, як масив c в алгоритмі Дейкстри

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

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

O(N3)


Слайд 16 Завдання комівояжера
Завдання комівояжера. Комівояжер (бродячий торговець) повинен вийти

Завдання комівояжераЗавдання комівояжера. Комівояжер (бродячий торговець) повинен вийти з першого міста

з першого міста і, відвідавши по разу в невідомому

порядку міста 2,3,...N, повернуться назад в перше місто. У якому порядку треба обходити міста, щоб замкнутий шлях (тур) комівояжера був найкоротший?

Точні методи:
простий перебір;
метод гілок і меж;
метод Літтла;

Наближені методи:
метод випадкових перестановок (Matlab);
генетичні алгоритми;
метод мурашиних колоній;

великий час рахунку для великих N

O(N!)

не гарантується оптимальне рішення


  • Имя файла: poshuk-naykorotshogo-shlyahu-grafi.pptx
  • Количество просмотров: 112
  • Количество скачиваний: 0