dijkstra#
- scipy.sparse.csgraph.dijkstra(csgraph, направленный=True, индексы=None, return_predecessors=False, невзвешенный=False, limit=np.inf, min_only=False)#
Алгоритм Дейкстры с использованием очереди с приоритетом
Добавлено в версии 0.11.0.
- Параметры:
- csgrapharray_like, или разреженный массив или матрица, 2 измерения
Массив N x N неотрицательных расстояний, представляющий входной граф.
- направленныйbool, необязательно
Если True (по умолчанию), то найти кратчайший путь на ориентированном графе: перемещаться только от точки i к точке j по путям csgraph[i, j] и от точки j к i по путям csgraph[j, i]. Если False, то найти кратчайший путь на неориентированном графе: алгоритм может переходить от точки i к j или от j к i по любому из csgraph[i, j] или csgraph[j, i].
Предупреждение
Обратитесь к примечаниям ниже при использовании с
directed=False.- индексыarray_like или int, опционально
если указано, вычислять только пути от точек с заданными индексами.
- return_predecessorsbool, необязательно
Если True, возвращает матрицу предшественников размера (N, N).
- невзвешенныйbool, необязательно
Если True, то находить невзвешенные расстояния. То есть вместо нахождения пути между каждой точкой, минимизирующего сумму весов, находить путь, минимизирующий количество рёбер.
- limitfloat, опционально
Максимальное расстояние для расчета, должно быть >= 0. Использование меньшего предела сократит время вычислений, прерывая расчеты между парами, разделенными расстоянием > предела. Для таких пар расстояние будет равно np.inf (т.е., не соединены).
Добавлено в версии 0.14.0.
- min_onlybool, необязательно
Если False (по умолчанию), для каждого узла в графе найдите кратчайший путь от каждого узла в индексах. Если True, для каждого узла в графе найдите кратчайший путь от любого из узлов в индексах (что может быть значительно быстрее).
Добавлено в версии 1.3.0.
- Возвращает:
- dist_matrixndarray, форма ([n_indices, ]n_nodes,)
Матрица расстояний между узлами графа. Если min_only=False, dist_matrix имеет форму (n_indices, n_nodes) и dist_matrix[i, j] дает кратчайшее расстояние от точки i до точки j по графу. Если min_only=True, dist_matrix имеет форму (n_nodes,) и содержит для данного узла кратчайший путь к этому узлу от любого из узлов в индексах.
- предшественникиndarray, форма ([n_indices, ]n_nodes,)
Если
min_only=False, это имеет форму(n_indices, n_nodes), в противном случае имеет форму(n_nodes,). Если индексы равно None иmin_only=Falseзатемn_indices = n_nodesи форма матрицы становится(n_nodes, n_nodes). Возвращается только если return_predecessors == True. Матрица предшественников, которая может быть использована для восстановления кратчайших путей. Строка i матрицы предшественников содержит информацию о кратчайших путях из точки i: каждая запись predecessors[i, j] даёт индекс предыдущего узла в пути из точки i в точку j. Если путь между точками i и j не существует, то predecessors[i, j] = -9999- источникиndarray, форма (n_nodes,)
Возвращается только если min_only=True и return_predecessors=True. Содержит индекс источника, который имел кратчайший путь к каждой цели. Если путь не существует в пределах лимита, это будет содержать -9999. Значение по переданным индексам будет равно этому индексу (т.е. самый быстрый способ достичь узла i — начать с узла i).
Примечания
В текущей реализации алгоритм Дейкстры не работает для графов с расстояниями, зависящими от направления, когда directed == False. Т.е., если csgraph[i,j] и csgraph[j,i] не равны и оба ненулевые, установка directed=False не даст правильного результата.
Кроме того, эта процедура не работает для графов с отрицательными расстояниями. Отрицательные расстояния могут приводить к бесконечным циклам, которые должны обрабатываться специализированными алгоритмами, такими как алгоритм Беллмана-Форда или алгоритм Джонсона.
Если возможны несколько допустимых решений, вывод может варьироваться в зависимости от версии SciPy и Python.
Примеры
>>> from scipy.sparse import csr_array >>> from scipy.sparse.csgraph import dijkstra
>>> graph = [ ... [0, 1, 2, 0], ... [0, 0, 0, 1], ... [0, 0, 0, 3], ... [0, 0, 0, 0] ... ] >>> graph = csr_array(graph) >>> print(graph)
with 4 stored elements and shape (4, 4)> Coords Values (0, 1) 1 (0, 2) 2 (1, 3) 1 (2, 3) 3 >>> dist_matrix, predecessors = dijkstra(csgraph=graph, directed=False, indices=0, return_predecessors=True) >>> dist_matrix array([0., 1., 2., 2.]) >>> predecessors array([-9999, 0, 0, 1], dtype=int32)