我如何用一个自由变量解决这个约束线性规划 (LP) 问题?

问题描述

我正在研究对预测进行排名的方法,并找到了这篇论文 A novel ranking procedure for forecasting approaches using Data Envelopment Analysis,我一直在研究这篇文章并设置我的数据,但我似乎无法在 R 中复制他们的 LP 公式?

这是我所指的公式:LP Formulation

这是一个示例,我正在尝试使用上述公式作为参考复制他们的结果。数据基于上述文章中的“表 2. 示例数据的对数值”。

library(lpSolve)
library(nonparaeff)

DMU = c("FOR01","FOR02","FOR03","FOR04","FOR05")

log.data = matrix(data = as.numeric(c("1.794","1.575","3.576","2.228","2.106","6.628","2.399","1.871","6.354","2.619","1.983","5.849","2.559","1.541","5.676")),ncol = 3,byrow = TRUE)

colnames(log.data) = c("M1","M2","M3")
rownames(log.data) = DMU

THETA = c(-1,-1,0)

add.to.one = c(1,1,1) # Constraint so each lambda adds up to one.

f.obj = c(1)

f.con = cbind(THETA,rbind(t(log.data),add.to.one))

f.dir = c("<=","<=","=")

f.rhs = c(1.794,1.575,3.576,1)

lp2(direction = "min",f.obj,f.con,f.dir,f.rhs,free.var =  c(1))

我正在使用包 lpsolve 和 nonparaeff; nonparaeff 扩展了 lp() 函数,因此它可以处理自由变量。

使用此代码我最终收到错误

错误:找不到可行的解决方案”。

然而,在文章中,他们最终将 theta 设为 0 或 1,第一个 lambda 返回为 1。所以我一定是做错了什么。

我是否正确应用了第四个约束('add.to.one')?此外,lp() 已经假定每个变量 >= 为零,但它是否假定其他任何变量?

我是否正确地将公式转换为 R?我是否正确使用了 lp2 函数

在这里查看了其他类似的 lp 问题,但我没有看到很多关于自由变量的问题。但如果您不这么认为,请将我链接到其他问题。

提前致谢。

解决方法

lpSolve 使用起来有点麻烦。但是,使用称为变量拆分的技术来实现自由变量应该不会太困难。 IE。用 xplus-xmin 用 xplus,xmin>=0 替换自由变量 x。不是两者都可以是非零的(那么基矩阵将是奇异的)。

我认为这是正确的更新代码:

library(lpSolve)

DMU = c("FOR01","FOR02","FOR03","FOR04","FOR05")

log.data = matrix(data = as.numeric(c("1.794","1.575","3.576","2.228","2.106","6.628","2.399","1.871","6.354","2.619","1.983","5.849","2.559","1.541","5.676")),ncol = 3,byrow = TRUE)

colnames(log.data) = c("M1","M2","M3")
rownames(log.data) = DMU

theta = c(-1,-1,0)

add.to.one = c(1,1,1) # Constraint so each lambda adds up to one.

f.obj = c(0,-1)

f.con = cbind(rbind(t(log.data),add.to.one),theta,-theta)

f.dir = c("<=","<=","=")

f.rhs = c(1.794,1.575,3.576,1)

r <- lp(direction = "min",f.obj,f.con,f.dir,f.rhs)

最好使用功能更强大的工具,例如 CVXR。