下面是一个示例,它试图在生产车间上均匀分布路线体积
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
nvars <- nrow(route)+1
lprec <- make.lp(0, nvars)
set.objfn(lprec, obj=1, indices=nvars)
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)
}
add.constraint(lprec, xt=rep(1, nrow(route)), type="=", rhs=route_volume, indices=seq(1, nvars-1))
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))
}
status <- solve(lprec)
if(status!=0) stop("no solution found, error code=", status)
get.variables(lprec)[seq(1, nrow(route))]
请注意,如果您有数千条路线/生产房屋,那么在中预分配约束可能更有效
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
nvars <- nrow(route)+2
ncons <- 2*length(prodcap)+3
lprec <- make.lp(ncons, nvars)
set.objfn(lprec, obj=1, indices=nvars-1)
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
}
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
set.row(lprec, row=rownum, xt=-1, indices=nvars)
set.rhs(lprec, -125, constraints=rownum)
rownum <- rownum + 1
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
}
status <- solve(lprec)
if(status!=0) stop("no solution found, error code=", status)
get.variables(lprec)[seq(1, nrow(route))]