Преобразуйте нелинейные ограничения между surrogateopt Форма и другие формы решателя

Зачем преобразовывать формы ограничений?

Чтобы попробовать различные решатели, включая surrogateopt для задачи, которая имеет нелинейные ограничения неравенства, вы должны преобразовать между формой, необходимой surrogateopt и форму, требуемую другими решателями.

Преобразование из surrogateopt Структурная форма другим решателям

Целевая функция objconstr(x) для surrogateopt возвращает структуру. The Fval поле содержит значение целевой функции, скаляр. The Ineq поле содержит вектор значений ограничительных функций. Решатель пытается сделать все значения в Ineq поле меньше или равно нулю. Положительные значения указывают на нарушение ограничений.

Другие решатели ожидают, что целевая функция вернет скалярное значение, а не структуру. Другие решатели также ожидают, что нелинейная функция ограничения вернет два выхода, c(x) и ceq(x), а не структура, содержащая c(x).

Чтобы преобразовать surrogateopt функциональные objconstr(x) для использования в других решателях:

  • Установите целевую функцию на @(x)objconstr(x).Fval.

  • Установите нелинейную функцию ограничения равной @(x)deal(objconstr(x).Ineq,[]).

Для примера,

function ff = objconstr(x)
ff.Fval = norm(x)^2;
ff.Ineq = norm(x - [5,8])^2 - 25;
end

Чтобы решить ограниченную задачу минимизации с помощью objconstr, вызов surrogateopt.

lb = [-10,-20];
ub = [20,10];
sol = surrogateopt(@objconstr,lb,ub)
Surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.

sol =

    2.3325    3.7711

Чтобы решить ту же задачу, используя fmincon, разделите цель и ограничение на отдельные функции. Включите нелинейное ограничение равенства как [] при помощи deal функция.

objfcn = @(x)objconstr(x).Fval;
nlcon = @(x)deal(objconstr(x).Ineq,[]);

Звонить fmincon с целевой функцией objfcn и нелинейную функцию ограничения nlcon.

[solf,fvalf,eflag,output] = ...
    fmincon(objfcn,[0,0],[],[],[],[],lb,ub,nlcon)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

solf =

    2.3500    3.7600


fvalf =

   19.6602


eflag =

     1


output = 

  struct with fields:

         iterations: 7
          funcCount: 24
    constrviolation: 0
           stepsize: 2.0395e-05
          algorithm: 'interior-point'
      firstorderopt: 4.9651e-06
       cgiterations: 0
            message: '↵Local minimum found that satisfies the constraints.↵↵Optimization completed because the objective function is non-decreasing in ↵feasible directions, to within the value of the optimality tolerance,↵and constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The relative first-order optimality measure, 6.602486e-07,↵is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.↵↵'

Вы также можете использовать patternsearch или ga решить задачу используя то же преобразование.

Преобразуйте из других решателей в surrogateopt Структурная форма

Если у вас есть задача, написанная в форме для других решателей, используйте packfcn функция для преобразования целевых и нелинейных ограничений в форму структуры для surrogateopt. Если целевой функцией является указатель на функцию @obj и нелинейная функция ограничения @nlconst, затем используйте целевую функцию objconstr для surrogateopt.

objconstr = packfcn(@obj,@nlconst);

В этом примере целевой функцией является функция Розенбрка.

ros = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;

Задайте функцию ограничения, чтобы ограничить решение лежать внутри диска радиусом 1/3 с центром в точке [1/3,1/3].

function [c,ceq] = circlecon(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];

Установите границы -2 и 2 для каждого компонента.

lb = [-2,-2];
ub = [2,2];

Решите задачу используя patternsearch начиная с [0,0].

x0 = [0,0];
x = patternsearch(ros,x0,[],[],[],[],lb,ub,@circlecon)
Optimization terminated: mesh size less than options.MeshTolerance
 and constraint violation is less than options.ConstraintTolerance.

x =

    0.6523    0.4258

Преобразуйте задачу для решения путем surrogateopt.

objconstr = packfcn(ros,@circlecon);
xs = surrogateopt(objconstr,lb,ub)
Surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.

xs =

    0.6543    0.4284

См. также

|

Похожие темы