You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:48:22