MISDP/MISOCP ใน cvxpy

0

คำถาม

ฉันกำลังพยายามแก้ปัญหาเกิดข้อผิดพลาดต่อไปนี้ใน CVXPY.

ปัญหาคือผสมกันจำนวนเต็ม SDP เนื่องจาก PSDCOMMENT เมตริกซ์ว่างเราเป็นไปไม่ได้หรอก อย่างไรก็ตามตาม รายการนี้ มันดูเหมือนกับว่าไม่มีของ solvers สามารถรับมือช่างเป็นปัญหาแล้ว

เราสามารถใช้ความจริงที่ว่า A เป็น 2x2 เมตริกซ์ว่างที่ยังไงแปลงนี้จะเป็นผสม-จำนวนเต็ม SOCP ปัญหาหรอ?

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) # seems to work, although it's not super accurate

print(f"Optimum value: {optval}")

# plot the ellipse and data
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('Dimension 1'); plt.ylabel('Dimension 2')
plt.title('Minimum Volume Ellipsoid')
plt.show()
1

คำตอบที่ดีที่สุด

1

เอาเป็นว่า A=[[x,z], [z,y]]งั้นคุณสามารถขยายใหญ่สุด sqrt(det(A)) (ซึ่งเป็นค่าของคุณมุ่ง). โปรดสังเกตว่า

det(A) = xy-z^2

ดังนั้นขยายใหญ่สุด sqrt(det(A)) มันก็เหมือนกันขยายใหญ่สุด u เรื่องที่

xy - z^2 >= u^2

equivalently

xy >= z^2 + u^2

นี่คือ(เกือบ)เป็นหมุนสองคำสั่งโคนมองในแง่ของ https://docs.mosek.com/modeling-cookbook/cqo.html#rotated-quadratic-cones

ฉันคิดว่ามีบางอย่างอย่าง

x >= quad_over_lin([z,u], y)

(ยังไม่ได้ทดสอบไวยากรณ์)อาจเป็นที่สุดสะดวกที่จะแสดงมันอยู่ใน cvxpy.

โปรดจำไว้ว่านิยามของโคนและของ quad_over_lin ยัง imposes x,y>=0 ดังนั้นคุณไม่ต้องการมันต่างหากและ conic โดยอัตโนมัติโครงสรางรับประ PSDness ของ A.

2021-11-24 09:08:37

และนี่คือแสงสว่างความบันเทิงที่เกี่ยวข้องกับปัญหาของคุณ: twitter.com/mosektw/status/1190259248250445824
Michal Adamaszek

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................