探索の枝狩り
最善手の探索中に最善局面は無いであろうと判断できる進行(ゲーム木の枝)について探索を打ち切ることを枝狩りと呼びます。
枝狩りを行うと探索範囲が狭まるため、探索の処理速度を向上できます。
通常、枝狩りを行う場合には、本来の探索で行う予定の深さよりも浅い先読みを行って本来の探索で得られるであろう評価値の予測値を算出します。
この予測値とαβ値が比較され、探索の打ち切りの可否が判定されます。
予測値は本来の深さよりも浅い先読みで算出するため、誤差を含んでいることが前提になっています。
打ち切りの判定はその誤差を考慮した上で行われます。
正確さの観点からは誤差の最大値を考慮しても、予測値がβ値を超える、または、α値未満になる場合にのみ枝狩りを行うべきです。
ただし、これでは枝狩りが発生するケースが殆どなくなり、探索処理の高速化は望めません。
このため、通常は何パーセントは問題ない、という値を誤差の最大値に置き換えて枝狩りが行われます。
例えば、様々な局面で8手読みと4手読みの評価値の違いを調査し、80%は3石以内、90%は5石以内に収まっていたとします。
このような場合、80%の精度で枝狩りを行うこととすれば、予測値-3がβ値を超えるか、予測値+3がα値未満になった場合に枝狩りが行われます。
90%の精度で枝狩りを行うこととすれば、予測値-5がβ値を超えるか、予測値+5がα値未満になった場合に枝狩りが行われます。
上記では80%の精度で枝狩りを行った方が90%の精度で行うよりも枝狩りが発生しやすく、処理速度の向上がより望めることになります。
ただし、実際の誤差が使用した誤差を上回っている場合には、最善局面があるかもしれない進行の探索を打ち切ってしまう可能性があります。
枝狩りの精度が80%の場合には90%の場合よりも実際の誤差が使用した誤差を上回っている可能性が10%高くなるため、評価値の信憑性はより低くなります。
一般に、枝狩りの精度を低くすると探索速度は高速になりますが、得られる評価値の信憑性は低下します。
逆に、枝狩りの精度を高くすると得られる評価値の信憑性は高まりますが、探索速度の高速化は望めなくなります。
実際に使用される枝狩りの精度はプログラムによって様々です。枝狩りの精度は局面に合わせて変更される場合もあります。
なお、通常のαβ探索でも枝狩りは行われるため、上記のような枝狩りは正確には「前向き枝狩り」と呼ばれています。
これに対して、αβ探索で行われる枝狩りは「後ろ向き枝狩り」と呼ばれています。
反復深化法
深い先読みを行う場合に浅い先読から順次読みの深さを深めて行く手法を反復深化法と呼びます。
反復深化法では例えば24手読みを行う場合に、8、10・・・24手と言う様に深度を深めて同じ局面の探索を繰り返します。
反復深化法を使用するとαβ探索の性能を左右する探索順を効率よく決定できるため、探索処理の高速化が図れます。
上記例では最初の8手読みの段階では探索順は浅い先読みによって決定されます。
浅い先読みによって決定される探索順は精度が低いため、善手順とはなっていない場合も多々あります。
探索順が善手順となっていない場合にはαβ探索での高速化は期待できません。
ただし、8手読みは比較的浅い探索のため、高速化されなかった場合にも処理時間は余りかかりません。
次の10手読みの段階では探索順を決定するために8手読みの結果を利用することができます。
8手読みの結果を使用して決定する探索順は浅い先読みによって決定された探索順と比べてより高精度になります。
このため、αβ探索の高速化効果をより期待できるようになります。
以降は同様にして前回の探索結果を探索順を決めるために使用していきます。
24手読みを行う段階では22手読みの結果が利用できるため、探索順をほぼ善手順とすることができます。
このため、αβ探索の高速化効果を最大限に発揮させ、高速な探索処理を行わせることができます。
前回の探索結果はαβ探索のウインドウを決定するためにも利用できます。
8手読みの段階では最善値は不明のためウインドウ幅に制限を設けることはできません。
しかし、次の10手読みの段階では8手読みの結果から最善値がある範囲内にあることを想定できます。
その想定値に従ってウインドウを設定した後に10手読みを行えば、探索範囲が狭まるために探索速度は向上します。
先読みの深度がより深くなれば最善値の信頼度はより増すため、探索範囲をより狭めてさらなる高速化を図れます。
反復深化法には何時処理を中止しても前回の探索結果から比較的良好な着手選択が行えるという利点もあります。
この利点は時間制限付の対局を行うプログラムにとっては特に重要です。
通常の先読みを使用している場合にはプログラムは探索処理が完了するまでは基本的には着手が行えません。
反復深化法を使用すれば処理時間が許容限界を超えた時点で前回の探索結果から着手を行うことが可能になります。
置換表(キャッシュ/ハッシュ)
置換表は次回探索時に使用することを目的として探索局面に関する情報を格納しておくデータ領域です。
同一局面が複数回探索された場合、二回目以降の探索では格納情報の利用により探索の処理速度を高速化できます。
リバーシでは異なる着手進行が同一局面に至ることは珍しくないため、置換表の高速化効果は常に期待できます。
さらに、MTD(f)探索や反復深化法を使用する場合には、本質的に同一局面が複数回探索されることになるため、置換表の効果は絶大になります。
通常、置換表には局面評価値の上/下限値と評価値順にソートされたその局面の着手候補が格納されます。
二回目以降の探索時にはαβ値と局面評価値の上/下限値が比較され、不要な場合には探索が省略されます。
探索が省略できない場合にも、評価値順にソートされた着手候補を使用して探索順を決定できるため、
探索順の決定時に発生するオーバーヘッドが削減され、探索速度は高速化されます。
一般に、対局中に行われる探索の局面数は膨大な数となるため、置換表は比較的最近行われた探索結果のみを格納するように実装されます。
このような方式はキャッシュと同等のため、置換表はキャッシュと呼ばれることがあります。
また、目的の局面を高速に探し出せるように、多くの場合、置換表は構造的にはハッシュ表として実装されます。
このため、置換表はハッシュと呼ばれることもあります。
終盤の読みきり
評価関数で局面の良し悪しを判定するためには比較的大きなオーバーヘッドが必要となるため、
終盤、残り数手の局面に達すると終局まで読みきってスコアを確認した方が処理が高速に行えるようになります。
また、このようにした方が判定の精度も高くなります。
このため、リバーシプログラムの多くは終盤になると通常の評価関数による局面評価ではなく「読みきり」を行うようなります。
例えば、評価関数のオーバーヘッドと残り6手を読みきるのとが同等のオーバーヘッドになる場合、残り6手の局面に至った時点で
プログラムは評価関数での局面評価から「読みきり」に移行させます。
この場合、通常時に24手読みを行っているのであれば、31手目の時点で実際には30手読みが行われます。
終盤の読みきりの実装形態はプログラムによって様々です。
多くのプログラムが最終的には完全読みを使用しますが、通常の先読みから完全読みに至る過程で様々なステップが置かれます。
通常の先読み時に前向き枝狩りを使用している場合には、枝狩りを有効にしたまま「読みきり」に移行させる場合があります。
この場合、枝狩りが有効なため、終局まで読みきっても評価値には誤りがある可能性がありますが、高速に処理が行え、枝狩りの精度を正しく調整しておけば、評価精度の向上も望めます。
このような考え方を発展させ、高速性よりも評価精度の向上を目的に、より早く「読みきり」に切り替えるプログラムもあります。
このようなプログラムでは、多くの場合、20手台の後半から「読みきり」を行います。
Copyright (c) 2007-2025 T.Ishii (t-ishii@js2.so-net.ne.jp) all rights reserved.