exponenta event banner

Квадратичное программирование со связанными ограничениями: на основе проблем

В этом примере показано, как сформулировать и решить масштабируемую ограниченную зависимостью задачу с помощью квадратичной целевой функции. В примере показано поведение решения с использованием нескольких алгоритмов. Проблема может иметь любое количество переменных; число переменных - это масштаб. Версию этого примера на основе решателя см. в разделе Квадратичная минимизация со связанными ограничениями.

Целевая функция, как функция от числа переменных задачи n, является

2∑i=1nxi2-2∑i=1n-1xixi+1-2x1-2xn.

Создать проблему

Создание переменной проблемы с именем x имеет 400 компонентов. Также создайте выражение с именем objec для целевой функции. Привязать каждую переменную ниже на 0 и выше на 0,9, за исключением того, что разрешить xn быть неограниченным.

n = 400;
x = optimvar('x',n,'LowerBound',0,'UpperBound',0.9);
x(n).LowerBound = -Inf;
x(n).UpperBound = Inf;
prevtime = 1:n-1;
nexttime = 2:n;
objec = 2*sum(x.^2) - 2*sum(x(nexttime).*x(prevtime)) - 2*x(1) - 2*x(end);

Создание задачи оптимизации с именем qprob. Включите в задачу целевую функцию.

qprob = optimproblem('Objective',objec);

Создать параметры, определяющие quadprog 'trust-region-reflective' алгоритм и отсутствие дисплея. Создайте начальную точку, приблизительно центрированную между границами.

opts = optimoptions('quadprog','Algorithm','trust-region-reflective','Display','off');
x0 = 0.5*ones(n,1);
x00 = struct('x',x0);

Решение проблемы и анализ решения

Решите проблему.

[sol,qfval,qexitflag,qoutput] = solve(qprob,x00,'options',opts);

Постройте график решения.

plot(sol.x,'b-')
xlabel('Index')
ylabel('x(index)')

Figure contains an axes. The axes contains an object of type line.

Сообщите флаг выхода, число итераций и число сопряженных итераций градиента.

fprintf('Exit flag = %d, iterations = %d, cg iterations = %d\n',...
    double(qexitflag),qoutput.iterations,qoutput.cgiterations)
Exit flag = 3, iterations = 19, cg iterations = 1636

Было много сопряженных градиентных итераций.

Настройка параметров повышения эффективности

Уменьшите число итераций сопряженного градиента, установив значение SubproblemAlgorithm опция для 'factorization'. Эта опция заставляет решатель использовать более дорогой метод внутреннего решения, который исключает сопряженные шаги градиента, для чистой общей экономии времени в этом случае.

opts.SubproblemAlgorithm = 'factorization';
[sol2,qfval2,qexitflag2,qoutput2] = solve(qprob,x00,'options',opts);
fprintf('Exit flag = %d, iterations = %d, cg iterations = %d\n',...
    double(qexitflag2),qoutput2.iterations,qoutput2.cgiterations)
Exit flag = 3, iterations = 10, cg iterations = 0

Количество итераций и итераций сопряженного градиента уменьшилось.

Сравнение решений с 'interior-point' Решение

Сравнение этих решений с решениями, полученными по умолчанию 'interior-point' алгоритм. 'interior-point' алгоритм не использует начальную точку, поэтому не проходите x00 кому solve.

opts = optimoptions('quadprog','Algorithm','interior-point-convex','Display','off');
[sol3,qfval3,qexitflag3,qoutput3] = solve(qprob,'options',opts);
fprintf('Exit flag = %d, iterations = %d, cg iterations = %d\n',...
    double(qexitflag3),qoutput3.iterations,0)
Exit flag = 1, iterations = 8, cg iterations = 0
middle = floor(n/2);
fprintf('The three solutions are slightly different.\nThe middle component is %f, %f, or %f.\n',...
    sol.x(middle),sol2.x(middle),sol3.x(middle))
The three solutions are slightly different.
The middle component is 0.896278, 0.898676, or 0.857389.
fprintf('The relative norm of sol - sol2 is %f.\n',norm(sol.x-sol2.x)/norm(sol.x))
The relative norm of sol - sol2 is 0.001997.
fprintf('The relative norm of sol2 - sol3 is %f.\n',norm(sol2.x-sol3.x)/norm(sol2.x))
The relative norm of sol2 - sol3 is 0.035894.
fprintf(['The three objective function values are %f, %f, and %f.\n' ...
    'The ''interior-point'' algorithm is slightly less accurate.'],qfval,qfval2,qfval3)
The three objective function values are -1.985000, -1.985000, and -1.984963.
The 'interior-point' algorithm is slightly less accurate.

Связанные темы