UCTはまだ効率をあげられるんじゃないのだろうか?
裸玉の詰め将棋を、証明数で解くのが非常に困難であることは知られているかと思いますが、UCTでこれを解決出来ないかなーなんていうことを結構前から考えてました。
ただ、効率のいい実装は、『詰み・不詰みが判明していないノードでは、読む優先順位として、証明数の代わりに詰む確率を用いる』だけで、中身は普通のMinMax探索に近いものになりそうな気がしています。
囲碁は、何と言うか、「少しの差を徐々に拡げて行って、大きな見落としがない限りはそのままの差でゴールできるゲーム」で、詰め将棋などはまさにその逆で、見落としが許されないゲーム、なのですよね。で、将棋は、詰め将棋に近い性格を持っている面がある気がします。(少々のリードを保っていても、最後にミスをすると負け)
で、こういうゲームをUCTで解析するのは、無駄な部分が出るんじゃないかな、と。
こういうゲームでは、あるノードで正しい応手を指されたら負け、な局面は、それ以上シミュレートの対象にする必要のなくなったノード…勝率0が確定したノードになるのではないかと。今の私のUCTの実装だと、以前にシミュレートした結果が残っている(例えば、その局面では、99勝『1敗』、勝率0.99だったかも知れない。)ので、いきなり勝率0にはならないんですよね。何回も、その『実は決定的な1敗』のノードをシミュレートしてみて、始めて勝率が0に近付いていく。多分、これって、無駄なんです。
ただし、『相手が正しい手を選べない可能性がある』ことを考慮すると、また話が変わってきます(苦笑)。勝負手として、『正しく指されたら負けることが分かっているけれど、その正しい応手を見つけられる可能性は低い』なんてことまで判断できると、対人ではまさに『理想的』です。
…相手がαβベースで全幅探索を行っているコンピュータだと、きっちり負けそうですけど(苦笑)。
そんなわけで、UCTの改良を少し思索中。…まだ試作に至る段階ではないです。
勝率の上位への繰上げをどう考えるか、なんですよねぇ。
今は、一回のシミュレーションの結果を最上位にまで一回の結果として伝えているだけ、なので、ここで大きな改造が出来そうな気がしています。
ただ、現実的には、『囲碁では』1回のシミュレーションの精度をあげるだけで、十分な成果があげられそうな気も『ものすごーく』しています。
最近のコメント