0

我正在尝试使用 MOSEK 求解器解决 CVXR 中的以下优化问题。 Objective_Fn 输入矩阵是 data_C2 (50 X 30),clust_center_C2 是一个列矩阵 (50 X 1)。S_C2 是我试图最小化的矩阵 (50 X 50)。这是我的 R 代码

library(CVXR)
N <- ncol(data_C2)
predictors <- nrow(data_C2)
ones <- matrix(1, nrow = predictors, ncol = 1)
lambda <- 20

#==================================================================#
# Optimization variable
S_C2 <- Variable(rows = predictors, cols = predictors) 
X_C2 <- data_C2

# Constraint
constr_C2 <- list(norm1(S_C2 %*% ones) <= lambda_req, S_C2[,] >= 0, S_C2[,] <= 1)

# Objective Function
objective_C2 <- 0
for (i in 1:N) {
  objective_C2 <- objective_C2 + 
    square(norm2(clust_center_C2 - S_C2 %*% X_C2[,i]))
}

# CVXR
prob_C2 <- Problem(Minimize(objective_C2), constr_C2)
CVXR_result_C2 <- solve(prob_C2, solver = "MOSEK",  verbose = TRUE)

# solution status by solver
CVXR_result_C2$status  

# optimal value of beta
cvxrBeta_C2 <- CVXR_result_C2$getValue(S_C2)  

min(cvxrBeta_C2)
max(cvxrBeta_C2)

在 R 控制台中获得的输出

> CVXR_result_C2$status
[1] "optimal"
> min(cvxrBeta_C2)
[1] -2.11832e-09
> max(cvxrBeta_C2)
[1] 0.4402582

尽管求解器说答案是最优的,但当约束说它必须位于零和一之间时,下限是负数。谁能告诉代码有什么问题?

4

0 回答 0