Запишите ограничения

Консультируйтесь с документацией Optimization Toolbox

Много функций Global Optimization Toolbox принимают границы, линейные ограничения или нелинейные ограничения. Чтобы видеть, как включать эти ограничения в вашу проблему, смотрите Ограничения Записи. Попытайтесь консультироваться с этими подходящими ссылками на разделы:

Примечание

surrogateopt решатель использует различный синтаксис для нелинейных ограничений, чем другие решатели и требует конечных границ на всех компонентах. Для получения дополнительной информации смотрите страницу ссылки на функцию и Преобразуйте Нелинейные Ограничения Между Формой surrogateopt и Другими Формами Решателя.

Установите границы

Более важно установить границы для глобальных решателей, чем для локальных решателей. Глобальные решатели используют границы во множестве путей:

  • GlobalSearch требует границ для его поисковой рассеянием генерации точки. Если вы не обеспечиваете границы, GlobalSearch границы каждый компонент ниже -9999 и выше 10001. Однако эти границы могут легко быть несоответствующими.

  • Если вы не обеспечиваете границы и не обеспечиваете пользовательские стартовые точки, MultiStart границы каждый компонент ниже -1000 и выше 1000. Однако эти границы могут легко быть несоответствующими.

  • ga границы использования и линейные ограничения для его генерации начальной генеральной совокупности. Для неограниченных проблем, ga использует значение по умолчанию 0 как нижняя граница и 1 как верхняя граница для каждой размерности для начальной генерации точки. Для ограниченных задач и проблем с линейными ограничениями, ga использует границы и ограничения, чтобы сделать начальную генеральную совокупность.

  • simulannealbnd и patternsearch не требуйте границ, несмотря на то, что они могут использовать границы.

Гарантируйте, что ga Опции Обеспечивают Выполнимость

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

Однако можно установить опции, которые заставляют эту выполнимость перестать работать. Например, если вы устанавливаете MutationFcn к @mutationgaussian или @mutationuniform, функция мутации не уважает ограничения, и ваше население может стать неосуществимым. Точно так же некоторые перекрестные функции могут вызвать неосуществимые популяции, несмотря на то, что gacreationlinearfeasible по умолчанию действительно уважает границы и линейные ограничения. Кроме того, ga может иметь неосуществимые точки при использовании пользовательской мутации или перекрестно соединить функции.

Чтобы гарантировать выполнимость, используйте функции перекрестного соединения и мутации по умолчанию для ga. Будьте особенно осторожны, что любые пользовательские функции обеспечивают выполнимость относительно границ и линейных ограничений.

ga не осуществляет линейные ограничения, когда существуют целочисленные ограничения. Вместо этого ga включает линейные нарушения ограничений в функцию штрафа. Смотрите Целое число ga Алгоритм.

Градиенты и гессианы

Если вы используете GlobalSearch или MultiStart с fmincon, ваши нелинейные ограничительные функции могут возвратить производные (градиент или Гессиан). Для получения дополнительной информации смотрите Градиенты и Гессианы.

Векторизованные ограничения

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

Для решателя, чтобы вычислить векторизованным способом, необходимо векторизовать и цель (фитнес) функциональная и нелинейная ограничительная функция. Для получения дополнительной информации смотрите, Векторизуют Функции Цели и Ограничения.

Как пример, предположите, что ваши нелинейные ограничения для 3D проблемы

x124+x229+x32256x3cosh(x1+x2)x1x2x3=2.

Следующий код дает эти нелинейные ограничения векторизованным способом, принимая что строки вашей входной матрицы x ваше население или входные векторы:

function [c ceq] = nlinconst(x)

c(:,1) = x(:,1).^2/4 + x(:,2).^2/9 + x(:,3).^2/25 - 6;
c(:,2) = cosh(x(:,1) + x(:,2)) - x(:,3);
ceq = x(:,1).*x(:,2).*x(:,3) - 2;

Например, минимизируйте векторизованную квадратичную функцию

function y = vfun(x)
y = -x(:,1).^2 - x(:,2).^2 - x(:,3).^2;

по области с ограничениями nlinconst использование patternsearch:

options = optimoptions('patternsearch','UseCompletePoll',true,'UseVectorized',true);
[x fval] = patternsearch(@vfun,[1,1,2],[],[],[],[],[],[],...
    @nlinconst,options)
Optimization terminated: mesh size less than options.MeshTolerance
 and constraint violation is less than options.ConstraintTolerance.

x =
    0.2191    0.7500   12.1712

fval =
 -148.7480

Используя ga:

options = optimoptions('ga','UseVectorized',true);
[x fval] = ga(@vfun,3,[],[],[],[],[],[],@nlinconst,options)
Optimization terminated: maximum number of generations exceeded.

x =
   -1.4098   -0.1216   11.6664

fval =
 -138.1066

Для этой проблемы patternsearch вычисляет решение намного более быстро и точно.

Похожие темы