Многие функции панели инструментов глобальной оптимизации принимают ограничения, линейные ограничения или нелинейные ограничения. Сведения о том, как включить эти ограничения в проблему, см. в разделе Ограничения записи. Попробуйте ознакомиться со следующими соответствующими ссылками на разделы:
Примечание
surrogateopt решатель использует другой синтаксис для нелинейных ограничений, чем другие решатели, и требует конечных границ для всех компонентов. Дополнительные сведения см. на странице ссылки на функцию и в разделах «Преобразование нелинейных ограничений между формой суррогатеопта и другими формами решателя».
Важнее установить границы для глобальных решателей, чем для локальных решателей. Глобальные решатели используют границы различными способами:
GlobalSearch требует границ для генерации точки поиска рассеяния. Если границы не указаны, GlobalSearch ограничивает каждый компонент ниже по -9999 и выше 10001. Однако эти границы легко могут быть неуместными.
Если не указаны границы и не указаны пользовательские начальные точки, MultiStart ограничивает каждый компонент ниже по -1000 и выше 1000. Однако эти границы легко могут быть неуместными.
ga использует границы и линейные ограничения для первоначального формирования совокупности. Для неограниченных проблем, ga использует значение по умолчанию 0 в качестве нижней границы и 1 в качестве верхней границы для каждого размера для создания начальной точки. Для ограниченных задач и проблем с линейными ограничениями: ga использует границы и ограничения для создания исходной совокупности.
simulannealbnd и patternsearch не требуют границ, хотя могут использовать границы.
ga решатель обычно поддерживает строгую выполнимость в отношении границ и линейных ограничений. Это означает, что на каждой итерации все члены совокупности удовлетворяют границам и линейным ограничениям.
Однако можно задать параметры, которые приводят к сбою этой возможности. Например, если задать MutationFcn кому @mutationgaussian или @mutationuniform, функция мутации не уважает ограничения, и ваша популяция может стать неосуществимой. Аналогично, некоторые функции кроссовера могут вызывать неосуществимые популяции, хотя по умолчанию gacreationlinearfeasible уважает границы и линейные ограничения. Также, ga может иметь неосуществимые точки при использовании пользовательских мутаций или перекрестных функций.
Для обеспечения выполнимости используйте функции кроссовера и мутации по умолчанию для ga. Будьте особенно осторожны, чтобы любые пользовательские функции сохраняли выполнимость в отношении границ и линейных ограничений.
ga не применяет линейные ограничения при наличии целочисленных ограничений. Вместо этого ga включает нарушения линейных ограничений в функцию штрафа. См. раздел Алгоритм целочисленной ga.
Если вы используете GlobalSearch или MultiStart с fmincon, нелинейные функции ограничения могут возвращать производные (градиент или гессен). Дополнительные сведения см. в разделе Градиенты и гессенцы.
ga и patternsearch решатели дополнительно вычисляют функции нелинейных ограничений набора векторов в одном вызове функции. Этот метод может занять меньше времени, чем вычисление целевых функций векторов последовательно. Этот метод называется вызовом векторизованной функции.
Чтобы решатель вычислялся векторизированным образом, необходимо векторизировать как целевую (фитнес) функцию, так и нелинейную функцию ограничения. Дополнительные сведения см. в разделе Векторизация функций цели и ограничения.
В качестве примера предположим, что нелинейными ограничениями для трехмерной задачи являются
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 намного быстрее и точнее вычисляет решение.