
Алгоритмы на графах. Поиск маршрутов / Алгоритм Форда-Беллмана
.htmАлгоритм Форда-Беллмана A { TEXT-DECORATION: none } A:hover { COLOR: #ff6600; TEXT-DECORATION: underline } H2 { FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: sans-serif } PRE { FONT-SIZE: 9pt } .source { FONT-SIZE: 9pt; COLOR: #666699 } .l2 { FONT-SIZE: 10pt } .l3 { FONT-SIZE: 9pt }
Path: Математика » Графы и маршруты » Кратчайшие пути » Алгоритм Форда-Беллмана Алгоритм Форда-Беллмана
Обозначим через МинСт(1,s,к) наименьшую стоимость проезда из 1 в s менее чем с k пересадками. Тогда выполняется такое соотношение:
МинСт (1,s,k+1) = наименьшему из чисел МинСт(1,s,k) и МинСт(1,i,k) + a[i][s] (i=1..n)
Как отмечалось выше, искомым ответом является МинСт(1,i,n) для всех i=1..n. k:= 1; for i := 1 to n do begin x[i] := a[1][i]; end; {инвариант: x[i] := МинСт(1,i,k)} while k <> n do begin | for s := 1 to n do begin | | y[s] := x[s]; | | for i := 1 to n do begin | | | if y[s] > x[i]+a[i][s] then begin | | | | y[s] := x[i]+a[i][s]; | | | end; | | end | | {y[s] = МинСт(1,s,k+1)} | | for i := 1 to n do begin x[s] := y[s]; end; | end; | k := k + 1; end; Это - алгоритмом динамического программирования, или алгоритмом Форда - Беллмана.
Программа останется правильной , даже если не заводить массива y, а производить изменения в самом массиве x (заменив в программе все вхождения буквы y на x и затем удалить ставшие лишними строки).
Этот алгоритм может быть улучшен в двух отношениях: можно за то же время O(n3) найти наименьшую стоимость проезда i->j для ВСЕХ пар i,j (а не только с i=1), а можно сократить время работы до O(n в степени 2). Правда, в последнем случае нам потребуется, чтобы все цены a[i][j] были неотрицательны.
Обсудить на форуме »
Комментарии для веб-мастера
Автор: Nikolai
Время: 17-10-03 10:29
The most important thing here is to understand: МинСт (1,s,k+1) = наименьшему из чисел МинСт(1,s,k) и МинСт(1,i,k) + a[i][s] (i=1..n)
Автор: Eleshka
Время: 04-12-03 05:12
Esli znatj kak voobsche dejstvujut algoritmi po nahozhdeniju kratchajshego puti, to vse oboznachenija ponjatni: a - massiv vershin s ih dlinnoj puti n - kol-vo vershin k - verhsini, cherez kotorie lezhit korotkij putj s - vershina-konec grafa
Автор: sh
Время: 09-12-03 10:07
алгоритм взят из книжки Шеня, без переделок и комментариев. читайте оригинал
Автор: Без имени
Время: 06-01-04 09:43
Хе! Ето на каком языке писано? Pascal видимо? А чо за | | | |?
Автор: мало по графам
Время: 08-03-04 10:33
Автор: я
Время: 26-04-04 10:24
блин мне не нужна реализация мне бы узнать как он по русски звучит ... не подкинете ссылочку ... очень надо пожалуйста
Автор: Sergey
Время: 05-09-04 01:47
Блин! Ребята! Тут же всё написано: МинСт (1,s,k+1) = наименьшему из чисел МинСт(1,s,k) и МинСт(1,i,k) + a[i][s] (i=1..n) Если нехрена не понимаете, то читайте что такое динамическое программирование... Статья про Алгоритм Форма-Беллмана, а не про динамическое программирование.
Автор: COOPER
Время: 10-12-04 05:01
Тот, кто знает, тот все поймет, а тот, кто ни хрена не понимает, должен учиться, учиться и учиться!
Автор: Арсен
Время: 14-12-04 10:43
Вы суки мне нужен курсовик а то Хоменко порвет!!! а тут вес не то что надо...
Автор: к Арсену
Время: 09-01-05 03:15
Хм... Хоменко, говоришь.....интересно... енто случайн не тетя Таня?:)
Автор: Арт
Время: 06-02-05 06:16
Нда, ребят. Вы прочитайте Окулова: Программирование в алгоритмах. Там всё основное о графах. А потом сядбте за Кормена. вот и все дела. Не зная обхода в ширину вы не сможете допетрить до форда-Беллмана.
Ваши комментарии. Вопросы будут удалены: для них есть форум. Имя: E-mail:
Copyright 2000-2002 © Ilia Kantor, при поддержке проекта MANUAL.RU
[AD-SIZE] hotlog_js="1.0";hotlog_d=document; hotlog_n=navigator;hotlog_rn=Math.random(); hotlog_n_n=(hotlog_n.appName.substring(0,3)=="Mic")?0:1; hotlog_r=""+hotlog_rn+"&s=2161&r="+escape(hotlog_d.referrer)+"&pg="+ escape(window.location.href); hotlog_d.cookie="hotlog=1"; hotlog_r+="&c="+(hotlog_d.cookie?"Y":"N"); hotlog_d.cookie="hotlog=1; expires=Thu, 01-Jan-70 00:00:01 GMT" hotlog_js="1.1";hotlog_r+="&j="+(navigator.javaEnabled()?"Y":"N") hotlog_js="1.2";hotlog_s=screen; hotlog_r+="&wh="+hotlog_s.width+'x'+hotlog_s.height+"&px="+((hotlog_n_n==0)? hotlog_s.colorDepth:hotlog_s.pixelDepth) hotlog_js="1.3" hotlog_r+="&js="+hotlog_js; hotlog_d.write("")