███╗   ███╗███████╗███╗   ██╗ █████╗  ██████╗███████╗
████╗ ████║██╔════╝████╗  ██║██╔══██╗██╔════╝██╔════╝
██╔████╔██║█████╗  ██╔██╗ ██║███████║██║     █████╗
██║╚██╔╝██║██╔══╝  ██║╚██╗██║██╔══██║██║     ██╔══╝
██║ ╚═╝ ██║███████╗██║ ╚████║██║  ██║╚██████╗███████╗
╚═╝     ╚═╝╚══════╝╚═╝  ╚═══╝╚═╝  ╚═╝ ╚═════╝╚══════╝
#ии#алгоритмы#javascript
ИИ из 1960-х, который до сих пор учит

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

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

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

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

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

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

Устройство:
1. Спичечные коробки: Каждый коробок представлял уникальное состояние доски, с которым мог столкнуться MENACE (всего 304).
2. Цветные бусины: Внутри каждого коробка были цветные бусины. Каждый цвет представлял возможный ход из этого состояния доски.
3. Игра: Чтобы сделать ход, нужно было найти коробок для текущего состояния доски, встряхнуть его и вытащить одну бусину наугад. Цвет указывал, в какую клетку играть.
4. Обучение: После игры:
Если 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 и наблюдай, как он улучшается
Смотри визуализацию состояния мозга (о чём он «думает»)
Отслеживай статистику побед/ничьих/поражений
Экспортируй/импортируй состояния мозга для обмена обученными ИИ
Сбрасывай и тренируй с нуля

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

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

Заключение

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

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

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

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

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

Оригинальная статья Дональда Мичи: "Trial and Error" (1961)
Отличная статья Matthew Scroggs о MENACE
Reinforcement Learning: An Introduction (Sutton & Barto)
Моя реализация: Живое демо
Понравилось? Хотите обсудить ИИ, алгоритмы или создать что-то вместе?