首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lpSolve时的简并性

使用lpSolve时的简并性
EN

Stack Overflow用户
提问于 2013-06-24 21:15:42
回答 1查看 752关注 0票数 3

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

请注意,当我使用预先构建的R包(标杆,非参数化)来解决相同的线性规划模型时,同样的问题也会发生。

有人知道UNIX集群上的简并错误的原因吗?

干杯,

彼得

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2013-06-25 19:22:37

看起来你正在解决300个小问题,这些问题本身就是高度退化的(301个变量,7个约束)。普瑟尔和anti.degen只能带你走这么远。

来自lpSolve常见问题

这些代码的主要问题与缩放、显式逆的使用和缺乏恢复以及退化的处理有关。即使是条件不良或退化的小问题,也会使大多数这些表码屈服。

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

First Test:写出300个MIP (write.lp),看看它们在R和unix集群中是否相同。(您正在使用rnorm,即使是非常小的舍入也可以避免这些严重退化的问题。)

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

--如果您真的想了解这两个系统为什么改变的根本原因,我建议自己编译lpSolve *.c文件(请参阅这里),并从R和Unix集群调用该版本,以查看结果是否还存在差异。

希望这能帮你继续前进。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17285261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档