人工知能プログラムの開発テクニック(1):評価テーブルを使う

プログラムの動作

リバーシでは、盤面の四隅や端に駒を置く事ができれば有利となることが知られています。そこで、サンプルコードを修正し、できるだけ四隅や端に駒を置くように動作する人工知能プログラムを作成します。

図1は、この人工知能プログラムで使用する評価テーブルであり、盤面に駒を置くときの評価値を示しています。例えば、盤面の四隅 (0, 0) (0, 7) (7, 0) (7, 7) の評価値は最大値である 9 となっています。また、ここに隣接する場所には駒を置きたくありませんので、評価値は低い値(1〜2)となっています。

リバーシの評価テーブルの例

図1:リバーシの評価テーブルの例

この評価テーブルを参照し、次の手(駒を置く場所)を判断する人工知能プログラムを作成します。このプログラムは、次に駒を置ける場所の中で最も評価値の高い場所に駒を置くように動作します。

プログラムコード

具体的な人工知能プログラムのコードは以下のようになります。

SampleProcessor.java
import jp.takedarts.reversi.Board;
import jp.takedarts.reversi.Piece;
import jp.takedarts.reversi.Position;
import jp.takedarts.reversi.Processor;

/**
 * Reversi人工知能のサンプルプログラム。
 * 
 * @author Atsushi TAKEDA
 */
public class SampleProcessor
  extends Processor
{
  /**
   * 評価テーブル。
   */
  private static int[][] _VALUES = new int[][] {
    {
      9, 2, 8, 6, 6, 8, 2, 9
    }, {
      2, 1, 4, 5, 5, 4, 1, 2
    }, {
      8, 4, 6, 5, 5, 6, 4, 8
    }, {
      6, 5, 5, 4, 4, 5, 5, 6
    }, {
      6, 5, 5, 4, 4, 5, 5, 6
    }, {
      8, 4, 6, 5, 5, 6, 4, 8
    }, {
      2, 1, 4, 5, 5, 4, 1, 2
    }, {
      9, 2, 8, 6, 6, 8, 2, 9
    }
  };

  /**
   * 手番が来たときに、次の手を決定するメソッド。
* * @param board 盤面の状態 * @param piece 自分が打つ駒 * @param thinkingTime 思考時間 * @return 次の手を置く場所 */ @Override public Position nextPosition(Board board, Piece piece, long thinkingTime) { // 次に置ける場所の中で、もっとも評価の高い場所を探す int value = 0; int x = -1; int y = -1; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (board.isEnablePosition(i, j, piece) && _VALUES[i][j] > value) { value = _VALUES[i][j]; x = i; y = j; } } } // 置く場所をログに出力 log(String.format("next -> (%d, %d) : %d", x, y, value)); // 置く場所をPositionオブジェクトに変換して返す return new Position(x, y); } /** * この人工知能の名前を返す。 * * @return 人工知能の名前 */ @Override public String getName() { return "評価テーブルを使ったプログラム"; } }