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