Я использую код алгоритма Дейкстры с этого сайта: https://rosettacode.org/wiki/Dijkstra%27s_algorithm#Lua
К сожалению, он не работает для текущей таблицы ребер.
Я определил, что проблема исчезает, когда я удаляю соединение из 35-> 36, но это не решает проблему.
-- Graph definition
local edges = {
[34] = {[35] = 1,[37] = 1,},
[35] = {[34] = 1,[36] = 1,[46] = 1,},
[36] = {[35] = 1,[37] = 1,},
[37] = {[34] = 1,[36] = 1,},
[38] = {[46] = 1,},
[46] = {[35] = 1,[38] = 1,},
}
-- Fill in paths in the opposite direction to the stated edges
function complete (graph)
for node, edges in pairs(graph) do
for edge, distance in pairs(edges) do
if not graph[edge] then graph[edge] = {} end
graph[edge][node] = distance
end
end
end
-- Create path string from table of previous nodes
function follow (trail, destination)
local path, nextStep = destination, trail[destination]
while nextStep do
path = nextStep .. " " .. path
nextStep = trail[nextStep]
end
return path
end
-- Find the shortest path between the current and destination nodes
function dijkstra (graph, current, destination, directed)
if not directed then complete(graph) end
local unvisited, distanceTo, trail = {}, {}, {}
local nearest, nextNode, tentative
for node, edgeDists in pairs(graph) do
if node == current then
distanceTo[node] = 0
trail[current] = false
else
distanceTo[node] = math.huge
unvisited[node] = true
end
end
repeat
nearest = math.huge
for neighbour, pathDist in pairs(graph[current]) do
if unvisited[neighbour] then
tentative = distanceTo[current] + pathDist
if tentative < distanceTo[neighbour] then
distanceTo[neighbour] = tentative
trail[neighbour] = current
end
if tentative < nearest then
nearest = tentative
nextNode = neighbour
end
end
end
unvisited[current] = false
current = nextNode
until unvisited[destination] == false or nearest == math.huge
return distanceTo[destination], follow(trail, destination)
end
-- Main procedure
print("Directed:", dijkstra(edges, 34, 38, true))
print("Undirected:", dijkstra(edges, 34, 38, false))
Я получаю вывод inf, 38
с текущим содержимым таблицы egdes, но когда я удаляю соединение между 35 -> 36, это дает хороший вывод -3, 34 35 46 38
Для облегчения понимания я загружаю графическое представление таблицы ребер: https://i.imgur.com/FFF22C1.png
Как вы можете видеть, маршрут идет другим путем, когда мы начинаем с 34 -> 35 -> 46 -> 38 но как мне грустно Это работает только тогда, когда не существует соединения от 35 до 36.
Почему это не работает в случае, показанном в моем коде?