You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CVXPY求解转化后的SDP问题时约束严重违反求助

问题修正与优化方案

约束错误排查与修正

你构造的扩展矩阵约束逻辑方向正确,但当前实现可能因数值精度或约束表述方式导致偏差。原问题中,0-1变量x满足x_i² = x_i,对应到扩展矩阵X=[[Y, x],[xᵀ,1]],等价于X[i,i] = X[i, n-1](i=0到n-2),同时X必须是秩1的半正定矩阵(PSD),且X[n-1,n-1]=1。

修正后的CVXPY代码

将约束直接表述为元素等式,避免构造Q矩阵,减少数值误差:

import cvxpy as cp
import numpy as np

n = 8
np.random.seed(1)

# 构造C矩阵(n阶,右下角为0)
C = np.zeros((n, n))
C[:n-1, :n-1] = np.random.randn(n-1, n-1)

# 定义变量:对称半正定矩阵
X = cp.Variable((n, n), PSD=True, symmetric=True)

constraints = []
# 约束X最后一个对角元为1
constraints.append(X[n-1, n-1] == 1)
# 约束x_i² = x_i → X[i,i] = X[i, n-1]
for i in range(n-1):
    constraints.append(X[i, i] == X[i, n-1])

# 原目标:Tr(C@X) = Tr(C[:n-1,:n-1] @ Y)
prob = cp.Problem(cp.Minimize(cp.trace(C @ X)), constraints)
prob.solve(solver=cp.MOSEK, verbose=True)

print("X is")
print(np.round(X.value, 4))
print("C is")
print(C)

核心问题:凸松弛的局限性

上述代码求解的是原组合优化问题的凸松弛版本,仅保证X是满足约束的PSD矩阵,但无法保证X的秩为1(原问题中X必须是秩1的外积矩阵)。因此,松弛解可能不对应任何0-1向量x,看起来约束被“违反”(实际是松弛解偏离了原问题的可行域)。

针对原问题的可行解法

因为n较小(n=8对应7个0-1变量),可以直接用整数规划建模,避免矩阵松弛:

import cvxpy as cp
import numpy as np

n = 8
np.random.seed(1)
C = np.random.randn(n-1, n-1)

# 直接定义0-1变量x
x = cp.Variable(n-1, boolean=True)
Y = cp.outer(x, x)

prob = cp.Problem(cp.Minimize(cp.trace(C @ Y)))
prob.solve(solver=cp.GUROBI)  # 需要安装GUROBI/CPLEX等支持整数规划的求解器

print("最优x:", x.value)
print("最优Y:", Y.value)

说明

  • 若必须使用矩阵形式求解原组合问题,需要在凸松弛的基础上加入分支定界或随机化(如随机舍入)方法,将松弛解转化为可行的0-1向量解。
  • 整数规划求解器(如GUROBI、CPLEX、SCIP)能直接处理0-1变量约束,对于小维度问题(n≤20)效率很高。

内容的提问来源于stack exchange,提问作者StandTall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:01:07