Много функций Global Optimization Toolbox принимают границы, линейные ограничения или нелинейные ограничения. Чтобы видеть, как включать эти ограничения в вашу проблему, смотрите Ограничения Записи (Optimization Toolbox). Попытайтесь консультироваться с этими подходящими ссылками на разделы:
Связанные ограничения (Optimization Toolbox)
Линейные ограничения (Optimization Toolbox)
Нелинейные ограничения (Optimization Toolbox)
Более важно установить границы для глобальных решателей, чем для локальных решателей. Глобальные решатели используют границы во множестве путей:
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
опционально вычисляют нелинейные ограничительные функции набора векторов в одном вызове функции. Этот метод может занять меньше времени, чем вычисление целевых функций векторов последовательно. Этот метод называется векторизованным вызовом функции.
Для решателя, чтобы вычислить векторизованным способом, необходимо векторизовать и цель (фитнес) функциональная и нелинейная ограничительная функция. Для получения дополнительной информации смотрите, Векторизуют Функции Цели и Ограничения.
Как пример, предположите, что ваши нелинейные ограничения для 3D проблемы
Следующий код дает эти нелинейные ограничения векторизованным способом, принимая, что строки вашей входной матрицы 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
вычисляет решение намного более быстро и точно.