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

Почему преобразуют ограничительные формы?

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

Преобразуйте от surrogateopt Форма структуры к другим решателям

Целевая функция objconstr(x) для surrogateopt возвращает структуру. Fval поле содержит значение целевой функции, скаляр. 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.3499    3.7601

Решать ту же задачу с помощью 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.6544    0.4266

Смотрите также

|

Похожие темы