使用lpSolve时的简并性

时间:2013-06-24 21:15:42

标签: r lpsolve

我在R中使用lpSolve。我的模型(数据包络分析)在我的MAC上正常运行,但是当我尝试在UNIX集群上运行它时,发现很多模型都是退化的。两个系统上的lp.control选项相同。通过使用presolve和anti.degen选项,我已经能够减少(尽管不能消除)退化的数量。

请注意,当我使用预先构建的R包(Benchmarking,nonparaeff)来解决相同的线性编程模型时,会出现完全相同的问题。

有谁知道为什么UNIX群集上的简并错误?

干杯,

彼得

如果有人有兴趣,代码如下。基本上,它为三百个代理中的每一个创建了一个线性编程模型,并解决了这个问题。在我的MAC上,所有问题都解决得很好,但在集群上90%的问题都被发现是退化的:

library(lpSolveAPI)
set.seed(198302)

##############Create data
x=matrix(rnorm(1200,5,3),300,4)
y1=x%*%c(.4,.2,.7,.8)+rnorm(300,4,.5)
y2=x%*%c(.5,.8,.2,.3)+rnorm(300,4,.5)
y=cbind(y1,y2)

##############Write DEA function
xref=x
yref=y

##Define dimensions
mx<-ncol(xref)
my<-ncol(yref)
nref<-nrow(xref)
nobs<-nrow(x)

##Define empty matrices for efficiency scores, lambdas and slacks
eff<-rep(0,nobs) 
lambda<-matrix(0,nobs,nref)
slacks<-matrix(0,nobs,mx)

##Start the model, noting that there will be as many constraints as there are inputs, outputs and one additional constraint on lambda.  And as many decision variables as there are producers (lambdas) + one (efficiency score)
deamodel<-make.lp(nrow=mx+my+1,ncol=nref+1)
    ## For each input and output set the row as a constraint
    for (h in 1:mx) set.row(deamodel, h, c(0, -xref[, h]))
    for (h in 1:my) set.row(deamodel, mx + h, c(0, yref[, h]))
    ##Set a single objective function
    set.objfn(deamodel, 1, 1)
    ##Set the type of constraints.  Inputs and outputs are all greater than, lambdas is equal to
    set.constr.type(deamodel, c(rep(">=", mx + my),"="))
    ##Set another row as a constraint on lambdas
    set.row(deamodel, (mx+my+1), c(0,rep(1,nref)))
    set.rhs(deamodel, 1, mx+my+1)

##In a loop create a lp model for each producer
for (k in 1:nobs){
    ##Set the right hand side equal to output of the individual producer 
    set.rhs(deamodel, c(rep(0,mx), y[k, ]), 1:(mx + my))
    ##Set first column equal to input of producer
    set.column(deamodel, 1, c(1,x[k,]), 0:mx)
    ##Set some presolve options
    lp.control(deamodel, presolve=c("rows", "columns","rowdominate","coldominate","bounds"))
    ##Solve the model
    a=solve(deamodel)
    if (a==0){
        eff[k]<-get.objective(deamodel)
        lambda[k,]<-get.variables(deamodel)[-1]
        slacks[k,]<-get.constraints(deamodel)[1:mx]}
    if (a!=0){
        eff[k]<-NA
        lambda[k,]<-NA
        slacks[k,]<-NA
    }}

eff

1 个答案:

答案 0 :(得分:1)

看起来你正在解决300个本质上非常退化的小问题(301个变量,7个约束)。 Presolve和anti.degen只能带你到目前为止。

来自lpSolve FAQ

  

这些代码的主要问题与缩放,使用有关   明确的反转和缺乏重新转换,以及退化的处理。   即使是病态恶劣或退化的小问题也会带来   大多数这些画面代码都屈服了。

Unix群集上的lpSolve实现(标识退化解决方案)似乎与您的Mac(从R调用)正在调用的实现不同。

第一次测试:写出300 MIP(write.lp)并查看它们在您的unix群集中是否相同。 (您正在使用rnorm,即使是非常小的舍入也可能会导致一些高度退化的问题。)

如果你的目标只是摆脱简并,请尝试扰乱rhs,特别是你的目标函数。

如果你真的想了解两个系统变化的原因,我建议你自己编译lpSolve * .c文件(参见here)并从中调用该版本R以及来自Unix群集的R,以查看结果是否仍有变化。

希望能帮助你前进。