R中pracma::linprog返回错误解的原因及修正方法咨询
pracma::linprog 返回错误解的原因及修正方法
你用pracma的linprog求解如下线性规划问题:
library(pracma) cc = c(1) A = as.matrix(-1) b = c(1) linprog(cc, A, b, maximize = FALSE)
得到的解是x=0,但正确解应该是x=-1——此时目标函数值更小,且满足约束-x ≤ 1(等价于x ≥ -1)。
错误原因
pracma::linprog默认对所有决策变量施加了非负约束(即x ≥ 0)。你的问题里,虽然理论上x可以取到-1满足约束,但函数的默认限制把x的取值范围锁死在了x ≥ 0,自然只能返回这个可行域内的最小值x=0。
修正方法
方法一:显式取消非负约束
linprog支持通过lb参数设置变量的下界,把下界设为负无穷即可解除非负限制:library(pracma) cc = c(1) A = as.matrix(-1) b = c(1) linprog(cc, A, b, maximize = FALSE, lb = -Inf)运行后会得到正确解
x = -1,目标函数值fval = -1。方法二:换用其他线性规划包
如果需要更灵活的约束设置,可以使用lpSolve或ROI这类包,它们默认不会强制变量非负(或支持更直观的约束配置)。比如用lpSolve的示例:library(lpSolve) # 目标函数系数 obj = c(1) # 将原约束 -x ≤1 转换为 x ≥-1,对应lpSolve的约束方向为">=" const.mat = matrix(1, nrow = 1) const.dir = ">=" const.rhs = c(-1) # 求解最小化问题,设置变量无下界 lp("min", obj, const.mat, const.dir, const.rhs, lower.bounds = -Inf)执行后也会返回正确的结果。
内容的提问来源于stack exchange,提问作者möbius
相关产品推荐
相关产品推荐

