<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sergey+Ivanov</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sergey+Ivanov"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Sergey_Ivanov"/>
	<updated>2026-10-23T05:55:33Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24924</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24924"/>
		<updated>2017-12-03T18:13:48Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Предположим, что сложность одного вычисления фитнес-функции имеет сложность &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|500px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: функция &amp;lt;math&amp;gt;f: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt; должно иметь некоторое программное представление, например, определена некоторая инъекция &amp;lt;math&amp;gt;\mathbb{R}^d \to \mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: субоптимальный &amp;lt;math&amp;gt;x \in \mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры&#039;&#039;&#039;:&lt;br /&gt;
* размер популяции (100-1000)&lt;br /&gt;
* количество особей для отбора (например, относительно объёма размера популяции; обычно 5-50%)&lt;br /&gt;
* операция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно это одна из типично используемых процедур: поэлементное среднее, какая-либо её стохастическая модификация, случайный выбор для каждого гена, от какого родителя взять значение.&lt;br /&gt;
* вероятность мутации одного гена; обычно 0,01 или меньше.&lt;br /&gt;
* критерий останова: например, достижение определённого результата или ограничение на количество эпох.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
На суперкомпьютере &amp;quot;Ломоносов&amp;quot; была проведена экспериментальная оценка сильной масштабируемости для задачи квадратичной сложности от размерности данных (100) с объёмом популяции 1000 и количеством отбираемых особей 100. В качестве операции кроссинговера было взято поэлементное среднее, один ген мутировал (сэмплировался случайно из диапазона &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt;) с вероятностью 0.01. Для количества процессоров 1, 2 ... 128 было проведено по три замера времени; для 256 и 512 два замера. Результаты приведены на рис.2&lt;br /&gt;
&lt;br /&gt;
[[file:GeneticOptimizationStrongScalability.png|thumb|center|600px|Рис.2. Сильная масштабируемость генетической оптимизации]]&lt;br /&gt;
&lt;br /&gt;
Узким горлом алгоритма для распараллеливания является процедура сортировки и последующего сэмплирования индексов родителей на основе результатов этого процесса, а точнее, сопряжённая с этим передача данных. В версии, для которой был проведён эксперимент, один процесс отвечал за сортировку и последующий кроссинговер, после чего передавал генотипы другим процессам для вычисления значения функции в этих точках. Видно, что начиная с некоторого количества процессоров, где-то 64-128, затраты на передачу массивов длины &amp;lt;math&amp;gt;D=100&amp;lt;/math&amp;gt; от одного процесса остальным начали перекрывать выигрыш от увеличения числа процессоров. Поэтому потенциально такая реализация не является оптимальной.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24922</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24922"/>
		<updated>2017-12-03T18:07:43Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Предположим, что сложность одного вычисления фитнес-функции имеет сложность &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|500px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: функция &amp;lt;math&amp;gt;f: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt; должно иметь некоторое программное представление, например, определена некоторая инъекция &amp;lt;math&amp;gt;\mathbb{R}^d \to \mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: субоптимальный &amp;lt;math&amp;gt;x \in \mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры&#039;&#039;&#039;:&lt;br /&gt;
* размер популяции (100-1000)&lt;br /&gt;
* количество особей для отбора (например, относительно объёма размера популяции; обычно 5-50%)&lt;br /&gt;
* операция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно это одна из типично используемых процедур: поэлементное среднее, какая-либо её стохастическая модификация, случайный выбор для каждого гена, от какого родителя взять значение.&lt;br /&gt;
* вероятность мутации одного гена; обычно 0,01 или меньше.&lt;br /&gt;
* критерий останова: например, достижение определённого результата или ограничение на количество эпох.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
На суперкомпьютере &amp;quot;Ломоносов&amp;quot; была проведена экспериментальная оценка сильной масштабируемости для задачи квадратичной сложности от размерности данных (100) с объёмом популяции 1000 и количеством отбираемых особей 100. В качестве операции кроссинговера было взято поэлементное среднее, один ген мутировал (сэмплировался случайно из диапазона &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt;) с вероятностью 0.1. Для количества процессоров 1, 2 ... 128 было проведено по три замера времени; для 256 и 512 два замера. Результаты приведены на рис.2&lt;br /&gt;
&lt;br /&gt;
[[file:GeneticOptimizationStrongScalability.png|thumb|center|600px|Рис.2. Сильная масштабируемость генетической оптимизации]]&lt;br /&gt;
&lt;br /&gt;
Узким горлом алгоритма для распараллеливания является процедура сортировки и последующего сэмплирования индексов родителей на основе результатов этого процесса, а точнее, сопряжённая с этим передача данных. В версии, для которой был проведён эксперимент, один процесс отвечал за сортировку и последующий кроссинговер, после чего передавал генотипы другим процессам для вычисления значения функции в этих точках. Видно, что начиная с некоторого количества процессоров, где-то 64-128, затраты на передачу массивов длины &amp;lt;math&amp;gt;D=100&amp;lt;/math&amp;gt; от одного процесса остальным начали перекрывать выигрыш от увеличения числа процессоров. Поэтому потенциально такая реализация не является оптимальной.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24661</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24661"/>
		<updated>2017-11-30T15:48:57Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|500px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: функция &amp;lt;math&amp;gt;f: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt; должно иметь некоторое программное представление, например, определена некоторая инъекция &amp;lt;math&amp;gt;\mathbb{R}^d \to \mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: субоптимальный &amp;lt;math&amp;gt;x \in \mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры&#039;&#039;&#039;:&lt;br /&gt;
