【问题标题】:Solving optimization problem with CVXR in R, using several constraints使用多个约束在 R 中使用 CVXR 解决优化问题
【发布时间】:2021-01-06 10:22:37
【问题描述】:

我正在尝试用 R 中的 CVXR 解决混合整数问题。以下代码用于解决它:

n <- 6
beta <- Variable(n, n, integer = TRUE)
epsilon <- 0.1*10^-5
objective <- Minimize(1)
constraints <- list(beta >= 1,
                    beta <= 9,
                    abs(diff(beta)) >= epsilon,
                    abs(diff(t(beta))) >= epsilon)

prob <- Problem(objective, constraints)
CVXR_result <- solve(prob)

这会产生以下错误:

Error in construct_intermediate_chain(object, candidate_solvers, gp = gp) : 
  Problem does not follow DCP rules.

当我将代码更改为以下代码时:

n <- 6
beta <- Variable(n, n, integer = TRUE)
epsilon <- 0.1*10^-5
objective <- Minimize(1)
constraints <- list(beta >= 1,
                    beta <= 9,
                    abs(diff(beta)) <= epsilon,
                    abs(diff(t(beta))) <= epsilon)

prob <- Problem(objective, constraints)
CVXR_result <- solve(prob)

CVXR_result$status

CVXR_result$value
cvxrBeta <- CVXR_result$getValue(beta)
cvxrBeta

它有效,但这些不是我想要的约束。

有人知道怎么解决吗?

【问题讨论】:

    标签: r optimization constraints constraint-programming cvxr


    【解决方案1】:

    我们可以通过引入一个布尔矩阵y 来凸化这个问题,如果diff(beta) 上的第 i,j 个不等式大于,则 y[i,j] 为 1,否则为 0。同样,如果diff(t(beta)) 上的第 i,j 个不等式大于,则 yy[i,j] 为 1,否则为 0。因此,我们添加了 2*(n-1)*n 个布尔变量。还将 M 设置为 9,并为避免数值困难将 epsilon 设置为 0.1。更多信息请见:https://math.stackexchange.com/questions/37075/how-can-not-equals-be-expressed-as-an-inequality-for-a-linear-programming-model/1517850

    library(CVXR)
    
    n <- 6
    epsilon <- 0.1
    M <- 9
    
    beta <- Variable(n, n, integer = TRUE)
    y <- Variable(n-1, n, boolean = TRUE)
    yy <- Variable(n-1, n, boolean = TRUE)
    
    objective <- Minimize(1)
    constraints <- list(beta >= 1,
                        beta <= M,
                        diff(beta) <= -epsilon + 2*M*y,
                        diff(beta) >= epsilon - (1-y)*2*M,
                        diff(t(beta)) <= -epsilon + 2*M*yy,
                        diff(t(beta)) >= epsilon - (1-yy)*2*M)
    
    prob <- Problem(objective, constraints)
    CVXR_result <- solve(prob)
    
    CVXR_result$status
    ## [1] "optimal"
    
    CVXR_result$getValue(beta)
    ##      [,1] [,2] [,3] [,4] [,5] [,6]
    ## [1,]    1    9    1    9    8    7
    ## [2,]    9    8    7    6    9    4
    ## [3,]    3    2    1    9    8    2
    ## [4,]    7    6    2    1    7    6
    ## [5,]    3    5    3    2    8    5
    ## [6,]    5    1    4    3    6    9
    

    【讨论】:

      猜你喜欢
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      相关资源
      最近更新 更多