После работы на моем коде на некоторое время, оптимизируя наиболее очевидные вещи, я привел в этом:Lua код первопрохождения нуждается в оптимизации
function FindPath(start, finish, path)
--Define a table to hold the paths
local paths = {}
--Make a default argument
path = path or {start}
--Loop through connected nodes
for i,v in ipairs(start:GetConnectedParts()) do
--Determine if backtracking
local loop = false
for i,vv in ipairs(path) do
if v == vv then
loop = true
end
end
if not loop then
--Make a path clone
local npath = {unpack(path)}
npath[#npath+1] = v
if v == finish then
--If we reach the end add the path
return npath
else
--Otherwise add the shortest part extending from this node
paths[#paths+1] = FindPath(v, finish, npath) --NOTED HERE
end
end
end
--Find and return the shortest path
if #paths > 0 then
local lengths = {}
for i,v in ipairs(paths) do
lengths[#lengths+1] = #v
end
local least = math.min(unpack(lengths))
for i,v in ipairs(paths) do
if #v == least then
return v
end
end
end
end
Проблема в том, отметил линия получает какую-то игру сценария (я считаю, это из-за массовой рекурсии без уступки). Я также чувствую, что как только проблема будет исправлена, она, вероятно, будет довольно медленной даже в масштабе платы pacman. Есть ли способ, которым я могу его оптимизировать, или, возможно, лучший метод, с которым я могу смотреть в подобном?
ОБНОВЛЕНИЕ: Я, наконец, решил уничтожить мой алгоритм из-за неэффективности и реализовал алгоритм Dijkstra для поиска пути. Для любого, кто интересуется исходным кодом, можно найти здесь: http://pastebin.com/Xivf9mwv
Мне это известно, и я часто его использую, но я работаю над кодом для друга, которому нужен ИИ, (PathfindingService заставит их пройтись по дорогам) – warspyking
Тогда у нас есть код FindPath? Я подозреваю, что это может быть эта функция, вызывающая замедление. – Henry
У вас есть это ... – warspyking