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

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

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

2i=1nxi2-2i=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' по умолчанию алгоритм. The '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.

Похожие темы