【问题标题】:Mixed Integer Programming in R - Indicator functionsR 中的混合整数规划 - 指标函数
【发布时间】:2017-03-16 15:09:30
【问题描述】:

我希望这封邮件能帮助您。

我正在尝试使用 lpSolveAPI R 包解决以混合整数程序形式表示的优化问题。但是,在目标函数和一些约束中都有指示函数。更具体地说,考虑以下优化问题:

min{        2.8 * x1 +        3.2 * x2 +        3.5 * x3 + 
     17.5 * delta(x1) + 2.3 * delta(x2) + 5.5 * delta(x3)  }

受制于:

  0.4 * x1 + 8.7 * x2 + 4.5 * x3 <=
          387 - 3 * delta(x1) - 1 * delta(x2) - 3 * delta(x3)

  x1 <= 93 * delta(x1)

  x2 <= 94 * delta(x2), 

  x3 <= 100 * delta(x3), and 

  x1, x2, and x3 are non-negative integers.

在这个问题中,对于 {1, 2, 3} 中的所有 i,如果 xi > 0,delta(xi) = 1,否则 delta(xi) = 0。

我目前的 R 代码是:

install.packages("lpSolveAPI")
library(lpSolveAPI)
a <- c(3, 1, 3)
b <- c(0.4, 8.7, 4.5)
q <- 387
M <- c(93, 94, 100)
A <- c(17.5, 2.3, 5.5)
h <- c(2.8, 3.2, 3.5)

Fn <- function(u1, u2, u3, u4){
lprec <- make.lp(0, 3)
lp.control(lprec, "min")
set.objfn(lprec, u1)
add.constraint(lprec, u2, "<=", u3)
set.bounds(lprec, lower = rep(0, 3), upper = u4)
set.type(lprec, columns = 1:3, type = "integer")
solve(lprec)
return(list(Soln = get.variables(lprec), MinObj = get.objective(lprec)))
}

TheTest <- Fn(u1 = h, u2 = b, u3 = q, u4 = M)

拜托,我想知道是否有人可以告诉我如何将 delta 函数放入此 R 代码中以解决上述优化问题。

罗德里戈。

【问题讨论】:

  • 这是狄拉克“三角函数”?
  • 或者它的整体。
  • 它是一个指示函数 I(.),定义为:如果 x 在 A 中,则 I(x) = 1,否则 I(x) = 0,其中 A = (0, +infinity)。
  • Dirac delta 函数(又名 Heaviside 函数)支持 (-Inf, Inf) 但在其他方面具有相同的定义。在 R 中编写这样的结构通常很容易。这看起来不像 R 代码。它缺少任务。看起来更像是一个伪代码规范。
  • 查看问题后(为了重新格式化为 SO 标准),我对 x1、x2、x3 是非负整数的联合要求以及您使用具有0 处的值为 1。

标签: r optimization mathematical-optimization linear-programming


【解决方案1】:

x1 &lt;= 93 * delta(x1) 这样的约束对我来说看起来很奇怪。我认为这只是x1 &lt;= 93。对于 MIP 求解器,将函数 delta(x) 替换为二进制变量 d。然后添加约束d &lt;= x &lt;= M*d,其中Mx 的上限。明确地说,对于您的模型,我们有:

min 2.8*x1 + 3.2*x2 + 3.5*x3 + 17.5*d1 + 2.3*d2 + 5.5*d3
0.4*x1 + 8.7*x2 + 4.5*x3 <= 387 - 3*d1 - d2 - 3*d3
d1 <= x1 <= 93*d1
d2 <= x2 <= 94*d2
d3 <= x3 <= 100*d3
x1 integer in [0,93]
x2 integer in [0,94]
x3 integer in [0,100]
d1,d2,d3 binary

现在使用任何 MIP 求解器都可以轻松解决此问题。请注意,像 d1 &lt;= x1 &lt;= 93*d1 这样的双重不等式可以写成两个不等式:d1&lt;=x1x1&lt;=93*d1

【讨论】:

  • 感谢卡尔维拉根先生的建议。但是,我意识到您的建议包括 di = 0 且 xi > 0 且 i 在 {1, 2, 3} 中的情况。
  • 不:你错了
  • 例如,约束 d1 0 时。
  • 我们还有x1 &lt;= 93 d1,这意味着如果d1=0x1 将被强制为零。请仔细阅读我的回答。
  • 知道了。非常感谢,Kalvelagen 先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
相关资源
最近更新 更多