Thefittest: зачем я пишу свою open-source библиотеку эволюционных алгоритмов. github.. github. Open source.. github. Open source. python.. github. Open source. python. Алгоритмы.. github. Open source. python. Алгоритмы. искусственный интеллект.. github. Open source. python. Алгоритмы. искусственный интеллект. Машинное обучение.. github. Open source. python. Алгоритмы. искусственный интеллект. Машинное обучение. эволюционные алгоритмы.

Автор: Шерстнев Павел (проект Thefittest)

Опубликовано с разрешения автора

Эволюционный цикл. Источник: яндекс картинки

Эволюционный цикл. Источник: яндекс картинки

This preservation of favourable individual differences and variations, and the destruction of those which are injurious, I have called Natural Selection, or the Survival of the Fittest.” — Charles Darwin, On the Origin of Species, 1872, Chapter 4: Natural Selection

Эволюционные алгоритмы — это часть области искусственного интеллекта, которую называют вычислительный интеллект (Computational Intelligence). В отличие от «классического» машинного обучения, где всё завязано на строгих формулах и градиентах, вычислительный интеллект работает ближе к природе — через адаптацию, самоорганизацию и отбор. Если сказать проще, это способ искать оптимальные решения — максимумы и минимумы функций — по тем же законам, по которым эволюция ищет приспособленные формы жизни. Здесь решения «размножаются», «мутируют» и «соревнуются» между собой, а выживают те, кто ближе к цели.

Красиво? Да. А главное — это работает. С помощью эволюционных алгоритмов можно оптимизировать всё что угодно: от структуры нейросетей до формы деталей в инженерных системах или гиперпараметров моделей. Эволюционные алгоритмы применяются не только для оптимизации функций и нейросетей. Они подходят для AutoML, поиска архитектур (NAS) и настройки сложных AI‑пайплайнов — в том числе RAG‑систем и мультиагентных решений. И это не только теория — крупные исследовательские группы, включая Google DeepMind, уже применяют эволюционные методы даже в связке с LLM.

Когда начинаются трудности

Во времена моей учёбы в магистратуре системного анализа мы активно изучали эволюционные алгоритмы и их применение в машинном обучении. Самым сложным оказывалась практическая часть: существующие фреймворки либо устарели, либо требовали слишком много дополнительного кода. В итоге большую часть алгоритмов приходилось писать вручную. Особенно удивляло, что почти все библиотеки ограничиваются классическими реализациями, тогда как более современные подходы — вроде самоконфигурирования или адаптации на основе истории успеха — просто нельзя применить «из коробки». И это проблема не про «студентов и исследования». В индустрии ситуация такая же: современные эволюционные методы есть на Arxiv, в презентациях и демо, но не в репозиториях, которые можно встроить в пайплайн.

Так появился Thefittest

Логотип проекта

Логотип проекта

Thefittest (от англ. «the fittest», «наиболее приспособленный») — open‑source библиотека или фреймворк на Python из области вычислительного интеллекта, стоящей на пересечении оптимизации и искусственного интеллекта. Она объединяет эволюционные алгоритмы и инструменты для их применения в задачах машинного обучения.

Изначально я собирал в ней свои собственный рабочие реализации, чтобы не терять код и не переписывать одинаковые части заново. Но проект быстро вырос. Как человек, много раз сталкивавшийся с отсутствием современных готовых решений, я собрал всё в одном месте: сначала локально, потом на GitHub. В какой‑то момент стало очевидно: если этот код помогает мне, он может помочь и другим. Так Thefittest стал открытым проектом. Позже я выложил его на PyPI, чтобы устанавливать можно было одной командой:

pip install thefittest

С этого момента библиотека перестала быть «для себя» и стала «для других». И тут всё резко усложнилось: понадобились документация, тесты, CI/CD, скорость, совместимость с экосистемой ML. В какой‑то момент я понял простую вещь: написать алгоритмы — это половина дела. Чтобы библиотекой реально могли пользоваться, нужно построить вокруг неё инфраструктуру. Минимальный набор оказался таким:

  • автоматическое форматирование (например, black),

  • статическая проверка типов (mypy),

  • линтер (ruff или flake8),

  • автоматические тесты (pytest),

  • CI/CD в GitHub Actions,

  • анализ качества кода (Codacy или SonarCloud),

  • публикация на PyPI (poetry / twine),

  • документация (Sphinx или mkdocs).

