Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Programación cuadrática con restricciones de límite: basado en problemas

Este ejemplo muestra cómo formular y resolver un problema con límites de restricción escalable con una función objetivo cuadrática. El ejemplo muestra el comportamiento de la solución usando varios algoritmos. El problema puede tener cualquier número de variables. El número de variables es la escala. Para la versión basada en solvers de este ejemplo, consulte Quadratic Minimization with Bound Constraints.

La función objetivo, como una función del número de variables n del problema, es

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

Crear un problema

Cree una variable de problema llamada x que tenga 400 componentes. Además, cree una expresión llamada objec para la función objetivo. Limite cada variable por debajo de 0 y por encima de 0,9 y permita que xn sea desacotado.

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);

Cree un problema de optimización llamado qprob. Incluya la función objetivo en el problema.

qprob = optimproblem('Objective',objec);

Cree opciones que especifiquen el algoritmo quadprog'trust-region-reflective' y que no muestren visualización. Cree un punto inicial centrado aproximadamente entre los límites.

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

Resolver el problema y estudiar la solución

Resuelva el problema.

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

Represente la solución.

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

Figure contains an axes object. The axes object with xlabel Index, ylabel x(index) contains an object of type line.

Informe del indicador de salida, el número de iteraciones y el número de iteraciones de gradiente conjugado.

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

Había muchas iteraciones de gradiente conjugado.

Ajustar opciones para aumentar la eficiencia

Reduzca el número de iteraciones de gradiente conjugado estableciendo la opción SubproblemAlgorithm en 'factorization'. Esta opción provoca que el solver utilice una técnica de resolución interna más costosa que elimine los pasos de gradiente conjugado, para un ahorro global neto de tiempo en este caso.

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

El número de iteraciones y de iteraciones de gradiente conjugado ha disminuido.

Comparar soluciones con la solución de 'interior-point'

Compare estas soluciones con las que se han obtenido usando el algoritmo predeterminado 'interior-point'. El algoritmo 'interior-point' no usa un punto inicial, por lo que no pase x00 a 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.

Temas relacionados