モンテカルロ木探索について

2種類のゲームを実装してみて。解説は書こうかと思ってたんだけど、解説を書くより新しいゲームを実装するのの方が楽しいので後回し状態。


一つ確実に言えることは、自分の書いている関数に副作用があるのかないのかにセンシティブになる必要があるということか。最初に実装したゲームエンジンは特に考え無しにGameオブジェクトがあってGame#stepメソッドでゲームを進めるとGameオブジェクトやそこからぶら下がっているCardオブジェクト、Playerオブジェクトの値が破壊的にごりごり書き変わって行っていた。しかしモンテカルロなAIをいれようと思うと副作用があることはとても厄介だ。ある判断の時点で、「Aを選んだ世界」「Bを選んだ世界」を作って実行してみて、その結果を集計してから結論を下したいわけだから、互いに干渉しないいくつもの世界を作りたい。結局、副作用ありで絡み合ったオブジェクトを解きほぐすよりも、スクラッチから副作用のない世界を設計する方が楽だった。一度Bombが消えないバグが発生したのも副作用をつぶし損ねていたせいだったし。


あと「AIが何かの判断をする」というタイミングで処理を中断して、異なる判断でどうなるかを試してから、もう一度その判断をするところに戻って決断を下すわけだから、それができる設計にしておかないと行けない。自分が何をしようとしているのか俯瞰する意味でもこれを読むべき: なんでも継続