是否可以在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对不起,我确实错过了这个假设。