FlyBrain: босс, которым управляет мозг мухи
Пока все обсуждают, как подключить коннектом мухи к Doom, я сделал наоборот: написал игру под муху. FlyBrain — это босс в аркадном файтинге, которым в реальном времени управляет биофизическая симуляция всей центральной нервной системы дрозофилы.
Не дерево поведения и не политика, обученная обучением с подкреплением, а 164 506 нейронов из открытого датасета MaleCNS v1.0 (Janelia/FlyEM). Каждый нейрон — простая модель «накопил заряд, протёк, выстрелил» (leaky integrate-and-fire), соединённая с соседями ровно так, как они соединены у настоящей мухи.
Почему не Doom
У проектов «коннектом играет в Doom» общая проблема: игра совершенно чужая для насекомого. Дискретные кнопки, которых у мухи нет, награда приходит раз в минуту, а тяжёлый движок не даёт гонять миллионы симуляций. Поэтому я перевернул задачу:
- Движок боя написан на Rust как чистая функция. Никакого ввода-вывода, глобального состояния и неконтролируемого рандома. Одна точка входа:
pub fn step(w: &mut World, input: PlayerInput, action: BossAction) -> StepEvents- Детерминизм до бита: в Python через PyO3 движок выдаёт больше миллиона шагов в секунду, а в браузере тот же код, собранный в WebAssembly, повторяет бой кадр в кадр при 60 FPS.
- Вход мухи — 43 числа в её собственной системе координат: 16 лучей до препятствий, положение и скорость противника, своё здоровье и кулдауны и отдельный сигнал looming, то есть скорость, с которой на неё что-то надвигается.
Что уже умеет муха
| Действие | Какой контур мозга | Статус |
|---|---|---|
| Уклонение | LC4 + LPLC2 → гигантское волокно DNp01 | работает, отклик в 30–70 раз сильнее контроля |
| Ходьба | 381 мотонейрон ног в вентральной нервной цепочке | работает, плюс рефлекс «не врезаться в стену» |
| Выпад | феромон соперника → клетки Кеньона → MBON | тестируется |
| Награда и наказание | дофаминовые PAM и PPL1 | измерено |
Самое красивое — уклонение. Когда на муху летит снаряд, его изображение на сетчатке расширяется. Это расширение возбуждает нейроны LC4 и LPLC2, они синхронно бьют в гигантский нисходящий нейрон, и босс отпрыгивает. Мне не пришлось программировать эту реакцию: она уже была в проводке мозга.
Глаз мухи
В браузере есть отдельный экран: 1442 омматидия, шестиугольные «пиксели» фасеточного глаза, на которые проецируется арена. Видно, что именно видит муха перед тем, как принять решение. Рядом лежит Neuro-Lab: можно вручную возбуждать группы нейронов, например «лунную походку» MDN, и смотреть, как дёргаются ноги 3D-модели.
Что я понял
- Биология лучше любых моих эвристик там, где задача похожа на ту, что решала эволюция: увернуться, убежать, атаковать соперника.
- Чтобы такие эксперименты были возможны, движок должен быть детерминированным. Если один и тот же бой нельзя воспроизвести бит в бит, невозможно понять, муха поменяла решение или сломалась физика.
- Rust + WASM — отличная пара для научных игрушек: одна кодовая база для обучения и для демо.
Следующие пару дней я буду разбирать статьи, на которых этот проект стоит: сам коннектом FlyWire, модель мозга на LIF-нейронах и виртуальную муху NeuroMechFly.