Pull to refresh

Эволюция гоночных автомобилей на JavaScript

Reading time 2 min
Views 50K
Возможно, вам доводилось видеть игру Box Car 2D — автогонки машинок, сгенерированных с помощью генетического алгоритма. Игра работает на платформе Flash и использует физический движок box2d. За тем, как из бесформенных уродцев через несколько десятков поколений развиваются вполне приличные гоночные автомобили, можно наблюдать часами. Игра существует уже несколько лет, а её фанаты соревнуются в выведении новых «пород» машинок на разных типах трасс. Недавно в сети появился клон этой игры под названием Genetic Cars, написанный на HTML5 и JavaScript. Хотя в нем ещё многого не хватает (например, редактора машинок), некоторые вещи сделаны гораздо лучше, чем в оригинале. Например, есть возможность наблюдать заезд всех машинок одновременно. И самое главное — можно ковыряться в исходниках!



JavaScript-версию написал с нуля Рафаэль Мацунага. Кроме открытых исходников и одновременного заезда всех машин в его версии есть возможность отключить рендеринг — в этом случае просчитывается только физика, и эволюция идёт в несколько раз быстрее. В отличие от Box Car D2, поведение машинок не полностью детерминировано — одна и та же машинка на одной и той же трассе может показывать слегка разные результаты, поэтому иногда новое поколение показывает худший результат, чем предыдущее. Тем не менее, трасса, генерируемая псевдослучайно на основе строки, которую может задавать пользователь, всегда одна и та же для одной и той же строки, так что возможность соревноваться есть.

В Genetic Cars также несколько меньше первоначальное генетическое разнообразие — у всех машин по два колеса. Всего геном автомобиля состоит из 14 генов — гораздо меньше, чем в Box Car 2D. 8 из них регулируют длину каждой вершины «тела», и по 3 на каждое колесо — расположение, размер и вес.

Пока я писал эту статью, в фоновом окне Chromium на трассе, сгенерированной на основе строки «habrahabr.ru» успели посоревноваться уже три десятка поколений машинок. Рекордный результат — 178,87 метра.

Tags:
Hubs:
+66
Comments 52
Comments Comments 52

Articles