По вашему опыту, какой оператор кроссовера лучше всего подходит для задачи назначения весов. В частности, я сталкиваюсь с ограничением, которое заставляет быть 1 суммой всех весов. В настоящее время я использую оператор юниформ-кроссовера, а затем делю все параметры на сумму, чтобы получить 1. Кроссовер работает, но я не уверен, что таким образом смогу сохранить хорошую часть своего решения и перейти к сходимости к лучшее решение. Есть ли у вас предложения? Нет проблем, если мне нужно создать собственный оператор.
Генетический алгоритм — лучший оператор кроссовера для назначения весов
Ответы (1)
Если ваша исходная популяция состоит из подходящих особей, вы можете попробовать дифференциальную эволюцию. -подобный подход.
Оператору рекомбинации нужны три (случайных) вектора, и он добавляет взвешенную разницу между двумя векторами популяции к третьему вектору:
offspring = A + f (B - C)
Вы можете попробовать фиксированный весовой коэффициент f
в [0,6; 2.0] или экспериментировать, выбирая f
случайным образом для каждого поколения или для каждого разностного вектора (метод, называемый dither, который должен значительно улучшить поведение сходимости, особенно для зашумленных целевых функций).
Это должно работать достаточно хорошо, так как потомство будет автоматически возможным.
Следует проявлять особую осторожность, чтобы избежать преждевременной конвергенции (например, какой-либо алгоритм ниширования).
РЕДАКТИРОВАТЬ
При равномерном пересечении вы исследуете все n-мерное пространство, в то время как приведенная выше рекомбинация ограничивает индивидуумов подпространством H
(гиперплоскостью i wi = 1, где wi — веса) исходного пространства поиска.
Читая вопрос, я предположил, что сумма весов была единственным ограничением. Поскольку существуют другие ограничения, неправда, что потомство возможно автоматически.
В любом случае любое возможное решение должно быть на H
:
Если A = (a1, a2, ... an), B = (b1 , ... bn), C = (c1, ... cn):
- я aя = 1
- i bi = 1
- i ci = 1
so
i (ai + f (bi - ci)) = i > ai + f (i bi - i ci) = 1 + f (1 - 1) = 1
Потомок находится на гиперплоскости H
.
Теперь, в зависимости от количества/типа дополнительных ограничений, вы можете изменить предложенный оператор рекомбинации или попробовать что-то на основе штрафной функции.
РЕДАКТИРОВАТЬ2
Вы могли бы аналитически определить «действительный» диапазон f
, но, вероятно, достаточно что-то вроде этого:
f = random(0.6, 2.0);
double trial[] = {f, f/2, f/4, -f, -f/2, -f/4, 0};
i = 0;
do
{
offspring = A + trial[i] * (B - C);
i = i + 1;
} while (unfeasible(offspring));
return offspring;
Это просто идея, я не уверен, как это работает.