* размер популяции (100-1000)&lt;br /&gt;
* количество особей для отбора (например, относительно объёма размера популяции; обычно 5-50%)&lt;br /&gt;
* операция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно это одна из типично используемых процедур: поэлементное среднее, какая-либо её стохастическая модификация, случайный выбор для каждого гена, от какого родителя взять значение.&lt;br /&gt;
* вероятность мутации одного гена; обычно 0,01 или меньше.&lt;br /&gt;
* критерий останова: например, достижение определённого результата или ограничение на количество эпох.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
На суперкомпьютере &amp;quot;Ломоносов&amp;quot; была проведена экспериментальная оценка сильной масштабируемости для задачи квадратичной сложности от размерности данных (100) с объёмом популяции 1000 и количеством отбираемых особей 100. В качестве операции кроссинговера было взято поэлементное среднее, один ген мутировал (сэмплировался случайно из диапазона &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt;) с вероятностью 0.1. Для количества процессоров 1, 2 ... 128 было проведено по три замера времени; для 256 и 512 два замера. Результаты приведены на рис.2&lt;br /&gt;
&lt;br /&gt;
[[file:GeneticOptimizationStrongScalability.png|thumb|center|600px|Рис.2. Сильная масштабируемость генетической оптимизации]]&lt;br /&gt;
&lt;br /&gt;
Узким горлом алгоритма для распараллеливания является процедура сортировки и последующего сэмплирования индексов родителей на основе результатов этого процесса, а точнее, сопряжённая с этим передача данных. В версии, для которой был проведён эксперимент, один процесс отвечал за сортировку и последующий кроссинговер, после чего передавал генотипы другим процессам для вычисления значения функции в этих точках. Видно, что начиная с некоторого количества процессоров, где-то 64-128, затраты на передачу массивов длины &amp;lt;math&amp;gt;D=100&amp;lt;/math&amp;gt; от одного процесса остальным начали перекрывать выигрыш от увеличения числа процессоров. Поэтому потенциально такая реализация не является оптимальной.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24660</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24660"/>
		<updated>2017-11-30T15:48:42Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|500px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: функция &amp;lt;math&amp;gt;f: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt; должно иметь некоторое программное представление, например, определена некоторая инъекция &amp;lt;math&amp;gt;\mathbb{R}^d \to \mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: субоптимальный &amp;lt;math&amp;gt;x \in \mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры&#039;&#039;&#039;:&lt;br /&gt;
* размер популяции (100-1000)&lt;br /&gt;
* количество особей для отбора (например, относительно объёма размера популяции; обычно 5-50%)&lt;br /&gt;
* операция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно это одна из типично используемых процедур: поэлементное среднее, какая-либо её стохастическая модификация, случайный выбор для каждого гена, от какого родителя взять значение.&lt;br /&gt;
* вероятность мутации одного гена; обычно 0,01 или меньше.&lt;br /&gt;
* критерий останова: например, достижение определённого результата или ограничение на количество эпох.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
На суперкомпьютере &amp;quot;Ломоносов&amp;quot; была проведена экспериментальная оценка сильной масштабируемости для задачи квадратичной сложности от размерности данных (100) с объёмом популяции 1000 и количеством отбираемых особей 100. В качестве операции кроссинговера было взято поэлементное среднее, один ген мутировал (сэмплировался случайно из диапазона &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt;) с вероятностью 0.1. Для количества процессоров 1, 2 ... 128 было проведено по три замера времени; для 256 и 512 два замера. Результаты приведены на рис.2&lt;br /&gt;
&lt;br /&gt;
[[file:GeneticOptimizationStrongScalability.png|thumb|center|600px|Рис.2. Сильная масштабируемость генетической оптимизации]]&lt;br /&gt;
&lt;br /&gt;
Узким горлом алгоритма для распараллеливания является процедура сортировки и последующего сэмплирования индексов родителей на основе результатов этого процесса, а точнее, сопряжённая с этим передача данных. В версии, для которой был проведён эксперимент, один процесс отвечал за сортировку и последующий кроссинговер, после чего передавал генотипы другим процессам для вычисления значения функции в этих точках. Видно, что начиная с некоторого количества процессоров, где-то 64-128, затраты на передачу массивов длины &amp;lt;math&amp;gt;D=100&amp;lt;/math&amp;gt; от одного процесса остальным начали перекрывать выигрыш от увеличения числа процессоров. Поэтому потенциально такая реализация не является оптимальной.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24659</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24659"/>
		<updated>2017-11-30T15:48:12Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|500px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: функция &amp;lt;math&amp;gt;f: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;&lt;br /&gt;
