Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SelectMaxUcbChild()での引き分けの親ノードへの伝播について #37

Open
yaneurao opened this issue Feb 13, 2021 · 0 comments

Comments

@yaneurao
Copy link
Contributor

SelectMaxUcbChild()なのですが、子ノードがすべて引き分けの時に親ノードにそれを伝播していないです。😥
なので伝播していれば早い段階で引き分けだとわかる局面でも引き分けだと判明するのに時間がかかります。

UCTSearcher::SelectMaxUcbChild(child_node_t* parent, uct_node_t* current)

  1. すべての子ノードが、勝ち(IsWin) => 親ノードは負け
  2. すべての子ノードが、引き分け(IsDraw) => 親ノードは引き分け
  3. ひとつでも子ノードが、負け(IsLose) => 親ノードは勝ち

となるのですが、1),2)のIsWin,IsDrawはMove(指し手構造体)の上位bitを用いるので、bitwise andしていけば1),2)同時に求まります。
3)もその時についでにbitwise orしていけば求まります。

ついでに言うと、子ノードすべてのMoveだけの配列があれば、その配列に対して、AVX命令で8つずつまとめて上のbitwise and/orができます。
// なのでそういう構造になってほしい気はします。

さらに言うと、1,2,3)のケースにおいて、そのindexを返す必要はなくて(子ノードの訪問回数のincrementが不要なら)、indexを返さず、上のbitwise andした結果なり何なりを参照渡しされた引数などに返すほうが、すっきりしたコードになります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant