オセロAIの構成

オセロは囲碁のクライアントを手本に作りました。Qt アプリ、VLM サーバー、Web対局(othello.mariago.kr)の三つの部分です。Webでは人が黒を持ち、相手をローカルAIと VLM から選びます。

人と打った記録

Webで終わった対局は31局です。人が23局、AIが7局勝ち、1局は引き分けでした。

人が勝った23局のうち12局は9手で終わりました。結果はすべて13–0で、白の石が盤に一つも残りませんでした。手順は二通りだけでした。

  • C4 C3 C2 C5 C6 D6 E6 F4 G4: 8局
  • D3 C3 B3 E3 F3 F4 F5 D6 D7: 4局

二つ目は一つ目を対角線で反転させた手順です。12局はすべて同じブラウザから打たれました。一度見つけた道を何度も繰り返したのです。

人と打った31局
人と打った31局

相手は誰だったのか

対局記録には、相手がローカルAIだったのか VLM だったのかは残りません。それでも12局はローカルAIが打った対局と見なせます。同じ手順が8回、4回とそのまま繰り返されたからです。3回目の記事で書きますが、VLM サーバーはこの期間ランダムに手を選んでおり、ランダムでは同じ手順は繰り返されません。

全滅の手順は二つだけだった

ローカルAIが白のとき、黒が打てるすべての手を11手目まで展開してみました。白を全滅させる手順はちょうど二つで、記録に残った二つの手順と同じでした。AIにあった穴はこの二つだけで、その穴を見つけて勝ち続けたのです。

この段階の実際のコード

対局記録のテーブルです。手順(moves)と結果(end_text)はありますが、相手の種類はありません。

othello-web/lib/db.tsts · 18行
CREATE TABLE IF NOT EXISTS games (
  code TEXT PRIMARY KEY,
  guest_id TEXT NOT NULL,
  access_key TEXT,
  size INTEGER NOT NULL DEFAULT 8,
  board TEXT NOT NULL,
  to_play INTEGER NOT NULL,
  last_r INTEGER,
  last_c INTEGER,
  move_no INTEGER NOT NULL DEFAULT 0,
  epoch INTEGER NOT NULL,
  started INTEGER NOT NULL DEFAULT 0,
  status TEXT NOT NULL DEFAULT 'playing',
  end_text TEXT,
  moves TEXT NOT NULL DEFAULT '[]',
  created_at TEXT NOT NULL,
  updated_at TEXT NOT NULL
);

次の記事は「2. 一手先しか見ないAI: 公開されたAIとソースが違っていた」です。