gpt4 book ai didi

algorithm - 使用 Lua 的 BFS 算法找到 2 个节点之间的最短路径

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:49:16 25 4
gpt4 key购买 nike

我设法编写了一个代码,它使用 BFS 算法遍历所有图形节点。这是简单的部分:)

不,我一直在寻找两个节点之间的最短路径。

到目前为止,这是我的代码:

function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end

queue = {stack={}}

function queue:en(e)
table.insert(self.stack, e)
end

function queue:de()
local e = self.stack[1]
self.stack[1] = nil

local new_stack = {}

for _, v in pairs(self.stack) do
table.insert(new_stack, v)
end

self.stack = new_stack

return e
end

function queue:count()
return #self.stack
end

function bfs()
start = 1
goal = 10
visited = {}
path = {}

graph = {}
graph[1] = {2,3,4}
graph[2] = {6,5,1}
graph[3] = {1}
graph[4] = {7,8}
graph[5] = {9,10,2}
graph[6] = {2}
graph[7] = {4,11,12}
graph[8] = {4}
graph[9] = {5}
graph[10] = {5}
graph[11] = {7}
graph[12] = {7}


queue:en(start)
table.insert(visited, start)
depth = 1

while queue:count() > 0 do
node = queue:de()

for _, exit in pairs(graph[node]) do
if not table.contains(visited, exit) then
table.insert(visited, exit)

if exit == goal then
print("GOAL : " .. exit)

do return end
end

if graph[exit] then
print("Node: " .. exit .. ", Depth: " .. depth)

queue:en(exit)
end
end
end

depth = depth + 1
end
end

bfs()

它生成的输出:

Node: 2, Depth: 1
Node: 3, Depth: 1
Node: 4, Depth: 1
Node: 6, Depth: 2
Node: 5, Depth: 2
Node: 7, Depth: 4
Node: 8, Depth: 4
Node: 9, Depth: 6
GOAL : 10

对于当前示例,我需要获得从 1 到 10 的最短路径。

最佳答案

这是可以做到的。

queue.lua

local queue = {}

function queue:init()
local q = {}

q.stack = {}

function q:push(e)
table.insert(self.stack, e)
end

function q:pull()
local e = self.stack[1]

table.remove(self.stack, 1)

return e
end

function q:count()
return #self.stack
end

return q
end

return queue

tbl.lua

function table.contains(tbl, e)
for _, v in pairs(tbl) do
if v == e then
return true
end
end

return false
end

function table.copy(tbl)
local t = {}

for _, v in pairs(tbl) do
table.insert(t, v)
end

return t
end

bfs.lua

require "tbl" -- table.contains and table.copy
queue = require "queue"

local function bfs(graph, start, goal)
if not graph[start] then
return false
end

local visited = {}
local queue = queue:init()

queue:push({start})
table.insert(visited, start)

while queue:count() > 0 do
local path = queue:pull()
local node = path[#path]

if node == goal then return path end

for _, exit in pairs(graph[node]) do
if not table.contains(visited, exit) then
table.insert(visited, exit)

if graph[exit] then
local new = table.copy(path)

table.insert(new, exit)
queue:push(new)
end
end
end
end

return false
end

return bfs

用法:

将所有三个文件保存到您的 lua 路径。

bfs = 需要“bfs”

path = bfs(grap, start, goal)

关于algorithm - 使用 Lua 的 BFS 算法找到 2 个节点之间的最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32465881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com