Цель и ограничения, имеющие общую функцию в последовательном или параллельном, основанном на проблеме

В этом примере показано, как постараться не вызывать функцию дважды, когда она вычисляет значения и для цели и для ограничений с помощью подхода, основанного на проблеме. Для основанного на решателе подхода смотрите Объективные и Нелинейные Ограничения в Той же Функции.

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

Этот пример также показывает эффект параллельного расчета на скорости решателя. Для длительных функций, вычисляя параллельно может ускорить решатель, как может, избегая вызывания длительной функции неоднократно в той же точке. Используя оба метода вместе ускоряет решатель больше всего.

Создайте длительную функцию, которая вычисляет несколько количеств

computeall функция возвращает выходные параметры, которые являются частью объективных и нелинейных ограничений.

type computeall
function [f1,c1] = computeall(x)
    c1 = norm(x)^2 - 1;
    f1 = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
    pause(1) % simulate expensive computation
end

Функция включает pause(1) оператор, чтобы симулировать длительную функцию.

Создайте переменные оптимизации

Эта проблема использует четырехэлементную переменную оптимизации.

x = optimvar('x',4);

Преобразуйте функцию Используя 'ReuseEvaluation'

Преобразуйте computeall функционируйте к выражению оптимизации. Чтобы сэкономить время во время оптимизации, используйте 'ReuseEvaluation' пара "имя-значение". Чтобы сэкономить время для решателя, чтобы определить размеры выходного выражения (это происходит только однажды), устанавливает 'OutputSize' пара "имя-значение" к [1 1], указание на это оба f и c scalar.

[f,c] = fcn2optimexpr(@computeall,x,'ReuseEvaluation',true,'OutputSize',[1 1]);

Создайте цель, ограничение и проблему

Создайте целевую функцию от f выражение.

obj = f + 20*(x(3) - x(4)^2)^2 + 5*(1 - x(4))^2;

Создайте нелинейное ограничение неравенства из c выражение.

cons = c <= 0;

Создайте задачу оптимизации и включайте цель и ограничение.

prob = optimproblem('Objective',obj);
prob.Constraints.cons = cons;
show(prob)
  OptimizationProblem : 

	Solve for:
       x

	minimize :
       ((arg3 + (20 .* (x(3) - x(4).^2).^2)) + (5 .* (1 - x(4)).^2))

       where:

         [arg3,~] = computeall(x);


	subject to cons:
       arg_LHS <= 0

       where:

         [~,arg_LHS] = computeall(x);
     

Решите задачу

Контролируйте время, которое требуется, чтобы решить задачу, начинающую с начальной точки x0.x = [-1;1;1;2].

x0.x = [-1;1;1;2];
x0.x = x0.x/norm(x0.x); % Feasible initial point
tic
[sol,fval,exitflag,output] = solve(prob,x0)
Solving problem using fmincon.

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>
sol = struct with fields:
    x: [4×1 double]

fval = 0.7107
exitflag = 
    OptimalSolution

output = struct with fields:
         iterations: 25
          funcCount: 149
    constrviolation: 0
           stepsize: 1.2914e-07
          algorithm: 'interior-point'
      firstorderopt: 4.0000e-07
       cgiterations: 7
            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, 2.909695e-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.↵↵'
             solver: 'fmincon'

time1 = toc
time1 = 149.9299

Номер секунд для решения только по количеству функциональных оценок, которое указывает, что решатель вычислил каждую оценку только однажды.

fprintf("The number of seconds to solve was %g, and the number of evaluation points was %g.\n",time1,output.funcCount)
The number of seconds to solve was 149.93, and the number of evaluation points was 149.

Если, вместо этого, вы не вызываете fcn2optimexpr использование 'ReuseEvaluation', затем время решения удваивается.

[f2,c2] = fcn2optimexpr(@computeall,x,'ReuseEvaluation',false);
obj2 = f2 + 20*(x(3) - x(4)^2)^2 + 5*(1 - x(4))^2;
cons2 = c2 <= 0;
prob2 = optimproblem('Objective',obj2);
prob2.Constraints.cons2 = cons2;
tic
[sol2,fval2,exitflag2,output2] = solve(prob2,x0);
Solving problem using fmincon.

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>
time2 = toc
time2 = 298.4493

Параллельная обработка

Если у вас есть лицензия Parallel Computing Toolbox™, можно сэкономить еще больше времени путем вычисления параллельно. Для этого установите опции использовать параллельную обработку и вызывать solve с опциями.

options = optimoptions(prob,'UseParallel',true);
tic
[sol3,fval3,exitflag3,output3] = solve(prob,x0,'Options',options);
Solving problem using fmincon.

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>
time3 = toc
time3 = 74.7043

Используя параллельную обработку и 'ReuseEvaluation' вместе предоставляет более быстрое решение, чем использование 'ReuseEvaluation' один. Смотрите, сколько времени это берет, чтобы решить задачу с помощью одной только параллельной обработки.

tic
[sol4,fval4,exitflag4,output4] = solve(prob2,x0,'Options',options);
Solving problem using fmincon.

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>
time4 = toc
time4 = 145.5278

Сводные данные синхронизации результатов

Объедините результаты синхронизации в одну таблицу.

timingtable = table([time1;time2;time3;time4],...
    'RowNames',["Reuse Serial";"No Reuse Serial";"Reuse Parallel";"No Reuse Parallel"])
timingtable=4×1 table
                          Var1 
                         ______

    Reuse Serial         149.93
    No Reuse Serial      298.45
    Reuse Parallel       74.704
    No Reuse Parallel    145.53

Для этой проблемы, на компьютере с 6 основными процессорами, вычисляющими в параллельных взятиях приблизительно половина времени вычисления в последовательном, и вычисления с 'ReuseEvaluation' берет приблизительно половину времени вычисления без 'ReuseEvaluation'. Вычисление параллельно с 'ReuseEvaluation' берет приблизительно четверть времени вычисления в сериале без 'ReuseEvaluation'.

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

Похожие темы