是否可以将乘积表达式用作Ompr优化中的约束?

时间:2018-07-18 23:56:50

标签: r optimization linear-programming glpk

我知道sum_expr包中的ompr函数是一种创建具有动态总和的约束的方法。但是,我想知道是否有一种方法可以创建使用乘积而不是总和的约束。还是在 linear 优化中这是不可能的?

例如:

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

有没有办法add_constraint(sum_expr())来代替add_constraint(product_expr())

如果不能通过线性优化来实现,我应该去哪里找呢?

2 个答案:

答案 0 :(得分:1)

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

假设我们要建模

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}

其中card(i)是i的数量。通常情况可以进一步简化,但这取决于模型的细节。

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

答案 1 :(得分:0)

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

add_constraint(sum_expr(x[i] * log(penalties[i]), i = 1:n) >= log(100))

因此,换句话说,我将对数变换后的惩罚值(针对x[i] = 1)与对数变换后的惩罚总数进行求和,以模拟乘积约束。

我最初的问题错误地暗示了可能误导读者的东西。我一直在寻找x[i] = 1的所有罚款的结果。不是值(penalties[i] * x[i])的乘积,而值x[i] = 0会立即变为0。