Для пользователя это просто «установил и работает», а для разработчика — целая экосистема вокруг библиотеки. Примерно так выглядел технологический стек Thefittest на момент релиза:

Технологический стек Thefittest

Технологический стек Thefittest

Со временем Thefittest перестал быть просто «папкой с кодом». Сейчас это примерно 13 000 строк Python, из которых большая часть — основной функционал, а четверть — тесты. Проект тестируется на трёх версиях Python (3.9–3.11), проходят автоматические проверки качества кода, а покрытие уходит в Codecov.

Производительность без C

Эволюционные алгоритмы могут считать десятки тысяч итераций, огромные популяции и модели с сотнями параметров. На чистом Python это превращается в мучение. Чтобы библиотека оставалась быстрой и масштабируемой, я переписал критичные участки (скрещивание, мутации, обновление популяций, вычисления) с помощью Numba.

Это дало производительность, близкую к C/C++, но без ручной компиляции, зависимостей и боли с окружением. Важно, что такой подход позволяет применять Thefittest не только в исследовательских экспериментах, но и в реальных ML‑пайплайнах — от оптимизации гиперпараметров до NAS и промышленных задач.

Например, вот реальный оператор двухточечного скрещивания из библиотеки:

@njit(int8[:](int8[:, :], float64[:], float64[:]))
 def two_point_crossover(
   individs: NDArray[np.byte],
   fitness: NDArray[np.float64], rank: NDArray[np.float64]
 ) -> NDArray[np.byte]:
      
    size = len(individs[0])
    c_points = random_sample(range_size=size, quantity=2, replace=False)
    c_points = sorted(c_points)
    
    if flip_coin(0.5):
        offspring = individs[0].copy()
        other_individ = individs[1]
    else:
        offspring = individs[1].copy()
        other_individ = individs[0]
    
    for i in range(size):
        if c_points[0] <= i <= c_points[1]:
            offspring[i] = other_individ[i]
    
    return offspring

Всего один декоратор превращает эту функцию из обычного Python‑кода в JIT‑компилированную, работающую в разы быстрее.

Thefittest в действии

Большинство известных библиотек по эволюционным алгоритмам ограничиваются классическими методами и узким кругом задач. Thefittest задумывался иначе — как полноценный инструмент для прикладного искусственного интеллекта: его можно использовать не только в оптимизации функций, но и в реальных ML‑пайплайнах, AutoML, построении моделей и настройке сложных систем.

Сейчас в библиотеке реализовано около 12 эволюционных алгоритмов, работающих с непрерывными, целочисленными и категориальными параметрами. Семь из них раньше не были доступны в open‑source в рабочем, продакшен‑готовом виде: в лучшем случае они существовали только в статьях и псевдокоде.

Их можно применять прямо «из коробки» — для символьной регрессии, автоматического формирования архитектуры нейросетей, оптимизации гиперпараметров и других задач, где классические методы плохо работают или просто не подходят.

Дерево реализованных методов

Дерево реализованных методов

Интерфейс

Когда я только начинал работать с эволюционными алгоритмами, меня всегда удивляло, как многие используют DEAP. Это отличный фреймворк, но по сути — конструктор: чтобы собрать рабочий алгоритм, нужно вручную соединять блоки, писать свой пайплайн, настраивать операторы. На практике это часто превращается в копирование чужих примеров, чтобы «хоть как‑то запустить» оптимизацию.

В Thefittest я решил пойти другим путём — сделать всё максимально просто и готовым к применению. Любой алгоритм можно запустить как полноценный оптимизатор: достаточно передать целевую функцию как обычную Python‑функцию и указать количество итераций.

При этом возможности остаются гибкими: можно менять параметры, выбирать стратегии селекции, задавать оператор скрещивания, передавать callback‑функции. Всё это в привычном для Python‑разработчика формате, без лишнего кода и обёрток.

Сравнение "размера" вызова генетического алгоритма

