遺伝的アルゴリズムにしろ、遺伝的プログラミングにしろ、与えられた課題に有利なバグがあったら徹底活用してくるし、不利なバグがあったら徹底回避してくるので、バグの発見が難しい。内部で乱数が使われているのも輪をかけてバグの発見を難しくしてくる。
なので自動テストで一個づつ動いているか確認しようと思ったのだが、ちゃんと動いてるはずだったのに自動テスト書いたらpanicで全然動かへん。
なんで動いてるんだこいつ……
いや、なんかgo run
で動かすとバグんないんだけど、go test
するとバグる。なんだこれ、goroutine分からん。
やっぱりgoroutineというか並列処理みたいなことを再帰関数でやるってのは辞めた方が良い予感。ワシには難しすぎる問題になる。
func node_exec(node *Node, program Program, inputs *[constant.EMBEDDING_LENGTH + 1]int, input_map *map[int]int) int {
if node.Executed {
return node.Value
}
if node.Function < program.Static_functions_index_max {
node.Executed = true
node.Value = program.Functions[node.Function](inputs, input_map, &program.Queue, &program.Stack, 0, 0)
return node.Value
}
wg := sync.WaitGroup{}
node.Executed = true
arg1 := 0
arg2 := 0
wg.Add(2)
go func() {
arg1 = node_exec(&program.Nodes[node.Index1], program, inputs, input_map)
defer wg.Done()
}()
go func() {
arg2 = node_exec(&program.Nodes[node.Index2], program, inputs, input_map)
defer wg.Done()
}()
wg.Wait()
node.Value = program.Functions[node.Function](inputs, input_map, &program.Queue, &program.Stack, arg1, arg2)
return node.Value
}