SSS*は、1979 年に George Stockman によって導入された検索アルゴリズムです。A * 検索アルゴリズムと同様に、ゲーム ツリーを最良優先方式で横断する状態空間検索を実行します。
SSS* は、ソリューション ツリーの概念に基づいています。非公式には、任意のゲーム ツリーから、各MAXノードのブランチの数を1 つに刈り込むことによってソリューション ツリーを形成できます。このようなツリーは、対戦相手の行うすべての可能な手順に対して 1 つの MAX アクションを指定するため、MAX の完全な戦略を表します。ゲーム ツリーが与えられると、SSS* は部分ソリューション ツリーの空間を検索し、徐々に大きなサブツリーを分析して、最終的に元のゲーム ツリーと同じルートとミニマックス値を持つ単一のソリューション ツリーを生成します。SSS* は、アルファ-ベータ プルーニングで刈り込まれるノードを検査することはなく、アルファ-ベータでは刈り込まれないブランチも刈り込む可能性があります。そのため、ストックマンは、SSS* の方がアルファ-ベータよりも優れた汎用アルゴリズムではないかと推測しました。しかし、Igor RoizenとJudea Pearl は、 SSS *がalpha/beta と比較して評価する位置の数の節約には限界があり、一般に他のリソース (たとえば、アルゴリズムのベストファーストの性質によって必要になるノードのリストの保存とソート) の増加を補うのに十分ではないことを示しました [ 1 ]。しかし、Aske Plaat、Jonathan Schaeffer、Wim Pijls および Arie de Bruin は、チェス、チェッカーなどのすべてのゲーム プレイ プログラムの場合のように、alpha–beta が転置テーブルで使用される場合、null ウィンドウの alpha–beta 呼び出しのシーケンスは SSS* と同等 (つまり、同じノードを同じ順序で展開する) であることを示しました。これで、OPEN リストの保存とソートは不要になりました。これにより、トーナメント品質のゲーム プレイ プログラムで SSS* (と同等のアルゴリズム) を実装できるようになりました。[ 2 ]
最良優先アルゴリズムを深さ優先呼び出しのシーケンスとして再定式化したことにより、ヌルウィンドウ アルファ-ベータ アルゴリズムのクラスの定式化が促進され、その中でMTD(f)が最もよく知られた例です。
ノードの状態を格納する優先キューOPENがあります。-ノード識別子(ドット付き10進表記はノードの識別に使用され、ルートです)、- ノードの状態(L - ノードはライブ、つまりまだ解決されていない、S - ノードは解決されている)、- 解決されたノードの値。OPENキュー内の項目は、値の降順でソートされます。複数のノードが同じ値を持つ場合、ツリーの最も左のノードが選択されます
OPEN := { (e, L, inf) } while true do // 停止するまで繰り返すOPENキューの先頭から 要素p =( J , s , h )をポップする。J = eかつs = Sの場合 アルゴリズムを停止し、結果としてhを返す それ以外の場合はp にガンマ演算子を適用する演算子 forは次のように定義されます。
s = Lの場合、Jが終端ノードの場合は (1.) ( J、S、 min( h、 value( J ))) を OPEN に 追加します。そうでない場合、Jが MIN ノードの場合は (2.) (J.1、L、h ) を OPEN に 追加します。そうでない 場合、(3.) j =1..number_of_children( J ) の場合、(Jj、L、h ) を OPEN に 追加します。そうでない場合、Jが MIN ノードの場合は (4.) (parent( J )、S、h ) を OPEN に追加します。 OPENから親(J)の子に関連付けられたすべての状態を削除します。 else if is_last_child( J ) then // J が parent(J) の最後の子である場合(5.) OPENに (parent( J ), S , h )を追加する。そうでない場合は (6.) OPENに(parent( J ).( k +1 ), L , h )を追加する。 // OPENに親(J)の次の子に関連付けられた状態を追加する。