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

标签 r constraints linear-programming lpsolve free-variable

我正在研究对预测进行排名的方法,并发现了这篇论文,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,-1,0)

add.to.one = c(1,1,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() 函数,因此它可以处理自由变量。

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

"Error: no feasible solution found".

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

我是否正确应用了第四个约束(“add.to.one”)?另外,lp() 已经假设每个变量 >= 为零,但它还假设其他什么吗?

我是否正确地将公式翻译成 R?我是否正确使用了 lp2 函数?

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

提前致谢。

最佳答案

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

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

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,-1,0)

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

f.obj = c(0,0,0,0,0,1,-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。

关于r - 如何使用一个自由变量解决这一约束线性规划 (LP) 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68353641/

相关文章:

Python 服务器 "Aborted (Core dumped)"

将变量传递到函数中的 ggplot 中的正确方法,不要将其解释为 R 中的字符串

ios - 如何执行激活编程约束

c++ - 嵌入模板时模板化函数类型丢失

scipy.optimize.linprog 似乎解决了任务但没有返回 x?

linear-programming - 最大化给定场景的效益

r - 错误 `$<-.data.frame` (x, name, value) : replacement has 1 row, data has 0

r - 巨大表的 dist(as.matrix)

r - 如何更改 R 中网络图上的标签?

objective-c - 以编程方式创建布局约束