使用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
相关产品推荐
相关产品推荐

