Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Programación cuadrática con restricciones enlazadas: basada en problemas

En este ejemplo se muestra cómo formular y resolver un problema escalable enlazado-restringido con una función de objetivo cuadrático. El ejemplo muestra el comportamiento de la solución mediante 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 el solucionador de este ejemplo, vea.Minimización cuadrática con restricciones enlazadas

La función objetiva, en función del número de variables problemáticas, esn

<math display="block">
<mrow>
<mn>2</mn>
<munderover>
<mrow>
<mo></mo>
</mrow>
<mrow>
<mi>i</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mrow>
<mi>n</mi>
</mrow>
</munderover>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mi>i</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<mo>-</mo>
<mn>2</mn>
<munderover>
<mrow>
<mo></mo>
</mrow>
<mrow>
<mi>i</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mrow>
<mi>n</mi>
<mo>-</mo>
<mn>1</mn>
</mrow>
</munderover>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mi>i</mi>
</mrow>
</msub>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mi>i</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
</msub>
<mo>-</mo>
<mn>2</mn>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<mo>-</mo>
<mn>2</mn>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mi>n</mi>
</mrow>
</msub>
<mo>.</mo>
</mrow>
</math>

Crear problema

Cree una variable de problema denominada que tenga 400 componentes.x Además, cree una expresión denominada para la función objetiva.objec Enlaza cada variable por debajo 0 y por encima de 0,9, excepto permitir

<math display="inline">
<mrow>
<msub>
<mrow>
<mi mathvariant="italic">x</mi>
</mrow>
<mrow>
<mi mathvariant="italic">n</mi>
</mrow>
</msub>
</mrow>
</math>
para ser ilimitado.

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 denominado.qprob Incluya la función objetiva en el problema.

qprob = optimproblem('Objective',objec);

Cree opciones que especifiquen el algoritmo y que no se muestren.quadprog'trust-region-reflective' 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 problema y examinar solución

Resuelve el problema.

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

Trace la solución.

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

Informe de la marca de salida, el número de iteraciones y el número de iteraciones de degradado conjugada.

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

Hubo muchas iteraciones de gradiente conjugada.

Ajuste las opciones para aumentar la eficiencia

Reduzca el número de iteraciones de degradado conjugada estableciendo la opción.SubproblemAlgorithm'factorization' Esta opción hace que el solucionador utilice una técnica de solución interna más costosa que elimina los pasos de degradado conjugada, 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 degradado conjugada disminuyó.

Compare Solutions con Solution'interior-point'

Compare estas soluciones con las obtenidas con el algoritmo predeterminado.'interior-point' El algoritmo no utiliza un punto inicial, por lo que no se pasa a.'interior-point'x00solve

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.896121, 0.898801, 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.002029. 
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.036007. 
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