我希望这条消息能找到你。
我正在尝试使用lpSolveAPI R-package解决配置为混合整数程序的优化问题。但是,目标函数和某些约束中存在指标函数。更具体地说,请考虑以下优化问题:
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> 1,则delta(xi)= 1。 0,否则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代码中以解决上述优化问题。
罗德里戈。
答案 0 :(得分:1)
像x1 <= 93 * delta(x1)
这样的约束对我来说很奇怪。我认为这只是x1 <= 93
。对于MIP求解器,将函数delta(x)
替换为二进制变量d
。然后添加约束d <= x <= M*d
,其中M
是x
的上限。明确地说,对于您的模型,我们有:
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 <= x1 <= 93*d1
这样的双重不等式可以写成两个不等式:d1<=x1
和x1<=93*d1
。