2

遺伝的プログラミングについてもっと学ぶために、Lua で非常に単純なプログラムを書いています。以下はnodeNum、ツリー ( ) 内の番号付きノード ( ) に移動し、 popadd を sub と交換する (またはその逆) か、ノードを 1 ~ 100 の乱数で置き換える mutate 関数です。

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)

likeを使用してバリエーションを試しました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

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 に答える
0

私は実際には Lua を使用していませんが、おそらく最も簡単な方法は、現在のメソッドが戻った後にカウントをゼロに設定する、この関数を呼び出す別の関数を作成することではないでしょうか? 元:

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

そうすれば、mutate は自分自身を必要なだけ再帰的に呼び出すことができ、それが完了すると count がリセットされます。

于 2012-09-01T22:24:12.467 に答える