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は隅のパターンに対して使用します。
次節からは関数の実装について説明します。