Персональные инструменты
 

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

Материал из CustisWiki

Версия от 07:54, 6 марта 2007; BenderBot (обсуждение | вклад) (реплицировано из внутренней CustisWiki)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Это снимок страницы. Он включает старые, но не удалённые версии шаблонов и изображений.
Перейти к: навигация, поиск

Алгоритм Флойда-Уоршолла (Floyd-Warshall) предназначен для решения задачи Поиск кратчайших путей в графе. В отличие от алгоритма Дейкстры, он находит все кратчайшие пути в графе, к тому же, допускает наличие отрицательных весов (расстояний) на ребрах графа, при условии, что в графе не образуется циклов отрицательной длины (т. е. невозможно бесконечно уменьшать расстояние между некоторыми пунктами).

В этом алгоритме, для графа последовательно выполняются итераций, улучшая матрицу минимальных стоимостей пути из вершины i в вершину j, с возможным использованием (для k-той итерации) промежуточных вершин из множества . Вычислять эту матрицу очень легко, изначально она определяется весовой функцией ребер, , для тех i и j, для которых есть ребро (i,j), и для остальных. Обновление этой матрицы на k-той итерации происходит по очевидной формуле: , где — значение этой матрицы на предыдущей итерации. Таким образом, очевидна и корректность алгоритма, и его сложность, состовляющая .

def floyd_warshal(D):
    N=D.shape[0]  
    print_frame(D)                
    for k in xrange(N):
        #Сохраняем $D_{k-1}$ в $D_{old}$
        D_old=array(D)              
        for v1 in xrange(N):
            for v2 in xrange (N):
                D[v1,v2]=min( D[v1,v2], D_old[v1,k]+D_old[k,v2] )    
        print_frame(D,D_old,k)                
    return D

Трассировка алгоритма

Входной граф

[svg]


Итерация 1

Итерация 2

Итерация 3

Итерация 4

Итерация 5

Итерация 6


Репликация: База Знаний «Заказных Информ Систем» → «Алгоритм Флойда-Уоршолла»

Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».