在约束和二进制变量中使用函数进行约束优化

时间:2019-09-09 08:15:22

标签: r optimization

我正在寻找一种解决方法-在R中-一个形式受限的优化问题

min sum(x)

s.t. f(x) < k

其中x是长度为n的二进制变量(0或1),f(x)是取决于整个x变量的函数,而k是整数常量。因此,f(x)并不是对x的每个值(例如sqrt(x))的n个约束的集合,而是基于二进制变量x的整个值集合满足的约束。

我尝试使用具有以下语法的ompr R软件包

v < 1:10
result <- MILPModel() %>%
add_variable(x[i], i = 1:v, type = "binary") %>%
set_objective(sum_expr(x[i], i = 1:v), sense = "min") %>%
add_constraint(f(x) <= 60) %>%
solve_model(with_ROI(solver = "glpk"))

但是它不起作用,因为我认为该程序包不接受全局f(x)约束。

1 个答案:

答案 0 :(得分:0)

这是rgenoud软件包的解决方案。

library(rgenoud)

g <- function(x){
  c(
    ifelse(sd(x) > 0.2, 0, 1), # set the constraint (here sd(x)>0.2) in this way
    sum(x) # the objective function (to minimize/maximize)
  )
}

solution <- genoud(
  g, lexical = 2,
  nvars = 30, 
  starting.values = rep(0, 30), 
  Domains = cbind(rep(0,30), rep(1,30)),
  data.type.int = TRUE)

solution$par # the values of x
## [1] 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sd(solution$par) # is the constraint satisfied ?
## [1] 0.2537081
solution$value
## [1] 0 2 ; 0 is the value of ifelse(sd(x)>0.2,0,1) and 2 is the value of sum(x)

请参阅?genoud中的注释部分以了解lexical参数。