t_wの輪郭

Feedlyでフォローするボタン
アルゴリズムGA遺伝的Genetic Algorithm
GAでCSSの最適化あれあれ『ニューロ・ファジィ・遺伝的アルゴリズム』あれあれ遺伝的アルゴリズムで図の配置を見やすくするインタラクティブな遺伝的アルゴリズム遺伝的アルゴリズムの再帰的適用再帰的遺伝的アルゴリズム

あれ

2024/5/23 19:39:00

社員旅行の部屋割りをいい感じにやってくれるツールできた!!

「めっちゃええやん」って言われたから、「最新のAIの力です」って言っておいた。中身は遺伝的アルゴリズムという古典的なやつ。

あれ

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
}

あれ

2023/6/18 19:06:00

時間経過で学習が進まない……!
いまだかつてない雑な実装をしたせいだろうか

普通、遺伝的アルゴリズムないし遺伝的プログラミングを実装するときは、全個体を評価した後に、その評価を元に新世代に総とっかえするんだけど、今回実装がめんどかったので、以下のような処理でごまかしてる

  1. ランダムに2体取り出してくる
  2. 交叉と突然変異で新個体を作る
  3. 1. で取り出した個体のうち評価が低いものを新個体と入れ替える