exponenta event banner

Ограничения записи

Обратитесь к документации по панели инструментов оптимизации

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

Примечание

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+x3225≤6x3≥cosh (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 намного быстрее и точнее вычисляет решение.

Связанные темы