LpSolve R 条件约束
LpSolve R conditional constraint
我正在尝试回答以下ILP,其中objective是最大化手术患者的类型,而最多只能手术2种不同的类型。
max 310x1 + 400x2 + 500x3 + 500x4 + 650x5 + 800x6 + 850x7
subject to
1.8x1 + 2.8x2 + 3.0x3 + 3.6x4 + 3.8x5 + 4.6x6 + 5.0x7 <= 25
250x1 + 300x2 + 500x3 + 400x4 + 550x5 + 800x6 + 750x7 >= 4000
xj <= dj
d1 + d2 + d3 + d4 + d5 + d6 + d7 <= 2
xj >= 0 and integer
在 R 包 lpSolve 中写这个我有以下代码:
# Set coefficients of the objective function
f.obj <- c(310, 400, 500, 500, 650, 800, 850, 0, 0, 0, 0, 0, 0, 0)
# Set matrix corresponding to coefficients of constraints by rows
f.con <- matrix(c(1.8, 2.8, 3, 3.6, 3.8, 4.6, 5, 0, 0, 0, 0, 0, 0, 0,
250, 300, 500, 400, 550, 800, 750, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1), nrow = 10, byrow = TRUE)
# Set unequality/equality signs
f.dir <- c("<=",
"<=",
"<=",
"<=",
"<=",
"<=",
"<=",
"<=",
"<=",
"<=")
# Set right hand side coefficients
f.rhs <- c(25, 4000, 2,0, 0, 0, 0, 0, 0,0)
# Final value (z)
lp("max", f.obj, f.con, f.dir, f.rhs, int.vec = 1:7, binary.vec = 8:14)
# Variables final values
lp("max", f.obj, f.con, f.dir, f.rhs, int.vec = 1:7, binary.vec = 8:14)$solution
但是,x 现在不会超过 1,因为 d 是二进制的。
有谁知道如何正确编写这些约束?
您有 7 种不同的患者类型,x1 到 x7,x 是整数。您最多可以 select 2 个 x 为非零。您可以通过为每个 x 添加二进制变量 b1 到 b7,并为每个 x 添加两个约束来做到这一点。
x >= -U + U*b
x <= U*b
其中 U 是最大 x 值的某个上限。
library(lpSolve)
# Set coefficients of the objective function
f.obj <- c(310, 400, 500, 500, 650, 800, 850, 0, 0, 0, 0, 0, 0, 0, 0)
U=999
# Set matrix corresponding to coefficients of constraints by rows
f.con <- matrix(c(1.8, 2.8, 3, 3.6, 3.8, 4.6, 5, 0, 0, 0, 0, 0, 0, 0, 0,
250, 300, 500, 400, 550, 800, 750, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, 0, 0, U,
1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, 0, U,
0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, U,
0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, U,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, U,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, U,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, U,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0), nrow = 17, byrow = TRUE)
# Set unequality/equality signs
f.dir <- c("<=","<=","<=",rep(c(">=","<="),7))
# Set right hand side coefficients
f.rhs <- c(25, 4000, 2, rep(0,14))
# Final value (z)
res=lp("max", f.obj, f.con, f.dir, f.rhs, int.vec = 1:7, binary.vec = 8:14)
结果
> res$objval
[1] 4260
> res$solution
[1] 11.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 1.000000 0.000000 0.000000
[11] 0.000000 0.000000 0.000000 1.000000 0.998999
所以第一个和第七个患者类型是 selected,x1 中的 11 个,x7 中的 1 个。
我们可以检查约束
> sum(c(1.8, 2.8, 3, 3.6, 3.8, 4.6, 5)*c(11,0,0,0,0,0,1))
[1] 24.8
> sum(c(250, 300, 500, 400, 550, 800, 750)*c(11,0,0,0,0,0,1))
[1] 3500
我正在尝试回答以下ILP,其中objective是最大化手术患者的类型,而最多只能手术2种不同的类型。
max 310x1 + 400x2 + 500x3 + 500x4 + 650x5 + 800x6 + 850x7
subject to
1.8x1 + 2.8x2 + 3.0x3 + 3.6x4 + 3.8x5 + 4.6x6 + 5.0x7 <= 25
250x1 + 300x2 + 500x3 + 400x4 + 550x5 + 800x6 + 750x7 >= 4000
xj <= dj
d1 + d2 + d3 + d4 + d5 + d6 + d7 <= 2
xj >= 0 and integer
在 R 包 lpSolve 中写这个我有以下代码:
# Set coefficients of the objective function
f.obj <- c(310, 400, 500, 500, 650, 800, 850, 0, 0, 0, 0, 0, 0, 0)
# Set matrix corresponding to coefficients of constraints by rows
f.con <- matrix(c(1.8, 2.8, 3, 3.6, 3.8, 4.6, 5, 0, 0, 0, 0, 0, 0, 0,
250, 300, 500, 400, 550, 800, 750, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1), nrow = 10, byrow = TRUE)
# Set unequality/equality signs
f.dir <- c("<=",
"<=",
"<=",
"<=",
"<=",
"<=",
"<=",
"<=",
"<=",
"<=")
# Set right hand side coefficients
f.rhs <- c(25, 4000, 2,0, 0, 0, 0, 0, 0,0)
# Final value (z)
lp("max", f.obj, f.con, f.dir, f.rhs, int.vec = 1:7, binary.vec = 8:14)
# Variables final values
lp("max", f.obj, f.con, f.dir, f.rhs, int.vec = 1:7, binary.vec = 8:14)$solution
但是,x 现在不会超过 1,因为 d 是二进制的。
有谁知道如何正确编写这些约束?
您有 7 种不同的患者类型,x1 到 x7,x 是整数。您最多可以 select 2 个 x 为非零。您可以通过为每个 x 添加二进制变量 b1 到 b7,并为每个 x 添加两个约束来做到这一点。
x >= -U + U*b
x <= U*b
其中 U 是最大 x 值的某个上限。
library(lpSolve)
# Set coefficients of the objective function
f.obj <- c(310, 400, 500, 500, 650, 800, 850, 0, 0, 0, 0, 0, 0, 0, 0)
U=999
# Set matrix corresponding to coefficients of constraints by rows
f.con <- matrix(c(1.8, 2.8, 3, 3.6, 3.8, 4.6, 5, 0, 0, 0, 0, 0, 0, 0, 0,
250, 300, 500, 400, 550, 800, 750, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, 0, 0, U,
1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, 0, U,
0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, U,
0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, U,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, U,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, U,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, U,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -U, 0), nrow = 17, byrow = TRUE)
# Set unequality/equality signs
f.dir <- c("<=","<=","<=",rep(c(">=","<="),7))
# Set right hand side coefficients
f.rhs <- c(25, 4000, 2, rep(0,14))
# Final value (z)
res=lp("max", f.obj, f.con, f.dir, f.rhs, int.vec = 1:7, binary.vec = 8:14)
结果
> res$objval
[1] 4260
> res$solution
[1] 11.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 1.000000 0.000000 0.000000
[11] 0.000000 0.000000 0.000000 1.000000 0.998999
所以第一个和第七个患者类型是 selected,x1 中的 11 个,x7 中的 1 个。 我们可以检查约束
> sum(c(1.8, 2.8, 3, 3.6, 3.8, 4.6, 5)*c(11,0,0,0,0,0,1))
[1] 24.8
> sum(c(250, 300, 500, 400, 550, 800, 750)*c(11,0,0,0,0,0,1))
[1] 3500