提问人:KrutonCrab 提问时间:7/13/2021 最后编辑:user438383KrutonCrab 更新时间:7/15/2021 访问量:177
如何用一个自由变量解决这个约束线性规划 (LP) 问题?
How do I solve this constrained linear programing (LP) problem with one free variable?
问:
我正在研究对预测进行排名的方法,并发现了这篇论文,一种使用数据包络分析预测方法的新颖排名程序,我一直在阅读这篇文章并设置我的数据,但我似乎无法在 R 中复制他们的 LP 公式?
这就是我所指的配方:LP配方
这是我正在尝试以上述公式作为参考来复制他们的结果的一个例子。数据基于“表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()
使用此代码,我最终得到错误:
“错误:没有找到可行的解决方案”。
然而,在文章中,它们最终将 theta 作为 0 或 1,而第一个 lambda 返回为 1。所以我一定做错了什么。
我是否正确应用了第四个约束('add.to.one')?此外,已经假设每个变量都>=为零,但它是否假设了其他任何内容?lp()
我是否正确地将公式翻译成 R?我是否正确使用该功能?lp2
我在这里浏览了其他类似的 lp 问题,但我没有看到很多关于自由变量的问题。但是,如果您不这么认为,请将我链接到其他问题。
提前致谢。
答:
2赞
Erwin Kalvelagen
7/13/2021
#1
lpSolve 使用起来有点痛苦。但是,使用称为变量拆分的技术实现自由变量应该不会太困难。即用 xplus,xmin>=0 替换 xplus-xmin 的自由变量 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,-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。
评论
0赞
KrutonCrab
7/13/2021
非常感谢!这非常有效,我什至继续用其他预测对其进行了测试,结果完全匹配。我会记下 CVXR,并在将来尝试使用它。谢谢!
评论