遺伝的プログラミングについてもっと学ぶために、Lua で非常に単純なプログラムを書いています。以下はnodeNum
、ツリー ( ) 内の番号付きノード ( ) に移動し、 pop
add を 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)
たが、どちらのメソッドも正しく機能しません。
本当に明白な何かが欠けている可能性があります。よりエレガントなソリューションを誰かが見ることができますか?