アルゴリズム概要
inputs[:512] <- [規定入力, 乱数*300] outputs[] <- eval inputs 探索範囲[:1000くらい] <- `親ソルバー < サイズとoperator` loop: if children.size < CPUの2倍: child <- `子ソルバー -t 探索範囲.pop < (inputs, outputs)` children.push(child) child.onFinish: if 出力なし: goto loop else: program <- 出力 探索範囲.push(all 探索中) killall children status, 反例 <- guess program if status == 'win': print program 探索終了 if status == 'mismatch': inputs.append(反例), outputs.append(反例) goto loop
という風にやってました。自然言語より似非コードの方が伝わるんで書きなおしてみた。
この辺の作業は時系列順に言うと
- @tzik さんが細かい単位で書いていた。
- 手作業が面倒だったので全体を繋げた。
- @tzik さんが並列化。
という感じに進んでて、よく見ると Python 知識が必要なところは @tzik さんがガシガシ書いてくれました。