Cómo está construida la IA de Othello

El Othello se construyó tomando como modelo el cliente de go. Tiene tres partes: una app de Qt, un servidor de VLM y el juego web (othello.mariago.kr). En la web, la persona juega con negras y elige como rival la IA local o el VLM.

Registros contra personas

En la web se terminaron 31 partidas. Las personas ganaron 23, la IA ganó 7 y hubo 1 empate.

De las 23 partidas que ganaron las personas, 12 terminaron en 9 jugadas. Todas acabaron 13–0, sin que quedara ni una sola ficha blanca en el tablero. Solo hubo dos secuencias.

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

La segunda es la primera reflejada sobre la diagonal. Las 12 partidas salieron del mismo navegador. Alguien encontró un camino una vez y lo siguió repitiendo.

Las 31 partidas contra personas
Las 31 partidas contra personas

¿Quién era el rival?

Los registros de las partidas no indican si el rival era la IA local o el VLM. Aun así, las 12 partidas pueden atribuirse a la IA local, porque las mismas secuencias se repitieron exactamente ocho y cuatro veces. Como explicaré en la entrada 3, durante ese periodo el servidor de VLM elegía las jugadas al azar, y al azar no se repite la misma secuencia.

Solo había dos secuencias de aniquilación

Con la IA local jugando con blancas, desplegamos todas las jugadas posibles de las negras hasta la jugada 11. Había exactamente dos secuencias que aniquilan a las blancas, y eran las mismas dos que aparecían en los registros. Esos eran los únicos agujeros que tenía la IA, y alguien los encontró y siguió ganando.

El código real de esta etapa

Esta es la tabla de registros de partidas. Tiene la secuencia de jugadas (moves) y el resultado (end_text), pero no el tipo de rival.

othello-web/lib/db.tsts · 18 líneas
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
);

La siguiente entrada es "2. Una IA que solo mira una jugada: la IA publicada no coincidía con el código fuente".