surrogateopt
В этом примере показано, как исправить значения некоторых переменных управления, удалив их из оптимизации. Хотя самый легкий способ исправить значения - задать равные верхние и нижние границы, некоторые решатели не допускают одинаковых границ. Однако surrogateopt
хорошо обрабатывает равные ограничения путем внутреннего удаления фиксированных переменных из задачи перед попыткой оптимизации.
The multirosenbrock
функция принимает любое четное количество переменных управления. Его минимальное значение 0 достигается в точке [1,1,...,1,1]
. Установите нижние границы -1 и верхние границы 5 для десяти переменных, а затем установите первые шесть верхние и нижние границы равными 1. Этот параметр удаляет шесть переменных из задачи, оставляя задачу с четырьмя переменными.
lb = -1*ones(1,10); ub = 5*ones(1,10); lb(1:6) = 1; ub(1:6) = 1;
Решите проблему.
fun = @multirosenbrock; rng default % For reproducibility [x,fval,exitflag] = surrogateopt(fun,lb,ub)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x = 1×10
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.4334 0.1786 0.7177 0.5263
fval = 0.4218
exitflag = 0
Решатель возвращает точку, близкую к глобальному минимуму. Заметьте, что решатель принимает 500 вычислений функции, что является значением по умолчанию для задачи с 10 переменными. Решатель не изменяет это значение по умолчанию, даже когда вы исправляете некоторые переменные.
Когда вы не фиксируете никаких переменных, решатель не достигает точки около глобального минимума.
lb = -1*ones(1,10); ub = 5*ones(1,10); rng default % For reproducibility [x,fval,exitflag] = surrogateopt(fun,lb,ub)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x = 1×10
1.3840 1.9253 1.1837 1.4091 0.9075 0.8123 1.3796 1.8995 1.4982 2.2355
fval = 0.6209
exitflag = 0