Может кто-нибудь объяснить метод дифференциальной эволюции? Определение Wikipedia является чрезвычайно техническим.
Понятно, что может быть оценено необузданное объяснение, за которым следует простой пример:)
Может кто-нибудь объяснить метод дифференциальной эволюции? Определение Wikipedia является чрезвычайно техническим.
Понятно, что может быть оценено необузданное объяснение, за которым следует простой пример:)
Здесь упрощенное описание. DE - это метод оптимизации, который итеративно изменяет совокупность кандидатов-кандидатов, чтобы свести его к оптимальной функции.
Сначала вы произвольно инициализируете свои кандидаты. Затем на каждой итерации и для каждого решения кандидата x вы делаете следующее:
(Заметим, что приведенный выше алгоритм очень упрощен, не комментируйте его, найдите нужную спецификацию в другом месте)
К сожалению, в статье в Википедии нет иллюстраций. Это легче понять с помощью графического представления, вы найдете некоторые из этих слайдов: http://www-personal.une.edu.au/~jvanderw/DE_1.pdf.
Он похож на генетический алгоритм (GA), за исключением того, что кандидатные решения не рассматриваются как двоичные строки (хромосома), но (как правило) как реальные векторы. Одним из ключевых аспектов DE является то, что размер шага мутации (см. Шаг 1 для мутации) является динамическим, то есть он адаптируется к конфигурации вашей популяции и будет стремиться к нулю, когда он сходится. Это делает DE менее уязвимым для генетического дрейфа, чем GA.
Отвечая на мой собственный вопрос...
NP
кандидатов.Xi
= родительский кандидат в индексе i
(индексы варьируются от 0
до NP-1
) от текущего поколения. Также известен как целевой вектор.D
.Xi(j)
= j -й параметр в кандидате Xi
.Xa
, Xb
, Xc
= три случайных родительских кандидата.(Xb - Xa)
F
= Вес, определяющий скорость эволюции популяции.
CR
= Вероятность кроссовера.
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
не изменяется.Работа алгоритма DE очень проста. Рассмотрим, что вам нужно оптимизировать (минимизировать, например, ΣXi ^ 2 (сфера) в пределах заданного диапазона, например [- 100,100]. Мы знаем, что минимальное значение равно 0. Посмотрим, как работает DE.
DE - алгоритм, основанный на популяции. И для каждого человека в популяции будет фиксированное количество хромосом (представьте, что это как набор людей и хромосом или генов в каждом из них). Позвольте мне объяснить DE w.r.t выше функции
Нам нужно зафиксировать размер популяции и количество хромосом или генов (называемых параметрами). Например, рассмотрим популяцию размером 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
целевое значение функции вычисляется с использованием заданной целевой функции. В этом случае она ΣXi ^ 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).
Target- > |-90 | 2 | 1 |
Mutant- > | 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
Эта процедура будет продолжена либо до тех пор, пока не достигнет желаемого количества поколений, или пока мы не получим желаемое значение. Надеюсь, это поможет вам.