出于某种原因,Lua告诉我这条线出错了:
for i=1, #set do
其中set是我制作的函数的二维表参数。 它给了我一个错误:
尝试获取nil值的长度(本地设置)
奇怪的是,我运行此函数超过1000次,但错误只显示一次。我不确定为什么。 任何帮助,将不胜感激。而且我也可以打印出来的值,它们会出现,我认为这是一个可能的错误。
编辑:这是功能:(或其重要部分)
function GeneticTrainer:evaluate(id,correct,set)
local returny=0
local net=self.Networks[id]
for i=1, #set do
-- print(i..k[i])
net:Update(set[i])
local error= math.abs(correct[i]-net.output[1])
returny = returny + (1-(error/10))
end
这就是我所说的:
function GeneticTrainer:Evolve(Problem,Set)
local A=math.random(1,self.Population)
local B=math.random(1,self.Population)
if A==B then
B=math.random(1,self.Population)
end
local AFitness = self:evaluate(A,Problem,Set)
local BFitness = self:evaluate(B,Problem,Set)
这就是我所说的:
BinarySet={{0,0},{1,0},{0,1},{1,1}}
for i=1, iterations do
GATrainer:Evolve(Target,BinarySet) end
答案 0 :(得分:1)
function GeneticTrainer:evaluate(id,correct,set)
local returny=0
local net=self.Networks[id]
for i=1, #set do -- this line causes the error!
-- an so on...
错误是由上面的代码段第4行引起的。由于函数标题和set
之间显然没有#set
的任何标记,set
必须输入函数{ {1}}
接下来你检查你拨打的地方nil
碰巧是这样的:
GeneticTrainer:evaluate(id,correct,set)
因为Set显然没有变化,进入函数function GeneticTrainer:Evolve(Problem,Set)
local A=math.random(1,self.Population)
local B=math.random(1,self.Population)
if A==B then
B=math.random(1,self.Population)
end
local AFitness = self:evaluate(A,Problem,Set)
local BFitness = self:evaluate(B,Problem,Set)
然后进入GeneticTrainer:Evolve(Problem,Set)
,nil值也必须来自此函数之外。
未提供进一步的代码。 你将函数调用1000次而没有错误并不意味着如果你用1001次不同的参数调用它就不会导致错误。
只需按照self:evaluate(B,Problem,Set)
通过调用堆栈,您就会发现问题。
您应该在错误消息中提供堆栈跟踪,告诉您在哪一行调用每个函数。
这非常简单,你必须做一个或类似程序员一百万次。你不需要我们在这里帮助你。
编辑:
在您的评论之后,我将您的代码减少到最低限度(您应该为您的问题做些什么)并通过Lua在线演示运行它,完全没有任何问题。 https://www.lua.org/cgi-bin/demo
我还使用另一个Lua解释器使用5000次迭代测试它,没有任何问题。
set
我说最近建立的Lua有一个让桌子消失的错误是不可能的。请再次检查您的代码。