2

我正在用 Lua 编写一个非常简单的程序,以了解有关遗传编程的更多信息。下面是一个 mutate 函数,用于转到nodeNum树 ( ) 中的编号节点 ( pop) 以及:将 add 与 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)但我无法让任何一种方法正常工作。

我可能遗漏了一些非常明显的东西,有人能看到更优雅的解决方案吗?

4

3 回答 3

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
于 2012-09-02T03:43:37.770 回答
0

我并没有真正使用 Lua,但是,最简单的方法可能不是创建另一个调用这个函数的函数,它在当前方法返回后将 count 设置为零?前任:

function mutateExample(pop, nodeNum)
    mutate(pop, nodeNum)
    count = 0;
end

这样, mutate 可以递归地调用它自己,然后 count 将在完成后重置。

于 2012-09-01T22:24:12.467 回答
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如果您希望多个函数调用共享变量,则仅使用外部变量。

于 2012-09-01T22:29:37.350 回答