Всем привет 👋
Помните, я советовал игру The Farmer Was Replaced, где надо программировать дрона-фермера? Кароч Kaggle как будто подслушал и запустил
Kaggriculture: то же самое, только против живых соперников и с призовым фондом $50k. Залетели туда с
Андреем на 2 месяца жизни. Рассказываю, как это было.
🎯 Что за задача
Это simulation-соревнование: сдаёшь не предсказания, а агента, и он играет матчи 1 на 1 с агентами других команд.
• У каждого ферма 10×10, сезон 30 дней по 24 хода, итого 720 ходов
• Сажаешь пшеницу, морковь, томаты, клубнику, дыни, заводишь гусей, коров и овец, нанимаешь работников
• Рынок общий и динамический: чем больше товара продали, тем ниже цена, причём сразу для обоих
• У кого на последнем ходу больше денег, тот и выиграл
⚙️ Специфика
• Рейтинг как в шахматах, по результатам матчей, шум ±90 очков на ровном месте
• Играют только два последних сабмита, а новый стартует с 600. Каждая отправка это обнуление слота на сутки-двое
• Верхушка сидит на одних и тех же публичных ноутбуках, поэтому 85% матчей это зеркало: два почти одинаковых бота делят один рынок
🤖 Месяц на RL
Начал как порядочный, с PPO и self-play. Агент выбирал макро-действия («купи корову», «найми работника»), рутину делал скриптовый автопилот. За месяц перебрал около 30 конфигураций:
• MLP от 64×64 до 384×384×384, LSTM с историей действий соперника, QR-DQN, маскирование недопустимых действий
• behavior cloning на реплеях топов и дообучение поверх него
• награда за свои деньги и за разницу с соперником, обучение против себя и против 677 записанных игр с лидерборда
Итог: лучший обученный агент заканчивал сезон с $32k и брал 34% матчей. Одна и та же конфигурация на разных сидах давала от $3k до $22k, то есть шум был больше любого эффекта, а целую неделю агент вообще сходился к «ничего не делать». Добила проверка: чужая записанная игра, проигранная без единого шага обучения, давала $114k и 360 побед из 360.
Почему не взлетело, честно не знаю. Скорее всего компьют: 1M шагов это всего ~1400 игр, а на T4 за 5 часов выходило 3.4M. А может, дело в награде: связать деньги в конце сезона с покупкой коровы на третий день сети тяжело.
🧪 Что сработало после
1. «Ленты». Мир почти детерминирован, поэтому сильный бот это записанный маршрут хорошей игры плюс реактивные слои сверху. Я сшивал такие маршруты из кусков под конкретный набор лавок в городе.
2. Гонка продаж. В зеркале выигрывает тот, кто продаёт на ход раньше. Один параметр «на сколько ходов опережать» давал +1000 монет за игру.
3. Отпечаток соперника. Касса противника после первого хода выдаёт его открытие: 2854, 2858 или 2865 монет. Уже на первом ходу понятно, с кем играешь.
4. Шерсть 🐑 Проигрываю группе ботов по 3000 за игру при одинаковых фермах. Посчитал выручку поштучно через хук на движок: шерсти поровну, но у них цена на 6% выше. Их работник сначала стрижёт и несёт на склад, а мой сначала кормит и чешет овцу и приходит на 3 часа позже, в уже просевший рынок. Переставил порядок, и проигранные миры перевернулись.
🪤 На чём обжёгся
• Тестировал на записях чужих игр, а запись не реагирует на твои действия: +468 на записях и 0 побед из 20 против живого бота
• Сравнивал себя со старой копией публичного ноутбука, а автор выкатил апдейт, который меня и вынес
🏆 Итог
Пик: 350-е место из 10 тысяч команд. Финальный результат будет позже: приём сабмитов закрыт, но агенты ещё доигрывают матчи и рейтинги сходятся.
📊 Фан-факты в цифрах
📦 111 сабмитов на двоих
💾 466 коммитов в моей ветке
🧬 63 версии агента и ещё 155 кандидатов, не доживших до сабмита
🤖 73 прогона обучения RL
🥊 187 чужих агентов из публичных ноутбуков для спаррингов
📼 6771 записанных игр с лидерборда против 3203 команд
⚔️ около 70 тысяч локальных матчей
📄 финальный агент: один файл на 7251 строку
📓 дневник экспериментов на 6784 строки