t_wの輪郭

Feedlyでフォローするボタン
関数再帰recursive function
あれ

あれ

2023/6/24 16:42:00

遺伝的アルゴリズムにしろ、遺伝的プログラミングにしろ、与えられた課題に有利なバグがあったら徹底活用してくるし、不利なバグがあったら徹底回避してくるので、バグの発見が難しい。内部で乱数が使われているのも輪をかけてバグの発見を難しくしてくる。

なので自動テストで一個づつ動いているか確認しようと思ったのだが、ちゃんと動いてるはずだったのに自動テスト書いたら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
}