es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MISDP/MISOCP en cvxpy.

Estoy tratando de resolver el siguiente problema en CVXPY.

El problema es un SDP entero mixto debido a la matriz PSD que estamos resolviendo. Sin embargo, según esta lista parece que ninguno de los solucionadores puede manejar dicho problema.

¿Podemos usar el hecho de que A es una matriz de 2×2 para convertir esto de alguna manera en un problema SOCP entero mixto?

import cvxpy as cp
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(271828) 
m = 2; n = 50
x = np.random.randn(m,n)

off = cp.Variable(boolean=True)

A = cp.Variable((2,2), PSD=True)
b = cp.Variable(2)
obj = cp.Maximize(cp.log_det(A))
constraints = [ cp.norm(A@x[:,i] + b) <= 1 + 20*off for i in range(n) ]
constraints += [cp.sum(off) <= 20]

prob = cp.Problem(obj, constraints)
optval = prob.solve(solver='XPRESS', verbose=False) # parece funcionar, aunque no es muy preciso

print(f"Valor óptimo: {optval}")

# graficar la elipse y los datos
angles = np.linspace(0, 2*np.pi, 200)
rhs = np.row_stack((np.cos(angles) - b.value[0], np.sin(angles) - b.value[1]))
ellipse = np.linalg.solve(A.value, rhs)

plt.scatter(x[0,:], x[1,:])
plt.plot(ellipse[0,:].T, ellipse[1,:].T)
plt.xlabel('Dimensión 1'); plt.ylabel('Dimensión 2')
plt.title('Elipsoide de Volumen Mínimo')
plt.show()
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema actualmente está formulado como un SDP entero-mixto, el cual ninguno de los solucionadores disponibles en CVXPY puede manejar. Sin embargo, dado que la matriz A tiene un tamaño de sólo 2×2, es posible convertir este problema en un problema SOCP entero-mixto.

    Un enfoque para hacer esto es usar la descomposición de complemento de Schur de la matriz PSD A. Específicamente, podemos escribir A en la forma:

    A = [ A11    a2 ]
        [ a2.T   a22 ]
    

    donde A11 es un escalar, a2 es un vector de columna de longitud 1 y a22 es una matriz 1×1. Dado que A es PSD, tenemos que a22 >= 0. Usando esta descomposición, podemos reescribir la restricción como:

    || A x_i + b ||^2 <= (1 + 20 * off)^2
    

    lo que se puede simplificar usando las propiedades del complemento de Schur como:

    a22 || x_i + (a2/a22) b ||^2 <= (1 + 20 * off)^2 - || A11 x_i + a2 b ||^2
    

    Así, hemos convertido la restricción PSD en una restricción cuadrática estándar. Esto puede ser utilizado para formular un problema SOCP entero-mixto, el cual puede ser potencialmente resuelto mediante uno de los solucionadores disponibles en CVXPY.

Comments are closed.