\mathbb{X} должно иметь некоторое программное представление, например, определена некоторая инъекция &amp;lt;math&amp;gt;\mathbb{R}^d \to \mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: субоптимальный &amp;lt;math&amp;gt;x \in \mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры&#039;&#039;&#039;:&lt;br /&gt;
* размер популяции (100-1000)&lt;br /&gt;
* количество особей для отбора (например, относительно объёма размера популяции; обычно 5-50%)&lt;br /&gt;
* операция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно это одна из типично используемых процедур: поэлементное среднее, какая-либо её стохастическая модификация, случайный выбор для каждого гена, от какого родителя взять значение.&lt;br /&gt;
* вероятность мутации одного гена; обычно 0,01 или меньше.&lt;br /&gt;
* критерий останова: например, достижение определённого результата или ограничение на количество эпох.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
На суперкомпьютере &amp;quot;Ломоносов&amp;quot; была проведена экспериментальная оценка сильной масштабируемости для задачи квадратичной сложности от размерности данных (100) с объёмом популяции 1000 и количеством отбираемых особей 100. В качестве операции кроссинговера было взято поэлементное среднее, один ген мутировал (сэмплировался случайно из диапазона &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt;) с вероятностью 0.1. Для количества процессоров 1, 2 ... 128 было проведено по три замера времени; для 256 и 512 два замера. Результаты приведены на рис.2&lt;br /&gt;
&lt;br /&gt;
[[file:GeneticOptimizationStrongScalability.png|thumb|center|600px|Рис.2. Сильная масштабируемость генетической оптимизации]]&lt;br /&gt;
&lt;br /&gt;
Узким горлом алгоритма для распараллеливания является процедура сортировки и последующего сэмплирования индексов родителей на основе результатов этого процесса, а точнее, сопряжённая с этим передача данных. В версии, для которой был проведён эксперимент, один процесс отвечал за сортировку и последующий кроссинговер, после чего передавал генотипы другим процессам для вычисления значения функции в этих точках. Видно, что начиная с некоторого количества процессоров, где-то 64-128, затраты на передачу массивов длины &amp;lt;math&amp;gt;D=100&amp;lt;/math&amp;gt; от одного процесса остальным начали перекрывать выигрыш от увеличения числа процессоров. Поэтому потенциально такая реализация не является оптимальной.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24657</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24657"/>
		<updated>2017-11-30T15:47:52Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|500px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: функция &amp;lt;math&amp;gt;f: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;&lt;br /&gt;
\mathbb{X} должно иметь некоторое программное представление, например, определена некоторая инъекция &amp;lt;math&amp;gt;\mathbb{R}^d \to \mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: субоптимальный &amp;lt;math&amp;gt;x in \mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры&#039;&#039;&#039;:&lt;br /&gt;
* размер популяции (100-1000)&lt;br /&gt;
* количество особей для отбора (например, относительно объёма размера популяции; обычно 5-50%)&lt;br /&gt;
* операция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно это одна из типично используемых процедур: поэлементное среднее, какая-либо её стохастическая модификация, случайный выбор для каждого гена, от какого родителя взять значение.&lt;br /&gt;
* вероятность мутации одного гена; обычно 0,01 или меньше.&lt;br /&gt;
* критерий останова: например, достижение определённого результата или ограничение на количество эпох.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
На суперкомпьютере &amp;quot;Ломоносов&amp;quot; была проведена экспериментальная оценка сильной масштабируемости для задачи квадратичной сложности от размерности данных (100) с объёмом популяции 1000 и количеством отбираемых особей 100. В качестве операции кроссинговера было взято поэлементное среднее, один ген мутировал (сэмплировался случайно из диапазона &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt;) с вероятностью 0.1. Для количества процессоров 1, 2 ... 128 было проведено по три замера времени; для 256 и 512 два замера. Результаты приведены на рис.2&lt;br /&gt;
&lt;br /&gt;
[[file:GeneticOptimizationStrongScalability.png|thumb|center|600px|Рис.2. Сильная масштабируемость генетической оптимизации]]&lt;br /&gt;
&lt;br /&gt;
Узким горлом алгоритма для распараллеливания является процедура сортировки и последующего сэмплирования индексов родителей на основе результатов этого процесса, а точнее, сопряжённая с этим передача данных. В версии, для которой был проведён эксперимент, один процесс отвечал за сортировку и последующий кроссинговер, после чего передавал генотипы другим процессам для вычисления значения функции в этих точках. Видно, что начиная с некоторого количества процессоров, где-то 64-128, затраты на передачу массивов длины &amp;lt;math&amp;gt;D=100&amp;lt;/math&amp;gt; от одного процесса остальным начали перекрывать выигрыш от увеличения числа процессоров. Поэтому потенциально такая реализация не является оптимальной.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24653</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24653"/>
		<updated>2017-11-30T15:22:15Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Возможные вариации ==&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|500px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: функция &amp;lt;math&amp;gt;f: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;&lt;br /&gt;
