Объяснить метод дифференциальной эволюции
Может кто-нибудь объяснить, пожалуйста, метод дифференциальной эволюции? Определение Википедии чрезвычайно техническое.
Будем благодарны за дурацкое объяснение, сопровождаемое простым примером:)
3 ответа
Вот упрощенное описание. DE - это метод оптимизации, который итеративно модифицирует совокупность возможных решений, чтобы они сходились к оптимальной функции.
Сначала вы инициализируете свои варианты решения случайным образом. Затем на каждой итерации и для каждого возможного решения x вы делаете следующее:
- Вы создаете пробный вектор: v = a + ( b - c) / 2, где a, b, c - три различных варианта решения, выбранных случайным образом среди вашего населения.
- Вы случайным образом меняете компоненты вектора между x и v, чтобы получить v '. По крайней мере, один компонент из v должен быть заменен.
- вы заменяете x в вашем населении на v ', только если это лучший кандидат (т.е. он лучше оптимизирует вашу функцию).
(Обратите внимание, что приведенный выше алгоритм очень упрощен; не кодируйте его, найдите подходящую спецификацию в другом месте)
К сожалению, статья в Википедии не содержит иллюстраций. Это легче понять с помощью графического представления, некоторые из них вы найдете на следующих слайдах: http://www-personal.une.edu.au/~jvanderw/DE_1.pdf.
Он аналогичен генетическому алгоритму (GA) за исключением того, что решения-кандидаты рассматриваются не как двоичные строки (хромосома), а (обычно) как реальные векторы. Одним из ключевых аспектов DE является то, что размер шага мутации (см. Шаг 1 для мутации) является динамическим, то есть он адаптируется к конфигурации вашей популяции и будет стремиться к нулю, когда сходится. Это делает DE менее уязвимым для генетического дрейфа, чем GA.
Отвечая на мой собственный вопрос...
обзор
- Принципиальное различие между Генетическими Алгоритмами и Дифференциальной Эволюцией (DE) состоит в том, что Генетические Алгоритмы полагаются на кроссовер, в то время как эволюционные стратегии используют мутацию в качестве основного механизма поиска.
- DE генерирует новых кандидатов, добавляя взвешенную разницу между двумя членами населения к третьему члену (подробнее об этом ниже).
- Если полученный кандидат превосходит кандидата, с которым его сравнивали, он заменяет его; в противном случае первоначальный кандидат остается неизменным.
Определения
- Население состоит из
NP
кандидатов. Xi
= Родительский кандидат по индексуi
(индексы варьируются от0
вNP-1
) из текущего поколения. Также известен как целевой вектор.- Каждый кандидат содержит
D
параметры. Xi(j)
= J- й параметр в кандидатеXi
,Xa
,Xb
,Xc
= три случайных родительских кандидата.- Разностный вектор =
(Xb - Xa)
F
= Вес, который определяет скорость развития населения.- Идеальные значения: [0,5, 1,0]
CR
= Вероятность кроссовера.- Диапазон: [0, 1]
Xc`
= Мутантный вектор, полученный с помощью операции дифференциальной мутации. Также известен как донорский вектор.Xt
= РебенокXi
а такжеXc`
, Также известен как вектор испытаний.
Алгоритм
- На каждого кандидата в популяции
for (int i = 0; i<NP; ++i)
- Выберите трех разных родителей наугад (они должны отличаться друг от друга и
i
)
do
{
a = random.nextInt(NP);
} while (a == i)
do
{
b = random.nextInt(NP);
} while (b == i || b == a);
do
{
c = random.nextInt(NP);
} while (c == i || c == b || c == a);
- (Шаг мутации) Добавьте взвешенный вектор разности между двумя членами населения к третьему члену
Xc` = Xc + F * (Xb - Xa)
- (Шаг кроссовера) Для каждой переменной в
Xi
, примените равномерный кроссовер с вероятностьюCR
наследовать отXc`
; в противном случае наследовать отXi
, По крайней мере одна переменная должна быть унаследована отXc`
int R = random.nextInt(D);
for (int j=0; j < D; ++j)
{
double probability = random.nextDouble();
if (probability < CR || j == R)
Xt[j] = Xc`[j]
else
Xt[j] = Xi[j]
}
- (Шаг выбора) Если
Xt
превосходитXi
затемXt
заменяетXi
в следующем поколении. Иначе,Xi
сохраняется неизменным.
Ресурсы
- Смотрите это для обзора терминологии
- См. Оптимизация с использованием дифференциальной эволюции Васана Аруначалама для объяснения алгоритма дифференциальной эволюции
- См. Эволюция: обзор современного состояния Свагатамом Дасом и Поннутураем Нагаратнамом Сугантаном для различных вариантов алгоритма дифференциальной эволюции.
- Посмотрите Оптимизацию дифференциальной эволюции с нуля с Python для подробного описания реализации алгоритма DE в Python.
Работа алгоритма DE очень проста. Предположим, вам необходимо оптимизировать (минимизировать, например) iXi ^ 2 (модель сферы) в заданном диапазоне, скажем, [-100,100]. Мы знаем, что минимальное значение равно 0. Посмотрим, как работает DE.
DE - алгоритм, основанный на населении. И для каждого человека в популяции будет определенное количество хромосом (представьте, что это набор людей и хромосом или генов в каждой из них). Позвольте мне объяснить DE W выше функции
Нам нужно исправить размер популяции и количество хромосом или генов (названных в качестве параметров). Например, давайте рассмотрим популяцию размером 4, и у каждого человека есть 3 хромосомы (или гены или параметры). Давайте назовем людей R1,R2,R3,R4.
Шаг 1: Инициализация населения
Нам нужно случайным образом инициализировать население в диапазоне [-100,100]
G1 G2 G3 objective fn value
R1 -> |-90 | 2 | 1 | =>8105
R2 -> | 7 | 9 | -50 | =>2630
R3 -> | 4 | 2 | -9.2| =>104.64
R4 -> | 8.5 | 7 | 9 | =>202.25
Значение целевой функции рассчитывается с использованием заданной целевой функции. В данном случае это iXi ^ 2. Таким образом, для R1 значение obj fn будет равно -90 ^ 2 + 2 ^ 2 + 2 ^ 2 = 8105. Точно так же это найдено для всех.
Шаг 2: Мутация
Зафиксируйте целевой вектор, например, например, для R1, а затем случайным образом выберите три других вектора (индивида), например, для R2, R3, R4, и выполните мутацию. Мутация делается следующим образом,
MutantVector = R2 + F(R3-R4)
(векторы могут быть выбраны случайным образом, не обязательно в любом порядке).F (коэффициент масштабирования / константа мутации) в пределах диапазона [0,1] является одним из немногих контрольных параметров, которые имеет DE. Проще говоря, он описывает, насколько разным становится мутированный вектор. Давайте держать F =0,5.
| 7 | 9 | -50 |
+
0.5 *
| 4 | 2 | -9.2|
+
| 8.5 | 7 | 9 |
Теперь выполнение мутации даст следующий вектор мутантов
MV = | 13.25 | 13.5 | -50.1 | =>2867.82
Шаг 3: Кроссовер
Теперь, когда у нас есть целевой вектор (R1) и мутантный вектор MV, сформированный из R2, R3 и R4, нам нужно сделать кроссовер. Рассмотрим R1 и MV как двух родителей, и нам нужен ребенок от этих двух родителей. Кроссовер делается, чтобы определить, сколько информации нужно взять от обоих родителей. Контролируется скоростью кроссовера (CR). Каждый ген / хромосома ребенка определяется следующим образом:
генерируется случайное число между 0 и 1, если оно больше CR, то наследовать ген от цели (R1), а от мутанта (MV).
Давайте установим CR = 0,9. Поскольку у нас есть 3 хромосомы для отдельных лиц, нам нужно сгенерировать 3 случайных числа от 0 до 1. Скажем, например, что эти числа равны 0,21,0,97,0,8 соответственно. Первое и последнее меньше значения CR, поэтому эти позиции в дочернем векторе будут заполнены значениями из MV, а вторая позиция будет заполнена геном, взятым из цели (R1).
мишени> |-90 | 2 | 1 |
мутант> | 13.25 | 13.5 | -50.1 |
random num - 0.21, => `Child -> |13.25| -- | -- |`
random num - 0.97, => `Child -> |13.25| 2 | -- |`
random num - 0.80, => `Child -> |13.25| 2 | -50.1 |`
Trial vector/child vector -> | 13.25 | 2 | -50.1 | =>2689.57
Шаг 4: Выбор
Теперь у нас есть ребенок и цель. Сравните obj fn обоих, посмотрите, что меньше (проблема минимизации). Выберите этого человека из двух для следующего поколения
R1 -> |-90 | 2 | 1 | =>8105
Trial vector/child vector -> | 13.25 | 2 | -50.1 | =>2689.57
Очевидно, что ребенок лучше, поэтому замените цель (R1) на ребенка. Таким образом, новое население станет
G1 G2 G3 objective fn value
R1 -> | 13.25 | 2 | -50.1 | =>2689.57
R2 -> | 7 | 9 | -50 | =>2500
R3 -> | 4 | 2 | -9.2 | =>104.64
R4 -> | -8.5 | 7 | 9 | =>202.25
Эта процедура будет продолжаться либо до тех пор, пока не достигнет желаемого числа поколений, либо пока мы не получим желаемое значение. Надеюсь, это поможет вам.