В этой серии статей вы узнаете, как генетические алгоритмы (также называемые эволюционными алгоритмами) могут помочь вам решать нелинейные задачи!

В первых статьях этой серии (ссылки на Часть 1 и Часть 2) я описал два возможных (и простых) способа использования генетических алгоритмов для решения нелинейных задач:

  1. Изучите как можно большую вселенную решений и выберите лучшее (-ие)
  2. Одно поколение за другим сужайте диапазон, исследуемый для каждой функции, чтобы быстрее находить оптимальное решение.

В этой последней статье мы будем использовать алгоритм, немного отличный от двух первых, основанный на принципе «мутации».

Идея заключается в следующем:

Мы инициируем первое поколение на основе характеристик исходного набора данных.

Мы выбираем n лучших людей этого поколения, исходя из их физической формы.

Мы создаем новое поколение, дублируя этих лучших людей и случайным образом изменяя их характеристики (= значения характеристик); это процесс «мутации». В данном примере это изменение будет выполнено в соответствии с коэффициентом стандартного отклонения.

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

Первоначальное создание набора данных и обучение модели аналогичны описанным в Части 2.

Мы доработаем этот процесс с помощью нескольких настроек:

  • Мы предотвращаем выход значений признаков за пределы первоначально наблюдаемых пределов вселенной (= universe_constraints).
  • Процесс мутации будет реализован с коэффициентом 0,5, который можно резюмировать следующим образом:
new_value = original_feature_value +/- one standard deviation * 0.5
  • По мере выполнения процесса оптимизации коэффициент стандартного отклонения будет постепенно уменьшаться, чтобы помочь более точно настроить отдельные характеристики. Для тех, кто знаком с проблемами Learning_rates, философия такая же!
Generation # / Distance from target
0 : 0.1339725062531727
1 : 0.10594988801634031
2 : 0.019531289828471188
5 : 0.01204014370247819
8 : 0.009155880407085704
11 : 0.008608138256597897
39 : 0.006970989388712212
47 : 0.0029122949569213574
55 : 0.001959993072830457
73 : 0.0012105657915313373
248 : 0.0011502227638615636
263 : 0.0008513611293921031
274 : 0.0000013788767674327573

Та же таблица с расстояниями, умноженными на 10⁶ для удобства чтения:

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

  • Большой случайный выбор (Часть 1) предлагает быстрые результаты, но требует больших вычислений по мере увеличения количества функций и сложности модели.
  • Узкий выбор мин. И макс. (Часть 2) позволит достичь гораздо большей точности при меньшем количестве созданных индивидов.
  • Выбор Std-Dev (часть 3) будет предлагать повышенную точность, но в значительной степени зависит от критериев создания процесса и выбора, которые мы определяем.


‹Ширина iframe =” 900 height = ”800 frameborder =” 0 scrolling = ”no” src = ”// plotly.com/~pierrelouisbescond/1.embed” ›‹/iframe›



Я искренне надеюсь, что вы оценили эту серию статей об оптимизации нелинейных задач!