Симулятор жизни на Python + TypeScript + HTML5 Canvas. Введение. Проектирование среды и базовой механики агентов

Недавно увлекся чтением книг о нашей психологии, привычках и теории игр. Но мне всегда было интересно посмотреть, как эти законы работают на практике.
Помимо книг о психологии, я попутно изучаю линейную алгебру и искусственный интеллект. И чтобы не учиться «в стол», я начал пет‑проект — мультиагентную песочницу эволюции. Я создаю цифровой мир на TypeScript и Python, где маленькие агенты будут управляться простейшими нейросетями и выживать по законам жесткого отбора.
Честно скажу: я не знаю, что из этого выйдет, доведу ли я проект до конца и каким он получится. Возможно, мои агенты научатся ходить, возможно — сойдут с ума от переизбытка нейронов, а возможно — сразу вымрут от голода. Но я хочу отпустить контроль и просто разделить с вами это путешествие. Добро пожаловать в дневник Творца‑недоучки.
Идея написать приложение пришла мне полторы недели назад. Я уже несколько месяцев изучаю линейную алгебру и чуть меньше — нейросети. Решил, что для закрепления знаний лучше всего выбрать практический проект.
Наверное, в 90% подобных случаев возникает мысль написать приложение для анализа и предсказания цен на финансовых рынках или чего‑то в этом роде. И хотя тема в этом плане хорошая, я не хотел заниматься тем, к чему душа не лежит. Немного подумав, я решил, что симуляция жизни будет неплохим проектом. Пусть это не самое полезное, что можно придумать, но именно этим лично мне интересно заниматься.
Я набросал простенькую страничку на React и базовый прототип программы. Ну как... «прототип» — сильно сказано. По сути, просто сделал так, чтобы по экрану бегал «агент» и натыкался на «кустик». Это служило скорее проверкой работоспособности.
Я довольно быстро понял, что для нормальной симуляции JavaScript не подойдет, поэтому выбор пал на написание бэкенда на Python. Я выбрал этот язык, потому что в учебнике, по которому я изучаю нейросети, используется именно он. Не стал долго размышлять, правильно это или нет: в любом случае для меня это новый инструмент, и освоить его — отличный навык.
С помощью нейронки я набросал простенький сервер. Для справки: нейросетью я пользуюсь часто, но не для того, чтобы бездумно копировать выдаваемый код. К тому же такой подход довольно быстро заводит в тупик. Время от времени, общаясь с ИИ, я замечал, что если диалог разрастается до огромных масштабов, он начинает путаться в контексте, забывать вещи, и чат приходится обновлять. А в новом чате нужно объяснять контекст заново. И если я буду просто копировать код, то в будущем, только чтобы ввести ИИ в курс дела, придется тратить кучу времени и сил, которые, скорее всего, не окупятся. Я знаю, что есть более продвинутые системы, но, как я уже говорил, я хочу сам разобраться в том, что делаю, а не просто получить готовый результат. Поэтому с нейронкой я общаюсь скорее для того, чтобы лучше обрисовать концепцию, дальнейшие шаги, подсветить слепые пятна и так далее.
В общем, я набросал простенький сервер, создал классы агента и куста с едой и столкнулся с первой проблемой. Сделал так, чтобы сервер отправлял данные на фронтенд с частотой 2 Гц (два раза в секунду). Проблема — синхронизация положения агента на бэке и на фронте. Сначала я просто передавал данные с бэкенда. Ожидаемо, агент дважды в секунду просто скакал по полю. Меня этот вариант не устраивал.
Тогда я подумал добавить интерполяцию: чтобы фронтенд на основе данных о положении и скорости агента предсказывал и дорисовывал траекторию точки. Я долго бился с коэффициентами, но дерганность никуда не уходила. Тут я впервые малодушно подумал забросить проект. Честно говоря, мне довольно стыдно за первую реакцию, тем более что столкнулся я с этой проблемой ночью.
Но утром, проснувшись, я задался вопросом: «А как в ММО обеспечивают плавное движение персонажей по экрану?» Немного покопавшись, я наткнулся на такую штуку, как LERP — линейная интерполяция. Суть примерно та же, что я использовал в первый раз для сглаживания, но чуть более продвинутая. В принципе, совсем со скачками справиться еще не получилось, но сами по себе они стали плавнее — как будто агент передвигается вприпрыжку. Сейчас я прочитал про Snapshot Interpolation (интерполяцию снимков состояния). Дальше попробую реализовать передвижение через нее. Посмотрим, что получится.
Это первая часть моего дневника разработки. До этого я никогда не занимался написанием статей, так что это мой первый публичный опыт ведения блога и где‑то скорее всего будет хромать стиль или оформление. Если вам интересно следить за развитием проекта, то буду очень рад услышать ваше мнение и конструктивную критику в комментариях. На основе вашей обратной связи я пойму, в каком направлении двигаться дальше и как часто выпускать продолжение. Спасибо за внимание!
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.