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

使用boot库simplex函数仅设>=约束时出现NA下标赋值错误

关于boot::simplex仅使用>=约束触发NA错误的分析

你遇到的这个问题其实不是你的用法错误,而是boot包中simplex函数的一个设计疏漏(或者说小bug)。

问题根源

boot::simplex实现的单纯形法,在底层逻辑中默认要求问题必须包含下界约束(即<=类型的约束,对应参数A1/b1),否则在初始化基变量、构建初始可行解的环节会出现索引越界,进而触发NAs are not allowed in subscripted assignments的错误。

这个限制在函数的官方文档里并没有明确说明,属于实现细节上的疏漏——其他专门的线性规划包(比如lpSolve、linprog)都可以正常处理仅包含>=约束的问题。

你的示例验证

失败的代码(仅>=约束)

library(boot)
a = c(1, 1, 1)
A2 = rbind(c(2, 7.5, 3), c(20, 5, 10))
b2 = c(10000, 30000)
simplex(a=a, A2=A2, b2=b2, maxi=FALSE)

触发报错:'Simplex error: NAs are not allowed in subscripted assignments'

修复后的代码(添加宽松<=约束)

library(boot)
a = c(1, 1, 1)
A2 = rbind(c(2, 7.5, 3), c(20, 5, 10))
b2 = c(10000, 30000)
simplex(a=a, A1=c(1,1,1),b1 = 1.0E+12,A2=A2, b2=b2, maxi=FALSE)

正常运行,因为添加的宽松<=约束(给变量设置了极大的上界)不会改变原问题的可行域,却满足了函数的底层要求。

更好的解决方案

如果不想依赖这种"假约束"的临时 workaround,建议直接使用专门的线性规划包,比如lpSolve:

library(lpSolve)
obj = c(1,1,1)
const.mat = rbind(c(2,7.5,3), c(20,5,10))
const.dir = c(">=", ">=")
const.rhs = c(10000, 30000)
# 求解最小化问题
result = lp("min", obj, const.mat, const.dir, const.rhs)
# 查看最优解
result$solution

内容的提问来源于stack exchange,提问作者LocoGris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:29:22