GA将?開発日記~王理のその先へ~

ネタ勢最強を目指して絶賛開発中。

今の実装よりもうちょっと賢い並列化方式

 「今の」というか、GA将のVer.1で実装したやつですが、単純なPVS*1でした。ハッシュの手はシングルスレッドで読んで、それでカットしなかったら残りを並列化ってやり方です。

 これは要するに「ハッシュの手でカットしなかったら、Cut Nodeの可能性が高い。だから並列化しよう。」って考えてやってたんですが、いくつか問題があります。

  • ハッシュの手が無いと無条件に並列化する → Cut Node誤認の可能性大
  • ハッシュの手の次やその次の手でカットが起きると、無駄な探索が必要 → 遅くなる

 んで、例えば「カットノードの場合、上位n手でカットが起きる可能性がm%」ってデータをとっといて、それをもとに適当な閾値(例えばm=95%)までの手はシングルスレッドで探索*2、その後からは並列探索ってのを検討中。

 実装は少し面倒ですが、閾値固定ならそれほど複雑にはならないはず。

 もしくは、探索中に実際のCut Nodeの探索結果からm=95%になるnの値を調べれば、さらに効率上がるかも。「ムーブオーダリングが信用出来る状態なら1〜2手読んだ後に並列化。信用出来ないなら10手くらい読んでから並列化。」とかって動作になるはずです。

 …ただこれ、絶対どこかの誰かが既にやってるネタですよねぇ。論文でも見つかりゃ楽なんですが、どうやって検索すれば良いのか… 良いキーワードが思いつかないです _| ̄|○

*1:Splittingの方のPVS

*2:もちろん、子ノード以下で並列化すべき条件が整ったら、そこからは並列化