Сравнение “размера” вызова генетического алгоритма

Совместимость со scikit-learn

Одно из ключевых требований к библиотекам машинного обучения на Python — совместимость со scikit‑learn. Это негласный стандарт всей экосистемы: знакомые методы fit(), predict(), score(), единые подходы к API и десятки инструментов.

Если модель поддерживает API sklearn, она сразу попадает в готовую инфраструктуру — кросс‑валидация, пайплайны, стекинг, автоматический подбор гиперпараметров.

В Thefittest это реализовано так: например, GeneticProgrammingRegressor можно использовать как обычную модель из sklearn — включать в стекинг, вызывать fit(), predict(), считать метрики и комбинировать с любыми другими алгоритмами.

from sklearn.ensemble import StackingRegressor
from thefittest.regressors import GeneticProgrammingRegressor
from thefittest.optimizers import SelfCGP
from sklearn.metrics import mean_squared_error, r2_score


# Конечная модель (GeneticProgrammingRegressor) импортируется из библиотеки thefittest
final_model = GeneticProgrammingRegressor(
    n_iter=200,
    pop_size=500,
    optimizer=SelfCGP,
    optimizer_args={"show_progress_each": 10, "keep_history": True, "max_level": 5},
)

# Создаем стэкинг-регрессор
stacking_regressor = StackingRegressor(
    estimators=base_models,  # Базовые модели в ансамбле стекинга
    final_estimator=final_model  # В качестве мета-модели используется GeneticProgrammingRegressor из thefittest
)

# Обучаем и оцениваем стэкинг-регрессор
stacking_regressor.fit(X_train, y_train)
y_pred_stack = stacking_regressor.predict(X_test)

# Вычисляем метрики
stacking_mse = mean_squared_error(y_test, y_pred_stack)
stacking_r2 = r2_score(y_test, y_pred_stack)

# Выводим результаты
print("nStacking model:")
print(f"MSE: {stacking_mse:.4f}, R2: {stacking_r2:.4f}")

По сути, Thefittest добавляет в экосистему sklearn новую категорию моделей — эволюционные, которые не только оптимизируют параметры, но и выводят на уровень автоматизации процессов машинного обучения.

Совместимость с PyTorch и обучение на GPU

Если для классических ML-моделей ключевым стандартом является совместимость со scikit-learn, то для нейросетей — возможность обучения на GPU. Поэтому в Thefittest добавлена интеграция с PyTorch: эволюционные алгоритмы оптимизируют структуру модели, а веса обучаются с помощью стандартных оптимизаторов torch.optim на GPU.

Это позволяет использовать гибридный подход: эволюция отвечает за архитектуру и гиперпараметры, а градиентные методы — за точность. При этом всё остаётся в привычном для Python формате — без дополнительных обёрток и «ручных» интерфейсов.

from thefittest.optimizers import SelfCGP
from thefittest.classifiers import GeneticProgrammingNeuralNetClassifier
from thefittest.benchmarks import IrisDataset

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import minmax_scale

import torch
import torch.optim as optim

# Данные
data = IrisDataset()
X, y = minmax_scale(data.get_X()), data.get_y()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

# Автоматический выбор устройства
device = "cuda" if torch.cuda.is_available() else "cpu"

model = GeneticProgrammingNeuralNetClassifier(
    n_iter=10,
    pop_size=10,
    optimizer=SelfCGP,
    weights_optimizer=optim.Adam,
    weights_optimizer_args={"iters": 1000, "lr": 0.01},
    device=device
)

model.fit(X_train, y_train)
preds = model.predict(X_test)

Не просто библиотека, а технология

В основе проекта моя диссертационная работа. В ходе исследований я разработал модификации эволюционных алгоритмов, которые автоматически подстраивают собственные параметры в процессе работы. Это решает главную проблему классических ГА и ГП — необходимость ручной настройки и хрупкость при изменении свойств задачи. Самоадаптация делает алгоритмы устойчивыми, повышает точность и позволяет применять их в реальных инженерных сценариях. Часть этих методов уже реализована в Thefittest, часть — в процессе интеграции. Среди них:

  • самоконфигурируемые генетические алгоритмы с адаптацией по истории успеха (SelfCSHAGA, PDPSHAGA);

  • самоконфигурируемые варианты генетического программирования (SelfCSHAGP, PDPSHAGP);

  • метод автоматизированного проектирования ансамблей нейросетей (GPENN).

