如何使用R来最小化线性编程模型中的设置成本

时间:2015-06-30 17:02:15

标签: r optimization linear-programming

假设我们有一个矩阵m:

> m
   C1 C2
M1 70 80
M2 50 61
M3 45 40

机器M1-M3和客户C1-C2。这些值表示每台机器可以为特定客户生产的产品量,例如如果使用M1,它将为C1产生70个项目,为C2产生80个项目。

我想使用以下约束来最小化满足需求所需的所有机器的设置成本:

每位客户的需求> = 120;如果用于任何客户,每台机器的设置成本= 1,否则为0。

对于这个简单的例子,解决方案是使用机器M1和M2(C1为120,C2为141),总设置成本为2.唯一可行的选择是使用机器M1,M2和M3但这会导致设置成本为3,因此不是最佳的。

如何使用R解决这个问题?我使用lpSolve查看了一些示例,但我很难对建立成本进行建模,因此如果从机器生成任何内容,则它们为1,否则为0。

2 个答案:

答案 0 :(得分:2)

阅读MOSEK modeling manual http://docs.mosek.com/generic/modeling-letter.pdf的第6章,特别是第6.2节和其中的示例6.1。这告诉您如何使用二进制变量建模您的情况。然后在lpsolve中实现该方法,它允许您需要的二进制变量。

答案 1 :(得分:2)

诀窍是为每台机器的设置成本创建一个二进制变量。 (这是一个指标变量。)

英文

如果机器2产生任何东西,则二进制变量setup_2 = 1

如果Machine 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