8.1 置換表の関数定義 |
本章では置換表について説明します。
置換表とは、探索中に出現した局面とその情報(例えば評価値)を登録しておく表をいいます。
局面の登録を行っておくと、次に同じ局面が出現したときに登録情報を使うことができるので探索量を減らすことができます。
最初に置換表クラスHashの関数定義を行います。
"hash.h"に定義してあります。
置換表クラスの生成を行います。
in_sizeには置換表に登録できる局面数をbit数で指定します。
例えばin_size = 20なら(2の20乗)=1048576局面を登録することができます。
引数 置換表に登録できる局面数(bit数)
戻り値 生成した置換表クラスへのポインタ
置換表クラスの破棄を行います。
引数
self : Hashクラスへのポインタ
戻り値 なし
置換表に登録されている局面を全て削除します。
引数
self : Hashクラスへのポインタ
戻り値 なし
置換表に局面を登録します。
引数
self : Hashクラスへのポインタ
in_key : 局面のハッシュ値へのポインタ
in_info : 局面情報へのポインタ
戻り値 登録に成功したら1、失敗したら0
局面を指定して、登録情報を取得します。
引数
self : Hashクラスへのポインタ
in_key : 局面のハッシュ値へのポインタ
in_info : 局面情報へのポインタ
戻り値 局面情報が登録されていれば1、登録されていなければ0
局面のハッシュ値とは、局面を識別するための値です。
以下の構造体になっており、局面から計算された64bitのデータを含みます。
具体的な生成方法については次節で説明します。
/* ハッシュ値 */ struct _HashValue { unsigned long Low; /* 下32bit */ unsigned long High; /* 上32bit */ }; typedef struct _HashValue HashValue;
局面情報は以下のようになっています。
その局面の評価値がどの範囲にあるのか、前回の探索を何手で行ったか、前回の探索で得られた最善手は何か、を記録できます。
/* 局面情報 */ struct _HashInfo { int Lower; /* 評価値の下限 */ int Upper; /* 評価値の上限 */ unsigned char Depth; /* 探索手数 */ unsigned char Move; /* 最善手 */ }; typedef struct _HashInfo HashInfo;
置換表から局面情報を取得しようとした回数と、取得に成功した回数を初期化します。
取得に成功した回数が多いほど置換表が有効に使われていると判断できます。
引数
self : Hashクラスへのポインタ
戻り値 なし
置換表から局面情報を取得しようとした回数(Hash_Get()が呼ばれた回数)を取得します。
引数
self : Hashクラスへのポインタ
戻り値 Hash_Get()が呼ばれた回数
置換表から局面情報を取得できた回数(Hash_Get()が1を返した回数)を取得します。
引数
self : Hashクラスへのポインタ
戻り値 Hash_Get()が1を返した回数
置換表で利用するハッシュ法という手法について説明します。