Объясните метод дифференциальной эволюции

Может кто-нибудь объяснить метод дифференциальной эволюции? Определение Wikipedia является чрезвычайно техническим.

Понятно, что может быть оценено необузданное объяснение, за которым следует простой пример:)

Ответы

Ответ 1

Здесь упрощенное описание. 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.

Ответ 2

Отвечая на мой собственный вопрос...

Обзор

  • Основное различие между генетическими алгоритмами и дифференциальной эволюцией (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);
  1. (шаг мутации) Добавить вектор с взвешенной разницей между двумя группами населения в третий член
    • Xc` = Xc + F * (Xb - Xa)
  2. (шаг кроссовера) Для каждой переменной в 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]
}
  1. (Шаг выбора) Если Xt превосходит Xi, то Xt заменяет Xi в следующем поколении. В противном случае Xi не изменяется.

Ресурсы

Ответ 3

Работа алгоритма 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

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