Поиск ближайшей остановки из массива с использованием алгоритма Дейкстры [закрыто]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Поиск ближайшей остановки из массива с использованием алгоритма Дейкстры [закрыто]

Сообщение Anonymous »

Код: Выделить всё

#This is a dictionary with a list of stops and their coordinates
nodes = {"Склад": (43.356374, 132.072318), "Некрасовская": (43.128128, 131.910649), "3-я Рабочая": (43.123089, 131.924877),
"Центр": (43.115797, 131.885064), "Луговая": (43.128078, 131.940321), "Нивельского": (43.112586, 131.943152), "Нейбута": (43.116441, 131.955245), "ДВФУ": (43.025101, 131.894189), "ВВГУ": (43.124382, 131.90513), "ТГМУ": (43.133508, 131.910539)}
valuegor = list(nodes.keys())

#This is the formation of paths between nodes of the graph
init_graph["3-я Рабочая"]["ВВГУ"] = round(GD(nodes["3-я Рабочая"], nodes["ВВГУ"]).km + 5, 2)
init_graph["3-я Рабочая"]["ТГМУ"] = round(GD(nodes["3-я Рабочая"], nodes["ТГМУ"]).km + 5, 2)
init_graph["ТГМУ"]["ВВГУ"] = round(GD(nodes["ТГМУ"], nodes["ВВГУ"]).km + 5, 2)

#This is a function of running Dijkstra's algorithm, which runs through an array "array" and outputs the result in the order in which we entered the stops in this array.
#"Selected_value" is always the starting position selected by the user, znach is the destination point, previous_znach is made so that the destination point from the previous iteration of the cycle becomes the starting point in the next iteration
#Actually, I think that it is necessary to change just this function, so that instead of sequentially displaying stops, it outputs them based on which stop is closer to the starting one and so on until the array "array" ends
def run_dijkstra():
global selected_value
global selected_value1
global selected_value2
route_value = 0

if selected_value:
for index, znach in enumerate(array):
previous_index = index -1
if index == 0:
graph = Graph(nodes, init_graph)
previous_nodes, shortest_path = dijkstra_algorithm(graph=graph, start_node= selected_value)
print_result(previous_nodes, shortest_path, start_node= selected_value, target_node=znach)
route_value += shortest_path[znach]

elif index < len(array):
previous_znach = array[previous_index]
graph = Graph(nodes, init_graph)
previous_nodes, shortest_path = dijkstra_algorithm(graph=graph, start_node= previous_znach)
print_result(previous_nodes, shortest_path, start_node= previous_znach, target_node=znach)
route_value += shortest_path[znach]
Весь этот код — реализация алгоритма Дейкстры для поиска кратчайших маршрутов между остановками. Сделано так, что в массив заносится пул остановок, и до каждой из них будет рассчитано кратчайшее расстояние, а также отображены остановки, лежащие на пути к ним.
В качестве примера данных я использую словарь «узлы», в котором значениями являются координаты остановок, а ключевыми — их названия.
пути между узлами части графа строятся с помощью функции "init_graph".
Собственно в этом и вопрос.
Нужно переделать функцию run_dijkstra таким образом, чтобы останавливалась на массиве отображаются не в том порядке, в котором они были введены, а в зависимости от того, какая остановка ближе всего к начальной точке.
Как я примерно представляю, функция run_dijkstra полностью прогоняет массив массива, находит расстояние от начальной точки до каждой точки из массива и выбирает самую короткую, после чего эта выбранная точка становится начальной, удаляется из массива, а массив запускается заново и так до тех пор, пока массив не закончится.
Мне нужна помощь, как это реализовать. Если у вас есть идеи, как это можно сделать лучше, буду рад их прочитать.
В таком виде программа отображает остановки одну за другой по мере их внесения в массив.
Мне нужно, чтобы они отображались в зависимости от того, какой стоп ближе к начальной точке.
Допустим, теперь массив стопов «массив», который мы самостоятельно вводим, выглядит так [ ДВФУ, ДВГУ, ТГМУ], то результат работы программы будет следующий:
"Найден следующий лучший маршрут с расстоянием 56,02 км
Склад -> Некрасовская -> 3-я Рабочая -> ДВФУ
Найден следующий лучший маршрут с расстоянием 22,78 км
ДВФУ -> 3-й рабочий -> ВВГУ
Найден следующий лучший маршрут с расстоянием 6,11 км
ВВСУ -> ТСМУ"
А мне нужно, чтобы он нашел ближайшую к нему остановку от исходного положения, то есть от склада в данном случае, в данном примере это должно быть ТСМУ , то отсчет должен идти от ТГМУ до ВВГУ и наконец от ВВГУ до ДВФУ, то есть примерно так:
"Найден следующий лучший маршрут с расстоянием 46,49 км
Склад -> Некрасовская -> 3-я рабочая -> ТГМУ
Найден следующий лучший маршрут с расстоянием 6,11 км
ТГМУ -> ВВГУ
Найден следующий лучший маршрут с расстоянием 22,78 кмВВГУ -> 3-й рабочий -> ДВФУ"

Подробнее здесь: https://stackoverflow.com/questions/784 ... -algorithm
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»