Эти алгоритмы впервые будут доступны в открытом виде. На основе Thefittest уже создано шесть программных систем, зарегистрированных в Роспатенте. Некоторые примеры решаемых задач:

Краткосрочный прогноз силы ветра на морском побережье

Построена гибридная модель: автоматически спроектированный ансамбль нейросетей + интерпретируемая нечёткая логика, обе части формируются самоконфигурируемыми эволюционными алгоритмами. Подход ориентирован на оперативный прогноз на горизонте 1–3 часа с балансом между качеством и объяснимостью для практического применения.

Моделирование акустических характеристик древесных панелей

Разработана программная система, автоматически проектирующая интерпретируемые модели звукового давления с помощью самоконфигурируемых эволюционных алгоритмов. Система позволяет прогнозировать звукоизоляционные свойства древесных панелей по технологическим параметрам.

Ключевой эффект этой технологии в том, что модели формируются автоматически — без ручного подбора параметров и без участия эксперта по машинному обучению или эксперта предметной области. Самоконфигурируемые эволюционные алгоритмы сами оптимизируют структуру, параметры и архитектуру моделей, а также меняют стратегию оптимизации в процессе поиска решения, что позволяет использовать их для моделирования сложных систем даже тем, кто не занимается ML профессионально.

Признание и популяризация

Проект выходит за рамки личного инструмента: я регулярно показываю его на научных и инженерных мероприятиях, он используется в прикладных задачах и получает независимые оценки. За все время существования библиотека и связанная с ней работа получили признание на ряде профильных мероприятий:

Отдельно я особенно горжусь победой в премии «Гравитация 2025» — одном из крупных российских конкурсов в области ИИ. Thefittest победил в номинации «Алгоритмы и программные решения в области ИИ и больших данных». Для меня это подтверждение того, что библиотека ценна не только как учебно‑исследовательский инструмент, но и как технологическая разработка, признанная экспертами.

Победа в гравитации

Победа в гравитации

Куда дальше

Конечно, это не законченный продукт и не «идеальная» библиотека, а всё, что описано выше, по сути лишь уверенный старт. За время презентаций и выступлений я много раз слышал критику — и в большинстве случаев она была обоснованной. Например, в некоторых алгоритмах я действительно «изобретал велосипед». Вместо переписывания чужих реализаций с нуля нужно учиться интегрировать их в экосистему библиотеки. Это позволит запускать, например, L-SRTDE прямо из Thefittest, без переписывания исходников. Это и правильнее, и эффективнее, и полезнее для пользователей.

Так зачем же я пишу свою open-source библиотеку эволюционных алгоритмов?

Когда‑то Thefittest был просто рабочим набором инструментов, собранным «для себя». Сейчас это технология, которую можно интегрировать в реальные AI‑проекты: оптимизацию моделей, AutoML, построение нейросетевых архитектур, символьную регрессию и прогнозирование сложных систем. Поэтому главный ориентир — не просто публиковать код, а доводить решения до практической применимости.

Чтобы упростить старт, уже подготовлены рабочие примеры: запуск оптимизаторов, автоматическое построение моделей, подключение собственных операторов, использование через API scikit‑learn, а также Jupyter‑ноутбук на Kaggle, который можно запустить без настройки окружения. Это делает технологию доступной разработчикам, инженерам и исследовательским группам, даже без глубокой подготовки в ML. Полноценная документация сейчас в разработке — я постепенно переношу туда инструкции, типовые сценарии и примеры.

Код открыт не только на GitHub, но и на GitVerse — это шаг к тому, чтобы библиотека была доступна внутри российских AI‑проектов и могла развиваться как часть отечественной научно‑технологической инфраструктуры.

Если кратко: цель Thefittest — вывести эволюционные алгоритмы из статей и лабораторных прототипов в прикладной уровень, где ими можно действительно пользоваться. Не как идеей, а как инструментом.

Автор: konstantin_kozhin

Источник

Rambler's Top100