Создаём MENACE: ИИ из 1960-х, который до сих пор учит
ИИ из 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)
Моя реализация:
Живое демо
Понравилось? Хотите обсудить ИИ, алгоритмы или создать что-то вместе?
Связаться