Графтардағы барлық ең қысқа жолдарды табу алгоритмі
Floyd–Warshall algorithm
Флойд-Уоршелл алгоритмі: ең қысқа жолдарды табу, теріс салмақтармен графтардағы барлық жұптар арасындағы қашықтықты есептеу. Динамикалық бағдарламалау.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Графтардағы барлық жұптар арасындағы ең қысқа жолдарды табу алгоритмі, кейбір қабырға салмақтарының теріс болуына рұқсат береді. Компьютер ғылымында Флойд-Уоршалл алгоритмі (Флойд алгоритмі, Рой-Уоршалл алгоритмі, Рой-Флойд алгоритмі немесе WFI алгоритмі деп те аталады) – оң немесе теріс қабырға салмақтары бар (бірақ теріс циклдары жоқ) бағытталған салмақталған графтың ең қысқа жолдарын табу алгоритмі. Алгоритмді бір рет орындау барлық төбелер арасындағы ең қысқа жолдардың ұзындығын (жинақталған салмақтарын) анықтайды. Ол жолдардың өзі туралы толық мәлімет бермесе де, алгоритмге қарапайым өзгерістер енгізу арқылы жолдарды қайта құруға болады. Алгоритмнің нұсқалары қатынастың транзитивті жабылуын табуға немесе (Шульце дауыс беру жүйесімен байланысты) салмақталған графтың барлық төбелері арасындағы ең кең жолдарды табуға да қолданылуы мүмкін.
Algorithm for finding all pairs shortest paths in graphs, allowing some edge weights to be negative
In computer science, the Floyd–Warshall algorithm (also known as Floyd's algorithm, the Roy–Warshall algorithm, the Roy–Floyd algorithm, or the WFI algorithm) is an algorithm for finding shortest paths in a directed weighted graph with positive or negative edge weights (but with no negative cycles). A single execution of the algorithm will find the lengths (summed weights) of shortest paths between all pairs of vertices. Although it does not return details of the paths themselves, it is possible to reconstruct the paths with simple modifications to the algorithm. Versions of the algorithm can also be used for finding the transitive closure of a relation , or (in connection with the Schulze voting system) widest paths between all pairs of vertices in a weighted graph.
Тарих және атау
Флойд-Варшалл алгоритмі – динамикалық бағдарламалаудың мысалы, және оны Роберт Флойд 1962 жылы қазіргі танылған түрінде жариялаған. Дегенмен, ол негізінен Бернард Ройдің 1959 жылы және Стивен Уоршаллдың 1962 жылы графтың транзитивті жабылуын табу үшін жариялаған алгоритмдерімен бірдей, сондай-ақ детерминистік шекті автоматты тұрақты өрнекке түрлендіруге арналған Клейн алгоритмімен (1956 жылы жарияланған) тығыз байланысты. Алгоритмнің үш ұялы цикл түріндегі қазіргі заманғы формуласын алғаш рет Питер Ингерман да 1962 жылы сипаттаған.
The Floyd–Warshall algorithm is an example of dynamic programming, and was published in its currently recognized form by Robert Floyd in 1962. However, it is essentially the same as algorithms previously published by Bernard Roy in 1959 and also by Stephen Warshall in 1962 for finding the transitive closure of a graph, and is closely related to Kleene's algorithm (published in 1956) for converting a deterministic finite automaton into a regular expression. The modern formulation of the algorithm as three nested for loops was first described by Peter Ingerman, also in 1962.
Алгоритм
Флойд-Уоршелл алгоритмі графтың әрбір екі төбесі арасындағы көптеген мүмкін жолдарды салыстырады. Ол барлық ең қысқа жолдарды табуға кепілдік береді және мұны графтың салыстырулары арқылы істей алады. Алгоритмді орындау кезінде, егер теріс цикл болса, экспоненциалды түрде үлкен сандар пайда болуы мүмкін, мысалы , мұндағы – графтың ең үлкен абсолюттік мәні бар теріс жиегі. Ағып кету/ағып түсу проблемаларын болдырмау үшін алгоритмнің ішкі for циклінде жол матрицасының диагоналіндегі теріс сандарды тексеру қажет. Әрине, бағытталмаған графта теріс жиек оның жанасқан төбелерін қамтитын теріс циклды (яғни, жабық жол) құрайды. Мысалы, жоғарыдағы графтың барлық жиектерін бағытталмаған деп есептесек, 4 – 2 – 4 төбелік тізбегі –2 салмақ қосындысы бар цикл болып табылады.
The Floyd–Warshall algorithm compares many possible paths through the graph between each pair of vertices. It is guaranteed to find all shortest paths and is able to do this with comparisons in a graph, During the execution of the algorithm, if there is a negative cycle, exponentially large numbers can appear, as large as , where is the largest absolute value of a negative edge in the graph. To avoid overflow/underflow problems one should check for negative numbers on the diagonal of the path matrix within the inner for loop of the algorithm. Obviously, in an undirected graph a negative edge creates a negative cycle (i. e., a closed walk) involving its incident vertices. Considering all edges of the above example graph as undirected, e. g. the vertex sequence 4 – 2 – 4 is a cycle with weight sum −2.
Жолды қайта құру
Флойд-Уоршелл алгоритмі әдетте барлық төбелер арасындағы жолдардың ұзындығын ғана ұсынады. Шамалы өзгертулер енгізу арқылы кез келген екі соңғы төбе арасындағы нақты жолды қайта құру әдісін жасау мүмкін. Әр төбеден басқа төбеге дейінгі нақты жолды сақтауға ұмтылуға болар болса да, бұл қажет емес, тіпті жад жағынан өте шығынды. Оның орнына, ең қысқа жол ағашын пайдалануға болады, оны әр түйін үшін уақыт ішінде жад көлемімен есептеуге болады және кез келген екі байланысты төбе арасындағы бағытталған жолды тиімді түрде қайта құруға мүмкіндік береді.
The Floyd–Warshall algorithm typically only provides the lengths of the paths between all pairs of vertices. With simple modifications, it is possible to create a method to reconstruct the actual path between any two endpoint vertices. While one may be inclined to store the actual path from each vertex to each other vertex, this is not necessary, and in fact, is very costly in terms of memory. Instead, we can use the shortest path tree, which can be calculated for each node in time using memory, and allows us to efficiently reconstruct a directed path between any two connected vertices.
Басқа қысқа жол алгоритмімен салыстыру
Теріс емес жиек салмақтары бар графтар үшін Дикстра алгоритмін бір шыңынан барлық ең қысқа жолдарды табу үшін қолдануға болады. Осылайша, әр шыңынан Дикстраны іске қосу белгілі бір уақытты қажет етеді. Графтың өлшемі болғандықтан, бұл қайталама Дикстраның ең нашар жағдайдағы жұмыс уақытын береді. Бұл Флойд-Уоршалл алгоритмінің асимптотикалық ең нашар жағдайдағы жұмыс уақытына сәйкес келсе де, тұрақты шамалар маңызды рөл атқарады. Граф тығыз болса (яғни, ), Флойд-Уоршалл алгоритмі практикада жақсы нәтижелер көрсетеді. Граф сирек болған кезде (яғни, -ден едәуір кішірек болса), Дикстра басымдық алады. Сирек графтар үшін, егер жиектері терiс болса, бірақ терiс циклдар болмаса, Джонсон алгоритмін қолдануға болады, ол қайталама Дикстра тәсілімен бірдей асимптотикалық жұмыс уақытына ие. Тығыз графтардағы барлық жұптардың ең қысқа жолын есептеуді жылдамдату үшін жылдам матрицалық көбейтуді пайдаланатын алгоритмдер де бар, бірақ олар әдетте жиек салмақтарына қосымша талаптар қояды (мысалы, олардың кіші бүтін сандар болуын қажет етеді). Бұған қоса, олардың жұмыс уақытындағы жоғары тұрақты факторларының салдарынан, олар тек өте үлкен графтар үшін ғана Флойд-Уоршалл алгоритмінен жылдамдық бере алады.
For graphs with non negative edge weights, Dijkstra's algorithm can be used to find all shortest paths from a single vertex with running time Thus, running Dijkstra starting at each vertex takes time Since , this yields a worst case running time of repeated Dijkstra of While this matches the asymptotic worst case running time of the Floyd Warshall algorithm, the constants involved matter quite a lot. When a graph is dense (i. e., ), the Floyd Warshall algorithm tends to perform better in practice. When the graph is sparse (i. e., is significantly smaller than ), Dijkstra tends to dominate. For sparse graphs with negative edges but no negative cycles, Johnson's algorithm can be used, with the same asymptotic running time as the repeated Dijkstra approach. There are also known algorithms using fast matrix multiplication to speed up all pairs shortest path computation in dense graphs, but these typically make extra assumptions on the edge weights (such as requiring them to be small integers). In addition, because of the high constant factors in their running time, they would only provide a speedup over the Floyd–Warshall algorithm for very large graphs.