LpSolve R 条件约束

问题描述

我正在尝试回答以下 ILP,其中目标是最大化手术患者的类型,而最多只能手术 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,650,800,850,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,250,300,550,750,1,-1,-1),nrow = 10,byrow = TRUE)

# Set unequality/equality signs
f.dir <- c("<=","<=","<=")

# Set right hand side coefficients
f.rhs <- c(25,4000,2,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",binary.vec = 8:14)$solution

然而,x 现在不会超过 1,因为 d 是二进制的。

有谁知道我如何正确编写这些约束?

解决方法

您有 7 种不同的患者类型,x1 到 x7,x 是整数。您最多可以选择 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,650,800,850,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,250,300,550,750,1,-U,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

因此选择了第一个和第七个患者类型,x1 中的 11 个,x7 中的 1 个。 我们可以检查约束

> sum(c(1.8,5)*c(11,1))
[1] 24.8
> sum(c(250,750)*c(11,1))
[1] 3500