是否可以在Ompr优化中使用产品表达式作为约束条件?

是否可以在Ompr优化中使用产品表达式作为约束条件?,r,optimization,linear-programming,glpk,R,Optimization,Linear Programming,Glpk,我知道ompr包中的sum\u expr函数是一种使用动态求和创建约束的方法。但是,我想知道是否有一种方法可以创建一个使用乘积而不是求和的约束。或者这在线性优化中是不可能的 例如: library(dplyr) library(ROI) library(ROI.plugin.glpk) library(ompr) library(ompr.roi) n <- 20 score <- round(runif(n, 0, 25)) penalties <- round(runif

我知道
ompr
包中的
sum\u expr
函数是一种使用动态求和创建约束的方法。但是,我想知道是否有一种方法可以创建一个使用乘积而不是求和的约束。或者这在线性优化中是不可能的

例如:

library(dplyr)
library(ROI)
library(ROI.plugin.glpk)
library(ompr)
library(ompr.roi)

n <- 20
score <- round(runif(n, 0, 25))
penalties <- round(runif(n, 0, 25))

model <- MIPModel() %>%
  add_variable(x[i], i = 1:n, type = "binary") %>%
  set_objective(sum_expr(score[i] * x[i], i = 1:n), "max") %>%
  add_constraint(sum_expr(penalties[i] * x[i], i = 1:n) <= 100)

result <- solve_model(model, with_ROI(solver = "glpk", verbose = TRUE))
result$solution
库(dplyr)
图书馆(ROI)
库(ROI.plugin.glpk)
图书馆(ompr)
图书馆(ompr.roi)

n二进制变量的乘积可以线性化如下

假设我们想要建模

y = prod(i, x(i))
x(i), y ∈ {0,1}
我们可以把它写成一组线性不等式:

y ≤ x(i)   ∀i
y ≥ sum(i, x(i)) - card(i) + 1
x(i), y ∈ {0,1}
其中
卡(i)
是i的编号。通常情况下,事情可以进一步简化,但这取决于模型的细节


这可以直接在OMPR中实现,并且可以用任何线性MIP解算器求解

我设法找到了我原来问题的答案。如果对任何人使用,我需要的约束条件是:

add_constraint(sum_expr(x[i] * log(penalties[i]), i = 1:n) >= log(100))
因此,换句话说,我将对数转换的惩罚值(对于
x[I]=1
)与对数转换的惩罚总数相加,以模拟产品约束


我最初的问题错误地暗示了一些可能误导读者的东西。我在寻找
x[I]=1
的所有惩罚的乘积。不是值
(惩罚[i]*x[i])
的乘积,只要任何
x[i]=0
变为0。

就是go@StéphaneLaurent nloptr不支持二进制变量AFAIK@ErwinKalvelagen对不起,我确实错过了这个假设。