我正在Lua写一个非常简单的程序,以了解有关遗传编程的更多信息。下面是一个mutate函数,用于转到树(nodeNum
)中的编号节点(pop
),并且:或者使用sub替换(反之亦然)或者用随机数替换节点1 -100。
local count = 0
function mutate(pop, nodeNum)
for k,v in ipairs(pop) do
if type(v) == "table" then
mutate(v, nodeNum)
else
count = count + 1
end
if count == nodeNum and k == 1 then -- correct node
if type(v) == "function" then
if v == add then
pop[k] = sub
else
pop[k] = add
end
else
pop[k] = math.random(100)
end
end
end
end
我的问题在于count
。调用此函数很尴尬,因为每次都必须重置count
:
-- mutate the first 3 elements in program tree t
mutate(t,1)
count = 0
mutate(t, 2)
count = 0
mutate(t, 3)
我尝试过使用do ... end
的变体,如:
do
local count
function mutate(pop, nodeNum)
if not count then
count = 0
...
end
我也试过给mutate一个额外的参数mutate(pop, nodeNum, count)
并用mutate(t, 1, 0)
调用它但是我无法让任何一种方法正常工作。
我可能会遗漏一些非常明显的东西,有人能看到更优雅的解决方案吗?
答案 0 :(得分:3)
function mutate(pop, nodeNum, count)
count = count or 0
for k,v in ipairs(pop) do
if type(v) == "table" then
mutate(v, nodeNum, count)
else
count = count + 1
end
if count == nodeNum and k == 1 then -- correct node
if type(v) == "function" then
if v == add then
pop[k] = sub
else
pop[k] = add
end
else
pop[k] = math.random(100)
end
end
end
end
答案 1 :(得分:0)
我真的不使用Lua,但是,最简单的方法可能不是制作另一个调用此函数的函数,它在当前方法返回后将count设置为零?例如:
function mutateExample(pop, nodeNum)
mutate(pop, nodeNum)
count = 0;
end
这样,mutate可以递归地调用自己所需要的一切,然后一旦完成就会重置count。
答案 2 :(得分:0)
count
需要是函数中的局部变量,而不是在函数之外。它是一个堆栈变量,所以把它放在函数的堆栈中:
function mutate(pop, nodeNum)
local count = 0
for k,v in ipairs(pop) do
if type(v) == "table" then
mutate(v, nodeNum)
else
count = count + 1
end
if count == nodeNum and k == 1 then -- correct node
if type(v) == "function" then
if v == add then
pop[k] = sub
else
pop[k] = add
end
else
pop[k] = math.random(100)
end
end
end
end
如果要对共享变量进行多个函数调用,则只使用外部local
变量。