| 3.3 評価クラスの構造 |
評価クラスの構造について説明します。
どの程度の割合で評価パラメータを更新するかを定義します。
評価パラメータについては後の節で述べます。
/* 評価値更新の度合い */ #define UPDATE_RATIO 0.003
各パターンの評価値の最大値を定義します。
それぞれの評価値がMAX_PATTERN_VALUEよりも大きくなったり、-MAX_PATTERN_VALUEよりも小さくならないようにします。
ここでは最大評価値が20石分程度としています。
/* パターンの最大評価値 */ #define MAX_PATTERN_VALUE (DISK_VALUE * 20)
各パターンの状態数は3の冪(累乗)になるので、それを定数としておくと便利です。
/* 3の冪を表現する定数 */ #define POW_3_0 1 #define POW_3_1 3 #define POW_3_2 9 #define POW_3_3 27 #define POW_3_4 81 #define POW_3_5 243 #define POW_3_6 729 #define POW_3_7 2187 #define POW_3_8 6561 #define POW_3_9 19683 #define POW_3_10 59049
各パターンに番号を割り当てます。
またパターンの種類の数としてPATTERN_ID_NUMを使用するようにします。
/* パターンID */
enum {
PATTERN_ID_LINE4,
PATTERN_ID_LINE3,
PATTERN_ID_LINE2,
PATTERN_ID_DIAG8,
PATTERN_ID_DIAG7,
PATTERN_ID_DIAG6,
PATTERN_ID_DIAG5,
PATTERN_ID_DIAG4,
PATTERN_ID_EDGE8,
PATTERN_ID_CORNER8,
PATTERN_ID_PARITY,
PATTERN_ID_NUM
};
各パターンの状態数を配列として保持しておきます。
状態数はそれぞれのパターンが何マスから構成されるかによって決まります。
/* 各パターンの状態数 */
static const int PatternSize[] =
{
POW_3_8, /* A4-H4 */
POW_3_8, /* A3-H3 */
POW_3_8, /* A2-H2 */
POW_3_8, /* A1-H8 */
POW_3_7, /* A2-G8 */
POW_3_6, /* A3-F8 */
POW_3_5, /* A4-E8 */
POW_3_4, /* A5-D8 */
POW_3_8, /* A1-G1 + B2 */
POW_3_8, /* A1-C1 + A2-C2 + A3-B3 */
2, /* Parity */
0 /* dummy */
};
それでは評価クラスEvaluetorの構造を見てみましょう。
struct _Evaluator
{
int *Value[PATTERN_ID_NUM];
int MirrorLine[POW_3_8];
int MirrorCorner[POW_3_8];
};
最初のValueというのはそれぞれのパターンに対する評価値を表します。
例えばValue[PATTERN_ID_LINE4][100]だったら、PATTERN_ID_LINE4パターンの100番目の状態の評価値を意味します。
MirrorLineとMirrorCornerは、対称性をもつパターンに対して使用します。
あるパターンインデックスに対して、対称なパターンが存在するかどうかを調べるための変数です。
MirrorLineはマスが1列に並んでいるパターンに対して、MirrorCornerは隅のパターンに対して使用します。
次節からは関数の実装について説明します。