首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中使用CVXR解决优化问题,使用几个约束

在R中使用CVXR解决优化问题,使用几个约束
EN

Stack Overflow用户
提问于 2021-01-06 18:22:38
回答 1查看 138关注 0票数 1

我正在尝试用R中的CVXR解决一个混合整数问题,下面的代码用来解决这个问题:

代码语言:javascript
复制
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)

这会产生以下错误:

代码语言:javascript
复制
Error in construct_intermediate_chain(object, candidate_solvers, gp = gp) : 
  Problem does not follow DCP rules.

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

代码语言:javascript
复制
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

它可以工作,但这些不是我想要的约束。

有人知道怎么解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2021-01-07 00:12:15

我们可以通过引入一个布尔矩阵y来解决这个问题,如果diff(beta)上的i,第j个不等式大于1,则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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65593983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档