|
Персональные инструменты |
|||
|
Алгоритм ДейкстрыМатериал из CustisWikiВерсия от 07:40, 6 декабря 2005; BenderBot (обсуждение | вклад) (реплицировано из внутренней CustisWiki) Это снимок страницы. Он включает старые, но не удалённые версии шаблонов и изображений. Алгоритм Дейкстры (Dijkstra) предназначен для решения задачи Поиск кратчайших путей в графе. Важным фактом, позволяющим исключить перебор, является то, что если у нас есть кратчайший путь от v до w, проходящий через вершину y, назовем его , то его первая часть от v до y, , тоже будет кратчайшим путем. Действительно, если бы это было не так, т.е. существовал бы путь длины меньшей, чем , то можно было бы улучшить оптимальный путь , заменив в нем на . В алгоритме Дейкстры, мы, итерационно поддерживаем два множества вершин:
На каждой итерации, мы выбираем из достижимых вершин вершину v, самую ближайшую к стартовой вершине s, и переносим ее из множества ToVisit в множество Visited, увеличиваем множество «кандидатов» ToVisit ее соседями, и пересчитываем верхнюю оценку удаленности вершин из ToVisit до вершины s. В иллюстрации выполнения алгоритма, мы показываем изменение на каждой итерации хэш-таблиц Visited и ToVisit, а в конце изображен входной граф, где сплошными линиями нарисованы имеющиеся ребра с ассоциированными длинами, а пунктиром — найденные кратчайшие пути. Важно, что алгоритм работоспособен только в случае положительных расстояний, в противном случае, можно попробовать использовать алгоритм Флойда-Уоршолла. Код алгоритма, представлен в виде функции на языке Python. # Находит кратчайшие пути из одной вершины # во все остальные. def dijkstra(G,s): print "StartVertice:",s # хэш-таблица вершин, до которых построены кратчайшие пути, (узел:стоимость) Visited={} # хэш-таблица вершин, до которых еще не построены кратчайшие пути, (узел:стоимость) ToVisit={s:0} Paths = {s:[s]} # хэш-таблица (узел:кратчайший путь) while ToVisit: # пока есть вершины, до которых не построен кратчайший путь print Visited, ToVisit, "-------->", v=argmin(ToVisit) # выбираем ближайшую Visited[v]=ToVisit[v]; del ToVisit[v]; # считаем, что до нее кратчайший путь найден for w in G.neighbors(v): # для всех соседей вершины $v$ if (w not in Visited): # к которым еще не нашли кратчайший путь vwLength = Visited[v] + G.get_edge(v,w) # обновляем кратчайшие пути if (w not in ToVisit) or (vwLength < ToVisit[w]): ToVisit[w] = vwLength Paths[w] = Paths[v]+[w] print Visited, ToVisit print Visited, Paths return (Visited,Paths) StartVertice: 2 {} {2: 0} --------> {2: 0} {1: 15, 3: 20, 4: 15} {2: 0} {1: 15, 3: 20, 4: 15} --------> {1: 15, 2: 0} {0: 75, 3: 20, 4: 15} {1: 15, 2: 0} {0: 75, 3: 20, 4: 15} --------> {1: 15, 2: 0, 4: 15} {0: 75, 3: 20} {1: 15, 2: 0, 4: 15} {0: 75, 3: 20} --------> {1: 15, 2: 0, 3: 20, 4: 15} {0: 70} {1: 15, 2: 0, 3: 20, 4: 15} {0: 70} --------> {0: 70, 1: 15, 2: 0, 3: 20, 4: 15} {} {0: 70, 1: 15, 2: 0, 3: 20, 4: 15} {0: [2, 3, 0], 1: [2, 1], 2: [2], 3: [2, 3], 4: [2, 4]}
Внимание! Эта статья была создана путем автоматического реплицирования из внутренней базы знаний компании Заказные Информ Системы. Любые правки этой статьи могут быть перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion». |
||