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()
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 escribirA
en la forma:donde
A11
es un escalar,a2
es un vector de columna de longitud 1 ya22
es una matriz 1×1. Dado queA
es PSD, tenemos quea22 >= 0
. Usando esta descomposición, podemos reescribir la restricción como:lo que se puede simplificar usando las propiedades del complemento de Schur como:
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.