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

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

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

В качестве примера предположим, что ваши нелинейные ограничения для трехмерной задачи

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 вычисляет решение намного быстрее и точнее.

Похожие темы