\mathbb{X} должно иметь некоторое программное представление, например, определена некоторая инъекция &amp;lt;math&amp;gt;\mathbb{R}^d \to \mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: субоптимальный &amp;lt;math&amp;gt;x in \mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры&#039;&#039;&#039;:&lt;br /&gt;
* размер популяции (100-1000)&lt;br /&gt;
* количество особей для отбора (например, относительно объёма размера популяции; обычно 5-50%)&lt;br /&gt;
* операция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно это одна из типично используемых процедур: поэлементное среднее, какая-либо её стохастическая модификация, случайный выбор для каждого гена, от какого родителя взять значение.&lt;br /&gt;
* вероятность мутации одного гена; обычно 0,01 или меньше.&lt;br /&gt;
* критерий останова: например, достижение определённого результата или ограничение на количество эпох.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
На суперкомпьютере &amp;quot;Ломоносов&amp;quot; была проведена экспериментальная оценка сильной масштабируемости для задачи квадратичной сложности от размерности данных (100) с объёмом популяции 1000 и количеством отбираемых особей 100. В качестве операции кроссинговера было взято поэлементное среднее, один ген мутировал (сэмплировался случайно из диапазона &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt;) с вероятностью 0.1. Для количества процессоров 1, 2 ... 128 было проведено по три замера времени; для 256 и 512 два замера. Результаты приведены на рис.2&lt;br /&gt;
&lt;br /&gt;
[[file:GeneticOptimizationStrongScalability.png|thumb|center|600px|Рис.2. Сильная масштабируемость генетической оптимизации]]&lt;br /&gt;
&lt;br /&gt;
Узким горлом алгоритма для распараллеливания является процедура сортировки и последующего сэмплирования индексов родителей на основе результатов этого процесса, а точнее, сопряжённая с этим передача данных. В версии, для которой был проведён эксперимент, один процесс отвечал за сортировку и последующий кроссинговер, после чего передавал генотипы другим процессам для вычисления значения функции в этих точках. Видно, что начиная с некоторого количества процессоров, где-то 64-128, затраты на передачу массивов длины &amp;lt;math&amp;gt;D=100&amp;lt;/math&amp;gt; от одного процесса остальным начали перекрывать выигрыш от увеличения числа процессоров. Поэтому потенциально такая реализация не является оптимальной.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GeneticOptimizationStrongScalability.png&amp;diff=24652</id>
		<title>Файл:GeneticOptimizationStrongScalability.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GeneticOptimizationStrongScalability.png&amp;diff=24652"/>
		<updated>2017-11-30T15:20:49Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24651</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24651"/>
		<updated>2017-11-30T15:20:13Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Возможные вариации ==&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: функция &amp;lt;math&amp;gt;f: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;&lt;br /&gt;
\mathbb{X} должно иметь некоторое программное представление, например, определена некоторая инъекция &amp;lt;math&amp;gt;\mathbb{R}^d \to \mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: субоптимальный &amp;lt;math&amp;gt;x in \mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры&#039;&#039;&#039;:&lt;br /&gt;
* размер популяции (100-1000)&lt;br /&gt;
* количество особей для отбора (например, относительно объёма размера популяции; обычно 5-50%)&lt;br /&gt;
* операция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно это одна из типично используемых процедур: поэлементное среднее, какая-либо её стохастическая модификация, случайный выбор для каждого гена, от какого родителя взять значение.&lt;br /&gt;
* вероятность мутации одного гена; обычно 0,01 или меньше.&lt;br /&gt;
* критерий останова: например, достижение определённого результата или ограничение на количество эпох.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
На суперкомпьютере &amp;quot;Ломоносов&amp;quot; была проведена экспериментальная оценка сильной масштабируемости для задачи квадратичной сложности от размерности данных (100) с объёмом популяции 1000 и количеством отбираемых особей 100. В качестве операции кроссинговера было взято поэлементное среднее, один ген мутировал (сэмплировался случайно из диапазона &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt;) с вероятностью 0.1. Для количества процессоров 1, 2 ... 128 было проведено по три замера времени; для 256 и 512 два замера. Результаты приведены на рис.2&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.2. Сильная масштабируемость генетической оптимизации]]&lt;br /&gt;
&lt;br /&gt;
Узким горлом алгоритма для распараллеливания является процедура сортировки и последующего сэмплирования индексов родителей на основе результатов этого процесса, а точнее, сопряжённая с этим передача данных. В версии, для которой был проведён эксперимент, один процесс отвечал за сортировку и последующий кроссинговер, после чего передавал генотипы другим процессам для вычисления значения функции в этих точках. Видно, что начиная с некоторого количества процессоров, где-то 64-128, затраты на передачу массивов длины &amp;lt;math&amp;gt;D=100&amp;lt;/math&amp;gt; от одного процесса остальным начали перекрывать выигрыш от увеличения числа процессоров. Поэтому потенциально такая реализация не является оптимальной.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24650</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24650"/>
		<updated>2017-11-30T15:18:46Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: функция &amp;lt;math&amp;gt;f: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;&lt;br /&gt;
\mathbb{X} должно иметь некоторое программное представление, например, определена некоторая инъекция &amp;lt;math&amp;gt;\mathbb{R}^d \to \mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: субоптимальный &amp;lt;math&amp;gt;x in \mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры&#039;&#039;&#039;:&lt;br /&gt;
* размер популяции (100-1000)&lt;br /&gt;
* количество особей для отбора (например, относительно объёма размера популяции; обычно 5-50%)&lt;br /&gt;
* операция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно это одна из типично используемых процедур: поэлементное среднее, какая-либо её стохастическая модификация, случайный выбор для каждого гена, от какого родителя взять значение.&lt;br /&gt;
* вероятность мутации одного гена; обычно 0,01 или меньше.&lt;br /&gt;
* критерий останова: например, достижение определённого результата или ограничение на количество эпох.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
На суперкомпьютере &amp;quot;Ломоносов&amp;quot; была проведена экспериментальная оценка сильной масштабируемости для задачи квадратичной сложности от размерности данных (100) с объёмом популяции 1000 и количеством отбираемых особей 100. В качестве операции кроссинговера было взято поэлементное среднее, один ген мутировал (сэмплировался случайно из диапазона &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt;) с вероятностью 0.1. Для количества процессоров 1, 2 ... 128 было проведено по три замера времени; для 256 и 512 два замера. Результаты приведены на рис.2&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.2. Сильная масштабируемость генетической оптимизации]]&lt;br /&gt;
&lt;br /&gt;
Узким горлом алгоритма для распараллеливания является процедура сортировки и последующего сэмплирования индексов родителей на основе результатов этого процесса, а точнее, сопряжённая с этим передача данных. В версии, для которой был проведён эксперимент, один процесс отвечал за сортировку и последующий кроссинговер, после чего передавал генотипы другим процессам для вычисления значения функции в этих точках. Видно, что начиная с некоторого количества процессоров, где-то 64-128, затраты на передачу массивов длины &amp;lt;math&amp;gt;D=100&amp;lt;/math&amp;gt; от одного процесса остальным начали перекрывать выигрыш от увеличения числа процессоров. Поэтому потенциально такая реализация не является оптимальной.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24647</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24647"/>
		<updated>2017-11-30T15:03:03Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: функция &amp;lt;math&amp;gt;f: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;&lt;br /&gt;
