組込み屋でもアプリがしたい! 第7局

序盤、中盤、終盤、隙がないAIをめざします。
駒たっ石たちが躍動する僕のオセロをみなさんに見せたいね。

方針

  • 序盤:定石を使う。
  • 中盤:従来通り、重みづけテーブルで局面を評価する。
  • 終盤:単純に石の数で局面を評価する。

序盤

1手目

オセロの1手目は、打てる場所が4つありますが、対称性に着目すればどれも等価です。一般的には、下図(A)の形が標準とされています。(B)〜(D)の場合は、座標変換によって(A)の形に変換して定石の処理をすることとします。
図

2手目

2手目は、縦取り、斜め取り、並び取りの3パターンがあります。並び取りは後手が不利になることが知られているので、自分からは打たないこととします。
図

3手目以降

いろいろな定石がありますが、ここでは4つの定石を採用します。

  • 縦取り:兎定石、虎定石
  • 斜め取り:牛定石
  • 並び取り:鼠定石

定石に従って打ち、定石のパターンが終了するか、相手が定石から外れた時点で中盤に移行します。

中盤

従来通り、重みづけテーブルで局面を評価しますが、テーブルを改良します。
中盤までは「少なく取る」のが良いとされています。しかしもちろん、四隅を取ることは大事です。そこで、重みづけテーブルを以下のように修正します。

private int[,] WEIGHT = {
    {+30, -12,  0, -1, -1,  0, -12, +30},
    {-12, -15, -3, -3, -3, -3, -15, -12},
    {  0,  -3,  0, -1, -1,  0,  -3,   0},
    { -1,  -3, -1, -1, -1, -1,  -3,  -1},
    { -1,  -3, -1, -1, -1, -1,  -3,  -1},
    {  0,  -3,  0, -1, -1,  0,  -3,   0},
    {-12, -15, -3, -3, -3, -3, -15, -12},
    {+30, -12,  0, -1, -1,  0, -12, +30}
};

終盤

終盤では、もちろん「多く取る」ことこそが大事です。そこで、単純に石の数のみで評価することにします。

結果

従来、Ultima Reversiとの対戦ではレベル6以上、レベル7未満程度の棋力で、特に後手番のときはまずレベル7には勝てませんでした。今回の改良で、先手番ならレベル7に勝ち越し、後手番でもそこそこレベル7に勝てるようになりました。

問題点

  • 序盤定石のデータが貧弱すぎてあまり効果が無い
  • 少なく取ろうとするあまり、むしろヘボ相手だと中盤に全滅されることがある
  • 何のタイミングで中盤から終盤に移行するべきか

今回のソースのスナップショット