Создаём MENACE: ИИ из 1960-х, который до сих пор учит
#ии #алгоритмы #javascript

ИИ из 1960-х, который до сих пор учит

В 1961 году Дональд Мичи создал «машину» для игры в крестики-нолики из 304 спичечных коробков и цветных бусин. Без компьютеров. Без кода. Только физические объекты и простое правило обучения.

Она научилась играть в крестики-нолики методом проб и ошибок — и это работало.

Недавно я реализовал MENACE (Machine Educable Noughts And Crosses Engine) на TypeScript, и этот опыт научил меня большему об обучении с подкреплением, чем любой туториал по нейросетям.

→ Попробовать демо

Как работал оригинальный MENACE

Физический MENACE был прекрасно прост:

Устройство:

Спичечные коробки:

Каждый коробок представлял уникальное состояние доски, с которым мог столкнуться MENACE (всего 304).

Цветные бусины:

Внутри каждого коробка были цветные бусины. Каждый цвет представлял возможный ход из этого состояния доски.

Игра:

Чтобы сделать ход, нужно было найти коробок для текущего состояния доски, встряхнуть его и вытащить одну бусину наугад. Цвет указывал, в какую клетку играть.

Обучение:

После игры:

  • -

    Если MENACE выиграл: добавить 3 бусины каждого использованного цвета

  • -

    Если MENACE сыграл вничью: добавить 1 бусину каждого использованного цвета

  • -

    Если MENACE проиграл: убрать 1 бусину каждого использованного цвета (минимум 1)

Вот и всё. Никаких градиентов. Никакого обратного распространения. Никаких нейросетей. Только бусины и спичечные коробки.

И он учился. После примерно 200 игр MENACE становился практически непобедимым.

Перевод на TypeScript

Основная идея прекрасно переводится в код. Вместо спичечных коробков и бусин используем объекты и числа.


// Представление доски
type Board = Array<'' | 'X' | 'O'>;  // 9 клеток

// Мозг: отображение состояний доски на веса ходов
interface BrainState {
  [boardKey: string]: BeadCount;
}

interface BeadCount {
  [position: number]: number;  // позиция -> количество "бусин"
}

// Пример состояния мозга:
{
  "___-___-___": {  // пустая доска
    0: 10,  // центр имеет 10 бусин (высокий вес)
    1: 5,   // углы имеют по 5 бусин
    4: 8,   // и т.д.
  },
  "X__-___-___": {  // после хода противника в угол
    4: 12,  // центр сильно предпочтителен
    2: 3,
    6: 3,
  }
}

  • -

    Ключевой инсайт: количество бусин = вес вероятности для этого хода.

  • -

    Если центральная клетка имеет 10 бусин, а угол 5, ИИ в два раза вероятнее сыграет в центр.

Ключевые моменты реализации

1. Выбор хода


function chooseMove(board: Board, brain: BrainState): number {
  const boardKey = serializeBoard(board);
  const weights = brain[boardKey] || initializeWeights(board);

  // Взвешенный случайный выбор
  const totalBeads = Object.values(weights).reduce((a, b) => a + b, 0);
  let random = Math.random() * totalBeads;

  for (const [position, beads] of Object.entries(weights)) {
    random -= beads;
    if (random <= 0) {
      return Number(position);
    }
  }
}

2. Обучение на результатах


function updateBrain(
  brain: BrainState,
  movesHistory: Array<{ board: Board; move: number }>,
  result: 'win' | 'draw' | 'loss'
): void {
  const beadChange = result === 'win' ? 3 : result === 'draw' ? 1 : -1;

  for (const { board, move } of movesHistory) {
    const boardKey = serializeBoard(board);
    const currentBeads = brain[boardKey][move];

    // Обновляем количество бусин (минимум 1)
    brain[boardKey][move] = Math.max(1, currentBeads + beadChange);
  }
}

3. Сохранение в IndexedDB

Одна из крутейших частей: мозг сохраняется между сессиями. Когда закрываешь страницу и возвращаешься, MENACE помнит всё, чему научился.

Это создаёт мощный цикл: чем больше играешь, тем умнее он становится. Оставь его на несколько сотен игр, и его станет почти невозможно победить.

Что делает этот алгоритм прекрасным

1. Он объясним

Ты буквально можешь видеть, почему MENACE сделал ход. «У этой клетки 12 бусин, у той 3, поэтому в 4 раза вероятнее выберет эту». Попробуй объяснить это с нейросетью.

2. Он минимален

Весь алгоритм обучения — ~50 строк кода. Никаких библиотек. Никаких фреймворков. Только взвешенный случайный выбор и простая арифметика.

3. Он интуитивен

Правило обучения понятно каждому: «если этот ход привёл к победе, делай его чаще. Если привёл к поражению, делай реже». Люди тоже так учатся.

4. Он работает

Несмотря на возраст с 1961 года, алгоритм всё ещё эффективен. После ~200 игр MENACE редко ошибается. Он открывает оптимальные стратегии чисто через опыт.

Уроки для современной ИИ-разработки

Чему меня научил MENACE:

  • -

    Обучение с подкреплением не новое — мы понимаем основную идею уже 60+ лет

  • -

    Простые алгоритмы могут решать сложные задачи, если дать им достаточно итераций

  • -

    Объяснимость важна — возможность инспектировать «мозг» невероятно ценна

  • -

    Иногда лучший способ изучить алгоритм — реализовать его с нуля

  • -

    Физические аналогии (спичечные коробки и бусины) могут помочь понять абстрактные концепции

Современный ИИ стал невероятно сложным. Но в своей основе он всё ещё делает то, что делал MENACE: пробует разное, смотрит, что работает, и корректирует вероятности.

Мы добавили слои сложности — нейросети, обратное распространение, градиентный спуск — но фундаментальная идея остаётся: учиться на опыте.

Попробуй сам

Я создал живую реализацию, с которой можно поиграть. Смотри, как MENACE учится в реальном времени:

  • -

    Играй против MENACE и наблюдай, как он улучшается

  • -

    Смотри визуализацию состояния мозга (о чём он «думает»)

  • -

    Отслеживай статистику побед/ничьих/поражений

  • -

    Экспортируй/импортируй состояния мозга для обмена обученными ИИ

  • -

    Сбрасывай и тренируй с нуля

→ Играть в MENACE

Совет: Дай ему проиграть первые 20-30 игр. Смотри, как он адаптируется. К игре 100 тебе будет сложно его победить.

Это обучение с подкреплением в действии — никаких изменений кода, только опыт.

Заключение

Создание MENACE оказалось одним из тех редких проектов, где реализация была даже более образовательной, чем я ожидал.

Это напоминание, что ИИ не обязательно должен быть чёрным ящиком нейросетей, обученных на миллионах примеров. Иногда простейшие алгоритмы — те, которые можно объяснить спичечными коробками и бусинами — самые элегантные.

И в 2025, когда мы тонем в трансформерных моделях и сетях с миллиардами параметров, есть что-то освежающее в ИИ, который можно полностью понять за полдня.

Дональд Мичи был на правильном пути в 1961. Нам стоит это помнить.

Ссылки и дополнительное чтение

  • -

    Оригинальная статья Дональда Мичи: "Trial and Error" (1961)

  • -

    Отличная статья Matthew Scroggs о MENACE

  • -

    Reinforcement Learning: An Introduction (Sutton & Barto)

Моя реализация:

Живое демо

Понравилось? Хотите обсудить ИИ, алгоритмы или создать что-то вместе?

Связаться