lpsolve包在R中

lpsolve包在R中,r,linear-programming,lpsolve,R,Linear Programming,Lpsolve,我正在使用线性规划的lpsolve软件包,但是在它的教程中读到了只解决非负变量的问题 这是我的密码: library(lpSolve) #linear programming solver c = c(30, 18, 20, 23, 24, 26) a = scan(text="66 89 82 14 35 72") b = 50 con.qual.s1=scan(text="64 98 17 55 27 80") con.qual.s2=scan(text="16 59 88 89 60 4

我正在使用线性规划的
lpsolve
软件包,但是在它的教程中读到了只解决非负变量的问题

这是我的密码:

library(lpSolve) #linear programming solver
c = c(30, 18, 20, 23, 24, 26) 
a = scan(text="66 89 82 14 35 72")
b = 50
con.qual.s1=scan(text="64 98 17 55 27 80")
con.qual.s2=scan(text="16 59 88 89 60 47")
qual.cons=c(53,82)

n=6 #activities
m=3 #resources
f.rhs = c(b,qual.cons)
f.con <- matrix (rbind(a,con.qual.s1,con.qual.s2,diag.p),nrow=m+nrow(diag.p))
f.obj.d <- c(50,53,82)
diag.d=diag(x = 1, m, m) #non-negativity
f.con.d <- matrix (rbind(t(f.con[1:m,]),diag.d),nrow=n+nrow(diag.d))
f.dir.d <- c(rep("<=",7),rep(">=",2))
f.rhs.d <- c(c,rep(0,m))
of.d=lp ("max", f.obj.d, f.con.d, f.dir.d, f.rhs.d,compute.sens=TRUE)
原始问题:(这里没有任何问题,因为所有变量都必须是非负的)

如果按照上的建议使用lpSolveAPI库,那么应用
set.bounds
/方法为变量指定负边界应该相当简单

例如,如果您有三个变量
x1
x2
x3
,具有以下边界:

x1 >= 0
x2 <= 0
-5 <= x3 <= 10

你可以重新设计你的问题,把它变成你想要的形式。例如,如果变量
x
不受约束,可以将其替换为
x1-x2
,其中
x1
x2
都是非负的。@Vincent Zoonekynd感谢我的问题是x1被约束为非正,而x2和x3被约束为非负。您知道如何排序吗?引入一个新变量,
u1
,使用
u1=-x1
x1
消失(被
-u1
替换),所有剩余变量现在都是非负变量。我几乎肯定(双关语)您应该能够使用
set.bounds
,请参见R示例并为
下限指定负值。从该方法的文档来看,显式设置负下限似乎足够了,以确保它在模型中得到考虑。为了补充我之前的评论,我现在验证了您确实可以使用
set.bounds
方法定义负下限。如果我理解正确,您应该包括
lpSolveAPI
库来访问此方法以及lpsolve R页面上描述的其他方法。如果不包含API库,我不知道如何表示边界。
library(lpSolveAPI)
lprec.p <- make.lp(0, n)
f.con <- matrix (rbind(a,con.qual.s1,con.qual.s2),nrow=m)

set.objfn(lprec.p, c)
add.constraint(lprec.p, f.con[1,], "<=", f.rhs[1])
for (i in 2:m) {
add.constraint(lprec.p, f.con[i,], ">=", f.rhs[i])
}

ColNames <- c("x1", "x2", "x3", "x4","x5","x6")
RowNames <- c("pi1", "pi2", "pi3")
dimnames(lprec.p) <- list(RowNames, ColNames)
lprec.p
solve(lprec.p)
get.objective(lprec.p)
library(lpSolveAPI)
lprec.d <- make.lp(0, m)
lp.control(lprec.d,sense="max")
f.con.d=matrix (cbind(a,con.qual.s1,con.qual.s2),ncol=m)

set.objfn(lprec.d, f.rhs)
for (i in 1:n) {
add.constraint(lprec.d, f.con.d[i,], "<=", c[i])
}
set.bounds(lprec.d, lower = c(-Inf), upper = c(0),columns = c(1))
RowNames <- c("x1", "x2", "x3", "x4","x5","x6")
ColNames <- c("pi1", "pi2", "pi3")
dimnames(lprec.d) <- list(RowNames, ColNames)
lprec.d
solve(lprec.d)
get.objective(lprec.d)
x1 >= 0
x2 <= 0
-5 <= x3 <= 10
set.bounds(lprec, lower = c(0, -Inf, -5), upper = c(Inf, 0, 10), columns = c(1, 2, 3))