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
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 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)')
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.