2017-07-28 26 views
0

我正在使用LPSolve与R和我的输入数据是在多个CSV文件的形式,每个文件都有一个表。的表2中提及以下:LPSolve与R - 多个数据集作为输入

Production Data

Route Data

说明有关约束的 -

  • 有从每个生产家发起
  • 总流出从生产工艺路线房子=源自它的路线的总和(路线容积)
  • 制作公司合计流出< =生产能力
  • 路线卷本身就是一个决策变量取决于在这个岗位未提到的其他变量

约束的数学表达式如下:

`Production Total Outflow = ∑(Route Volume) where (Production House ID from table_1)==(Originating from Prod House ID from table_2)` 

Production Total Outflow <= Production Capacity

在现实中,我有成千上万的行。我试图为上述2个约束写下面的代码。将会有2个约束:

#Reading Data from files 
routeData = read.csv("Route.csv", header = TRUE) 
ProductionData = read.csv("Production.csv", header = TRUE) 

#Fetching variable columns 
routeID = routeData$RouteID 
productionID = ProductionData$ProductionID 
productionCapacity = ProductionData$Supply.Capacity 

numberOfColumns = length(routeID) + length(productionID) #4+2 decision variables 
model <- make.lp(nrow=0, ncol=numberOfColumns, verbose="important") 

for(i in 1:length(productionID)){ 
    add.constraint(model, 1, "<=", productionCapacity[i]) #Something wrong here 
} 
#I haven't attempted to write the other constraint 

我无法继续编写约束条件。请帮助家伙。我还没有分享这个目标,因为它也有很多其他限制。

+0

它通常有助于首先写下数学模型。之后,您可以将其转换为代码。 –

+0

我已编辑帖子并添加了数学表示。另外,我在Gurobi中成功编写了代码,但在LPSolve中,我感到困惑,因为我们必须编写代码将值直接放入矩阵中。请帮助。 –

回答

0

这里是试图在生产用房均匀分布路线容积

library(lpSolveAPI) 

prodcap <- setNames(c(50,100), c(1,2)) 
route <- data.frame(rid=1:4, pid_from=rep(1:2, each=2)) 
route_volume <- 125 # example 

nvars <- nrow(route)+1 # example: evenly distribute production house output relative to capacity 
lprec <- make.lp(0, nvars) 

set.objfn(lprec, obj=1, indices=nvars) 

# capacity constraints 
for (i in seq(1, length(prodcap))) { 
    route_ids <- which(route[,"pid_from"]==i) 
    add.constraint(lprec, xt=rep(1, length(route_ids)), type="<=", rhs=prodcap[i], indices=route_ids) 
} 

# total outflow constraint 
add.constraint(lprec, xt=rep(1, nrow(route)), type="=", rhs=route_volume, indices=seq(1, nvars-1)) 

# example: define the last decision variable as maximum flow over each production house 
for (i in seq(1, length(prodcap))) { 
    route_ids <- which(route[,"pid_from"]==i) 
    add.constraint(lprec, xt=c(rep(1/prodcap[i], length(route_ids)), -1), type="<=", rhs=0, indices=c(route_ids, nvars)) 
} 

# solve 
status <- solve(lprec) 
if(status!=0) stop("no solution found, error code=", status) 
get.variables(lprec)[seq(1, nrow(route))] 
#[1] 41.66667 0.00000 83.33333 0.00000 

请注意,如果你有成千上万的路线/生产用房它可能是更有效的预分配的约束一例make.lp并使用set.row而不是add.constraint。下面是一个示例,并将route_volume作为附加决策变量,如评论中所要求的那样:

library(lpSolveAPI) 

prodcap <- setNames(c(50,100), c(1,2)) 
route <- data.frame(rid=1:4, pid_from=rep(1:2, each=2)) 
route_volume <- 125 # example 

# the first nrow(route) vars are the outflows, 
# then 1 variable for maximum flow (relative to capacity) over all production house 
# then 1 last variable for the route volume 
nvars <- nrow(route)+2 
ncons <- 2*length(prodcap)+3 

# pre-allocate the constraints 
lprec <- make.lp(ncons, nvars) 

# set objective: minimize maximum flow relative to capacity (example) 
set.objfn(lprec, obj=1, indices=nvars-1) 

# capacity constraints 
rownum <- 1 
for (i in seq(1, length(prodcap))) { 
    route_ids <- which(route[,"pid_from"]==i) 
    set.row(lprec, row=rownum, xt=rep(1, length(route_ids)), indices=route_ids) 
    set.rhs(lprec, prodcap[i], constraints=rownum) 
    rownum <- rownum + 1 
} 

# total outflow constraint ("=" resolves to two constraints) 
set.row(lprec, row=rownum, xt=c(rep(1, nrow(route)), -1), indices=c(seq(1, nvars-2), nvars)) 
set.rhs(lprec, 0, constraints=rownum) 
rownum <- rownum + 1 
set.row(lprec, row=rownum, xt=c(rep(-1, nrow(route)), 1), indices=c(seq(1, nvars-2), nvars)) 
set.rhs(lprec, 0, constraints=rownum) 
rownum <- rownum + 1 

# additional constraint for route volume 
set.row(lprec, row=rownum, xt=-1, indices=nvars) 
set.rhs(lprec, -125, constraints=rownum) #example: route_volume >= 125 
rownum <- rownum + 1 

# example: define the second last decision variable as maximum flow (relative to capacity) over all production houses 
# rhs is 0, which is preset 
for (i in seq(1, length(prodcap))) { 
    route_ids <- which(route[,"pid_from"]==i) 
    set.row(lprec, row=rownum, xt=c(rep(1/prodcap[i], length(route_ids)), -1), indices=c(route_ids, nvars-1)) 
    set.rhs(lprec, 0, constraints=rownum) 
    rownum <- rownum + 1 
} 

# solve 
status <- solve(lprec) 
if(status!=0) stop("no solution found, error code=", status) 
get.variables(lprec)[seq(1, nrow(route))] 
+0

谢谢。有效。但是,如果我们将route_volume作为决策变量,而不是您对route_volume < - 125的假设,那么需要在代码中更改哪些内容? –

+0

你对route_volume有什么约束,以便求解器不会建议零route_volume? –

+0

为此添加了代码示例,h代表 –