诀窍是为每台机器的设置成本创建一个二进制变量。 (它是一个指示变量。)
英文
如果机器 2 产生任何东西,那么二进制变量 setup_2 = 1
如果机器 2 不产生任何结果,则 setup_2 = 0
每台机器都需要一个这样的二进制变量。
设置约束(公式)
设 BigM 是一个大数。
设X_mj 为机器 m 为客户 j 执行的作业数。
Sum(over all jobs) X_machine_job - BigM * setup_machine <= 0
如果任何 X_mj 变量不为零,则强制 setup_machine 变量变为 1,这正是我们想要的。
这是唯一的技巧。其余的配方是常规的。
这是您使用lpSolveAPI.的完整示例
R 代码
(代码未优化。写得更容易理解。)
library(lpSolveAPI)
lpAssign <- make.lp(ncol=9) #3 columns for SETUP variable (Binary) + 6 columns: 3 machines * 2 customers
#The first 3 columns are the setup variables (binary)
set.type(lpAssign, c(1,2,3), "binary")
add.constraint(lpAssign, c(1,1,1), type=">=", rhs=120, indices=c(4,6,8)) #meet demand for customer 1
add.constraint(lpAssign, c(1,1,1), type=">=", rhs=120, indices=c(5,7,9))
#capacity constraints (6 of them)
add.constraint(lpAssign, 1, type="<=", rhs=70, indices=c(4))
add.constraint(lpAssign, 1, type="<=", rhs=80, indices=c(5))
add.constraint(lpAssign, 1, type="<=", rhs=50, indices=c(6))
add.constraint(lpAssign, 1, type="<=", rhs=61, indices=c(7))
add.constraint(lpAssign, 1, type="<=", rhs=45, indices=c(8))
add.constraint(lpAssign, 1, type="<=", rhs=40, indices=c(9))
#setup cost variable constraint for each machine
BigM <- 1e6
add.constraint(lpAssign, c(-1*BigM,1,1), type="<=", rhs=0, indices=c(1,4,5))
add.constraint(lpAssign, c(-1*BigM,1,1), type="<=", rhs=0, indices=c(2,6,7))
add.constraint(lpAssign, c(-1*BigM,1,1), type="<=", rhs=0, indices=c(3,8,9))
set.objfn(lpAssign, c(1,1,1,0,0,0,0,0,0)) #All we care about is SET UP cost minimization
write.lp(lpAssign, "MinSetupLp.lp", "lp")#write it out
验证
> solve(lpAssign)
[1] 0
> sol <- get.variables(lpAssign)
> sol
[1] 1 1 0 70 80 50 40 0 0
> get.objective(lpAssign)
[1] 2