\mathbb{X} должно иметь некоторое программное представление, например, определена некоторая инъекция &amp;lt;math&amp;gt;\mathbb{R}^d \to \mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: субоптимальный &amp;lt;math&amp;gt;x in \mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры&#039;&#039;&#039;:&lt;br /&gt;
* размер популяции (100-1000)&lt;br /&gt;
* количество особей для отбора (например, относительно объёма размера популяции; обычно 10-50%)&lt;br /&gt;
* операция кроссинговера &amp;lt;math&amp;gt;Crossover: \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24483</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24483"/>
		<updated>2017-11-29T15:38:27Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} \sim \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
В данном разделе необходимо описать объем, структуру, особенности и свойства входных и выходных данных алгоритма: векторы, матрицы, скаляры, множества, плотные или разреженные структуры данных, их объем. Полезны предположения относительно диапазона значений или структуры, например, диагональное преобладание в структуре входных матриц, соотношение между размером матриц по отдельным размерностям, большое число матриц очень малой размерности, близость каких-то значений к машинному нулю, характер разреженности матриц и другие.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24458</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24458"/>
		<updated>2017-11-29T14:41:40Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} ~ \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступна для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
В данном разделе необходимо описать объем, структуру, особенности и свойства входных и выходных данных алгоритма: векторы, матрицы, скаляры, множества, плотные или разреженные структуры данных, их объем. Полезны предположения относительно диапазона значений или структуры, например, диагональное преобладание в структуре входных матриц, соотношение между размером матриц по отдельным размерностям, большое число матриц очень малой размерности, близость каких-то значений к машинному нулю, характер разреженности матриц и другие.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24456</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24456"/>
		<updated>2017-11-29T14:21:56Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} ~ \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступно для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента. &lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
В данном разделе необходимо описать объем, структуру, особенности и свойства входных и выходных данных алгоритма: векторы, матрицы, скаляры, множества, плотные или разреженные структуры данных, их объем. Полезны предположения относительно диапазона значений или структуры, например, диагональное преобладание в структуре входных матриц, соотношение между размером матриц по отдельным размерностям, большое число матриц очень малой размерности, близость каких-то значений к машинному нулю, характер разреженности матриц и другие.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24455</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24455"/>
		<updated>2017-11-29T14:21:38Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} ~ \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь. Зачастую соотношение между &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; таково, что сложность по факту становится &amp;lt;math&amp;gt;O(PF)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступно для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента. &lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
В данном разделе необходимо описать объем, структуру, особенности и свойства входных и выходных данных алгоритма: векторы, матрицы, скаляры, множества, плотные или разреженные структуры данных, их объем. Полезны предположения относительно диапазона значений или структуры, например, диагональное преобладание в структуре входных матриц, соотношение между размером матриц по отдельным размерностям, большое число матриц очень малой размерности, близость каких-то значений к машинному нулю, характер разреженности матриц и другие.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24454</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24454"/>
		<updated>2017-11-29T14:20:45Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} ~ \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке p1 и p2 формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступно для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента. &lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
В данном разделе необходимо описать объем, структуру, особенности и свойства входных и выходных данных алгоритма: векторы, матрицы, скаляры, множества, плотные или разреженные структуры данных, их объем. Полезны предположения относительно диапазона значений или структуры, например, диагональное преобладание в структуре входных матриц, соотношение между размером матриц по отдельным размерностям, большое число матриц очень малой размерности, близость каких-то значений к машинному нулю, характер разреженности матриц и другие.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24453</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24453"/>
		<updated>2017-11-29T14:20:25Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} ~ \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \log P &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \log P + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке &amp;lt;math&amp;gt;p1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p2&amp;lt;/math&amp;gt; формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции  &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступно для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента. &lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
В данном разделе необходимо описать объем, структуру, особенности и свойства входных и выходных данных алгоритма: векторы, матрицы, скаляры, множества, плотные или разреженные структуры данных, их объем. Полезны предположения относительно диапазона значений или структуры, например, диагональное преобладание в структуре входных матриц, соотношение между размером матриц по отдельным размерностям, большое число матриц очень малой размерности, близость каких-то значений к машинному нулю, характер разреженности матриц и другие.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24452</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24452"/>
		<updated>2017-11-29T14:19:50Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} ~ \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \logP &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \logP + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке &amp;lt;math&amp;gt;p1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p2&amp;lt;/math&amp;gt; формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:GA_Graph.png|thumb|center|300px|Рис.1. Информационный граф генетического поиска]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции  &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступно для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента. &lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
