Работа алгоритма 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).
Цель-> |-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
Эта процедура будет продолжаться либо до тех пор, пока не достигнет желаемого числа поколений, либо пока мы не получим желаемое значение. Надеюсь, это поможет вам.