线性规划模型中如何利用R

线性规划模型中如何利用R,r,optimization,linear-programming,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台),从而导致总安装成

假设我们有一个矩阵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

阅读第6章,特别是第6.2节,以及其中的示例6.1。这将告诉您如何使用二进制变量对您的情况进行建模。然后在lpsolve中实现这种方法,它允许使用所需的二进制变量。

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

用英语 如果机器2产生任何结果,则二进制变量
setup_2
=1

如果机器2不产生任何结果,则
设置\u 2
=0

每台机器需要一个这样的二进制变量

设置约束(公式) 设BigM为大数。 设
X_mj
为机器m为客户j执行的作业数

Sum(over all jobs) X_machine_job - BigM * setup_machine <= 0
验证
>求解(lpAssign)
[1] 0
>溶胶
[1]  1  1  0 70 80 50 40  0  0
>get.objective(lpAssign)
[1] 2

出于好奇,您发布的第一行代码是什么?我不是什么R忍者,但我从来没有见过类似的东西——一个函数调用,其中有一个带空格的参数,后跟一个表达式,所有的计算结果都是布尔值?或者这是伪代码?@Paul我认为这更接近于一个数学表达式,但人们可以很容易地将其解释为伪代码。我真的不认为这是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