В данном разделе необходимо описать объем, структуру, особенности и свойства входных и выходных данных алгоритма: векторы, матрицы, скаляры, множества, плотные или разреженные структуры данных, их объем. Полезны предположения относительно диапазона значений или структуры, например, диагональное преобладание в структуре входных матриц, соотношение между размером матриц по отдельным размерностям, большое число матриц очень малой размерности, близость каких-то значений к машинному нулю, характер разреженности матриц и другие.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GA_Graph.png&amp;diff=24451</id>
		<title>Файл:GA Graph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:GA_Graph.png&amp;diff=24451"/>
		<updated>2017-11-29T14:18:56Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24450</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=24450"/>
		<updated>2017-11-29T14:18:08Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В типичной ситуации [[глоссарий#Вычислительное ядро|&#039;&#039;вычислительным ядром&#039;&#039;]] алгоритма является вычисление &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; значений оптимизируемой функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основными причинами такого положения являются следующие:&lt;br /&gt;
* генетические алгоритмы &amp;quot;специализированы&amp;quot; для оптимизации функций, для которых вычисление значения в точке является нетривиальной или достаточно вычислительно трудоёмкой процедурой.&lt;br /&gt;
* все остальные макрооперации алгоритма обычно имеют сложность или линейную от размерности пространства аргументов, или &amp;lt;math&amp;gt;O(PopulationSize \log PopulationSize)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt; редко превосходит 1000 &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм, как видно из математического описания алгоритма, состоит в проведении следующих макроопераций:&lt;br /&gt;
* вычисление значений &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; для каждой особи&lt;br /&gt;
* сортировка полученных значений&lt;br /&gt;
* сэмплирование индексов родителей для каждой особи из дискретного равномерного распределения&lt;br /&gt;
* проведение кроссинговера для генерации новых особей (типично представляет собой поэлементную процедуру над двумя векторами)&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
1. Провести инициализацию первой популяции &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Для каждой особи вычислить значение &amp;lt;math&amp;gt;f_i = F(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Отсортировать особи по массиву значений &amp;lt;math&amp;gt;f_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Проверить критерий останова. Если он выполнен, ответом алгоритма является &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Для каждой особи засэмплировать &amp;lt;math&amp;gt;p_{i1}, p_{i2} ~ \mathcal{U}\{0, SelectionSize\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Составить &amp;lt;math&amp;gt;{y_i = Crossover(x_{p_{i1}}, x_{p_{i2}})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Положить &amp;lt;math&amp;gt;{x} = {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Перейти к пункту 2&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Предположим, что сложность одного вычисления функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; имеет сложность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, процедура кроссинговера --- &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;; размер популяции для сокращения выкладок обозначим &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Рассчитаем сложность одной эпохи алгоритма:&lt;br /&gt;
&lt;br /&gt;
Этап 2 является наиболее вычислительно трудоёмким и имеет сложность &amp;lt;math&amp;gt;PF&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Этап 3 имеет сложность &amp;lt;math&amp;gt;P \logP &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этапы 4-5 имеют константную сложность.&lt;br /&gt;
&lt;br /&gt;
Этап 6 имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этап 7 также имеет сложность &amp;lt;math&amp;gt;PD&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для произвольной &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; в общем случае сложность алгоритма составляет &amp;lt;math&amp;gt;O(PF + P \logP + PD)&amp;lt;/math&amp;gt;, обычно выбор параметров таков, что вторым слагаемым можно пренебречь.&lt;br /&gt;
&lt;br /&gt;
При этом в памяти необходимо хранить два массива из &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; объектов из пространства &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;. В предположении, что его размерность совпадает со сложностью кроссинговера, это &amp;lt;math&amp;gt;2PD&amp;lt;/math&amp;gt; вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На рис.1 показана информационная структура типичного генетического поиска. Стоит отметить, что на рисунке &amp;lt;math&amp;gt;p1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p2&amp;lt;/math&amp;gt; формально являются не индексами родителей, а их генотипами, т.е. с точки зрения данного графа процедура сортировки возвращает отсортированный список именно что объектов &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt;; более частой реализацией является применение кроссинговера к особям с сэмплированными индексами, в таком случае формально требовалось бы соединить каждую из операций кроссинговера со всеми &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, получая таким образом на графе полносвязную структуру, являющуюся основным препятствием к распараллеливанию алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:Fig1.svg|thumb|center|300px|Рис.1. Информационная структура алгоритма умножения матриц]]&lt;br /&gt;
&lt;br /&gt;
Формально граф на рис.1 состоит из следующих элементов:&lt;br /&gt;
* для очередной популяции высчитываются значения фитнес-функции. Это происходит независимо для каждой особи, и может быть сделано параллельно.&lt;br /&gt;
* полученный набор значений подаётся на вход алгоритму сортировки &amp;lt;math&amp;gt;{x}&amp;lt;/math&amp;gt; в качестве критерия сортировки.&lt;br /&gt;
* вычисляются генотипы p1, p2 среди случайных особей, оказавшихся в топ-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; по результатам сортировки&lt;br /&gt;
* после предыдущей операции к генотипам p1, p2 независимо для каждой особи применяется &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt;&lt;br /&gt;
* полученные значения становятся новыми особями популяции  &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
На информационном графе на рис. 1 видно, что все вычисления фитнес-функции, самой трудоёмкой операции алгоритма, на одной эпохе можно распараллелить. Это позволяет в общем случае снизить стоимость одной эпохи с &amp;lt;math&amp;gt;O(PN)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;, и при больших &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; эта сложность принципиально неулучшаема (на каждом шаге оптимизации функции, для которой мы умеем только считать значение в некоторой точке, не может быть ничего оптимальнее, чем сделать это один раз). При возможности неограниченно распараллеливать вычисление, одна эпоха генетического алгоритма начинает стоить всего один вызов функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, что фундаментально является существенным преимуществом алгоритма.&lt;br /&gt;
&lt;br /&gt;
Информационный граф показывает, что также доступно для распараллеливания и операция кроссинговера. Однако, для этого требуется каждому процессу получить доступ к двум требуемым генотипам, находящимся у двух других процессов. В возникающей схеме взаимных обменов информации потенциальные затраты на организацию доступа и передачу данных могут оказаться выше проведения кроссинговера &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; раз на одном процессоре, однако такая альтернатива существует, и, особенно при нелинейной сложности кроссинговера, её стоит принимать во внимание.&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм эвристический, в оптимизационных целях был придуман ряд эвристик, направленных на увеличение потенциала распараллеливания:&lt;br /&gt;
* индексы родителей могут сэмплироваться так, чтобы заранее упростить процесс обмена сообщениями; в предельной идее, например, индексы родителей из топа-&amp;lt;math&amp;gt;SelectionSize&amp;lt;/math&amp;gt; для каждой новой особи можно зафиксировать, чтобы точно указать на информационном графе, какие именно генотипы для какой операции кроссинговера используются.&lt;br /&gt;
* отчасти упрощает распараллеливание такое ответвление генетического поиска, как естественный генетический поиск, в целом являющимся Монте-Карло методом оценки невычислимого градиента. &lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
В данном разделе необходимо описать объем, структуру, особенности и свойства входных и выходных данных алгоритма: векторы, матрицы, скаляры, множества, плотные или разреженные структуры данных, их объем. Полезны предположения относительно диапазона значений или структуры, например, диагональное преобладание в структуре входных матриц, соотношение между размером матриц по отдельным размерностям, большое число матриц очень малой размерности, близость каких-то значений к машинному нулю, характер разреженности матриц и другие.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23753</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23753"/>
		<updated>2017-11-04T11:55:32Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Возможные вариации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устраивать между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23739</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23739"/>
		<updated>2017-11-03T20:47:28Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Канонически использующаяся для описания алгоритма терминология взята из теории эволюции. Под &amp;quot;особью&amp;quot; в биологии понимают совокупность фенотипа и генотипа живого организма; с математической точки зрения, в рамках задачи оптимизации, можно положить, что &#039;&#039;генотипом&#039;&#039; является некоторая точка &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, а &#039;&#039;фенотипом&#039;&#039; - значение в данной точке функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Основная идея алгоритма заключается в том, чтобы в рамках некоторой &#039;&#039;популяции&#039;&#039;, т.е. набора особей, отобрать лучшие по фенотипу особи, а затем построить новую популяцию на основе только лучших генотипов. Одна такая итерация называется &#039;&#039;эпохой&#039;&#039;. Соответственно, два основных параметра алгоритма - размер популяции, и число отбираемых (&amp;quot;выживающих&amp;quot;) особей на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора выбирать две случайные особи и устроить между ними &amp;quot;сражение&amp;quot;, в котором одна из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23312</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23312"/>
		<updated>2017-10-22T17:04:53Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор текущей версии статьи: Иванов Сергей, гр. 417, 2017-ый год&lt;br /&gt;
&lt;br /&gt;
= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одна итерация алгоритма называется &#039;&#039;эпохой&#039;&#039;. На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора брать две случайные особи и устроить между ними &amp;quot;сражение&amp;quot;, в котором один из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23291</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23291"/>
		<updated>2017-10-22T16:21:09Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одна итерация алгоритма называется &#039;&#039;эпохой&#039;&#039;. На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора брать две случайные особи и устроить между ними &amp;quot;сражение&amp;quot;, в котором один из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23289</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23289"/>
		<updated>2017-10-22T16:20:31Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одна итерация алгоритма называется &#039;&#039;эпохой&#039;&#039;. На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Возможные вариации ==&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора брать две случайные особи и устроить между ними &amp;quot;сражение&amp;quot;, в котором один из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23287</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23287"/>
		<updated>2017-10-22T16:20:08Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одна итерация алгоритма называется &#039;&#039;эпохой&#039;&#039;. На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные вариации ===&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора брать две случайные особи и устроить между ними &amp;quot;сражение&amp;quot;, в котором один из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23285</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23285"/>
		<updated>2017-10-22T16:12:24Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Обычно для этого объекты пространства представляются в виде набора генов, т.е. по сути вещественных или бинарных векторов фиксированной (или даже меняющийся по ходу оптимизации&amp;lt;ref&amp;gt;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&amp;lt;/ref&amp;gt;) размерности. Функция кроссинговера обычно полагается независимой для каждого гена (то есть для каждого элемента последовательности): для бинарных генов с вероятностью 1/2 берётся ген первого аргумента, иначе второго; для вещественных генов &amp;lt;math&amp;gt;g_1, g_2&amp;lt;/math&amp;gt; результатом обычно полагается &amp;lt;math&amp;gt;\alpha g_1 + (1 - \alpha) g_2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\alpha \sim Unifrom(0, 1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы, таких как отбор признаков в задачах машинного обучения&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt; и задачи обучения с подкреплением&amp;lt;ref&amp;gt;https://www.jair.org/media/613/live-613-1809-jair.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одна итерация алгоритма называется &#039;&#039;эпохой&#039;&#039;. На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Возможные вариации ==&lt;br /&gt;
&lt;br /&gt;
Стоит отдельно отметить, что алгоритм допускает бесчисленное количество вариаций, и редко применяется в исходной форме. Модификациям можно подвергнуть практически любой этап алгоритма без существенного изменения идеи процесса. Большинство модификаций призвано бороться с главным недостатком алгоритма - отсутствием вариативности, вызванной похожестью результата операции кроссинговера на свои операнды. Ниже перечислены некоторые из возможных модификаций:&lt;br /&gt;
&lt;br /&gt;
* битвы на выживание: на этапе отбора брать две случайные особи и устроить между ними &amp;quot;сражение&amp;quot;, в котором один из них &amp;quot;погибает&amp;quot; (удаляется из популяции). Сражение может проходить по принципу &amp;quot;побеждает сильнейший&amp;quot;, или стохастически, с вероятностью победы пропорциональной силе особи, где сила - значение функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
* острова: запускать генетический поиск для нескольких независимо сэмплированных популяций и допускать редкие обмены генотипами между ними. Нестрого говоря, это позволяет найти несколько локальных максимумов, и проверить, нет ли лучших вариантов между ними.&lt;br /&gt;
* старение: оставлять топ-k особей популяции неизменными для следующего поколения; удалять их, если их &amp;quot;возраст&amp;quot; превысил определённый порог.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23271</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23271"/>
		<updated>2017-10-22T15:26:31Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одна итерация алгоритма называется &#039;&#039;эпохой&#039;&#039;. На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23270</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23270"/>
		<updated>2017-10-22T15:24:27Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный&amp;lt;ref&amp;gt;http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&amp;lt;/ref&amp;gt; субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы&amp;lt;ref&amp;gt;http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одна итерация алгоритма называется &#039;&#039;эпохой&#039;&#039;. На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23268</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23268"/>
		<updated>2017-10-22T15:22:40Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: /* Ссылки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одна итерация алгоритма называется &#039;&#039;эпохой&#039;&#039;. На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23267</id>
		<title>Участник:Sergey Ivanov/Генетические алгоритмы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey_Ivanov/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=23267"/>
		<updated>2017-10-22T15:20:08Z</updated>

		<summary type="html">&lt;p&gt;Sergey Ivanov: Новая страница: «== Описание алгоритма ==  Генетический алгоритм - универсальный субоптимальный метод опти…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Генетический алгоритм - универсальный субоптимальный метод оптимизации &amp;lt;math&amp;gt;F(x) \rightarrow \mathop{max}_x&amp;lt;/math&amp;gt;. Универсальность проявляется в его пригодности к задачам с произвольными функциями &amp;lt;math&amp;gt;F\colon \mathbb{X} \to \mathbb{R} &amp;lt;/math&amp;gt; и нетривиальной природой пространства аргументов &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
От функции &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; требуется только возможность вычислять её значение в произвольной точке. От пространства аргументов требуется наличие т.н. функции кроссинговера, т.е. функции &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;. Такие слабые требования позволяют алгоритму работать в случаях, где традиционные методы непрерывной оптимизации неприменимы.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; функция &amp;lt;math&amp;gt; F\colon \mathbb{X} \to \mathbb{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры алгоритма:&#039;&#039;&#039; размер популяции &amp;lt;math&amp;gt;PopulationSize&amp;lt;/math&amp;gt;, число выживающих особей на каждом этапе &amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt;, функция кроссинговера &amp;lt;math&amp;gt; Crossover\colon \mathbb{X}\times \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, критерий останова. Опционально: функция мутации &amp;lt;math&amp;gt; Mutation\colon \mathbb{X}\to \mathbb{X} &amp;lt;/math&amp;gt;, вероятность мутации &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; субоптимальный экстремум &amp;lt;math&amp;gt;x*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация: &#039;&#039;&#039; &amp;lt;math&amp;gt;Population_0 := PopulationSize&amp;lt;/math&amp;gt; случайных объектов из &amp;lt;math&amp;gt;\mathbb{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
До выполнения критерия останова:&lt;br /&gt;
* вычислить &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* оставить топ-&amp;lt;math&amp;gt;SurvivalSize&amp;lt;/math&amp;gt; особей из &amp;lt;math&amp;gt;Population_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* составить &amp;lt;math&amp;gt;Population_{i+1}&amp;lt;/math&amp;gt;: каждая новая особь есть результат применения &amp;lt;math&amp;gt;Crossover&amp;lt;/math&amp;gt; к двум случайным выжившим особям&lt;br /&gt;
* при наличии мутаций к каждой особи с вероятностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; применить функцию &amp;lt;math&amp;gt;Mutation&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одна итерация алгоритма называется &#039;&#039;эпохой&#039;&#039;. На выход алгоритм подаётся &amp;lt;math&amp;gt;\mathop{argmax}_{x \in Population_{last}} F(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1174&amp;amp;context=cs_techreports&lt;br /&gt;
http://www.boente.eti.br/fuzzy/ebook-fuzzy-mitchell.pdf&lt;/div&gt;</summary>
		<author><name>Sergey Ivanov</name></author>
	</entry>
</feed>