Como a IA de Othello é composta

O Othello foi feito tomando como modelo o cliente de go. São três partes: um app em Qt, um servidor de VLM e partidas na web (othello.mariago.kr). Na web, a pessoa joga com as pretas e escolhe como adversário a IA local ou o VLM.

Registros contra pessoas

31 partidas foram concluídas na web. As pessoas venceram 23, a IA venceu 7 e 1 terminou empatada.

Das 23 partidas vencidas por pessoas, 12 terminaram em 9 jogadas. Todas acabaram em 13–0, sem nenhuma peça branca restante no tabuleiro. Houve apenas duas sequências.

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

A segunda é a primeira espelhada na diagonal. Todas as 12 partidas vieram do mesmo navegador. Alguém encontrou um caminho uma vez e continuou repetindo.

As 31 partidas contra pessoas
As 31 partidas contra pessoas

Quem era o adversário

Os registros das partidas não indicam se o adversário era a IA local ou o VLM. Mesmo assim, dá para atribuir as 12 partidas à IA local, porque as mesmas sequências se repetiram exatamente oito e quatro vezes. Como vou contar no post 3, nesse período o servidor de VLM escolhia jogadas ao acaso, e jogando ao acaso a mesma sequência não se repete.

Só havia duas sequências de aniquilação

Com a IA local de brancas, expandimos todas as jogadas que as pretas podiam fazer até a 11ª jogada. Havia exatamente duas sequências que aniquilam as brancas, e eram as mesmas duas dos registros. Esses eram os únicos buracos da IA, e alguém os encontrou e continuou vencendo.

O código real desta etapa

Esta é a tabela de registros de partidas. Ela tem a sequência de jogadas (moves) e o resultado (end_text), mas não o tipo de adversário.

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

O próximo post é "2. Uma IA que só enxerga uma jogada à frente: a IA implantada era diferente do código-fonte".