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

Drake中Snopt求解器Exit code 83:整数Workspace不足问题排查

prog = MathematicalProgram()
Z = prog.NewContinuousVariables(N, nz)
U = prog.NewContinuousVariables(N-1, 2)

prog.AddLinearConstraint(Z[0] - z0, np.zeros(nz), np.zeros(nz))

for i in range(N-1):
z_k = z0 if i==0 else Z[i]
s = Z[i+1, nq:]
x_k = z_k[:nq]
v_next = s[:nq]
u = np.concatenate([U[i], np.zeros(nq-2)])
for row in dynamics_residual(z_k, s, u, params):
prog.AddQuadraticConstraint(row, 0, 0, hessian_type=QuadraticConstraint.HessianType.kIndefinite)

prog.AddLinearConstraint(Z[i+1, :nq] - (x_k + dt*v_next), np.zeros(nq), np.zeros(nq))

for i, hand_pos in enumerate(hand_path[:-1]):
prog.AddLinearConstraint(hand_pos - Z[i, :2], np.zeros(2), np.zeros(2))

solver = SnoptSolver()

filename = "/tmp/debug.txt"
solver_options = SolverOptions()
solver_options.SetOption(CommonSolverOption.kPrintFileName, filename)

solver_options.SetOption(SnoptSolver.id(), "Total integer workspace", 1e6)
solver_options.SetOption(SnoptSolver.id(), "Total real workspace", 4e6)
solver_options.SetOption(SnoptSolver.id(), "User integer workspace", 1e6)
solver_options.SetOption(SnoptSolver.id(), "User real workspace", 4e6)
solver_options.SetOption(SnoptSolver.id(), "Major print level", 5)

result = solver.Solve(prog, solver_options=solver_options)
...

### Snopt输出信息

lu1fac error... insufficient storage

Increase lena from 166326 to at least 243971

Current    Recommended

Total integer workspace 632738 788028
Total real workspace 2850909 2928554
1

SNOPTA EXIT 80 -- insufficient storage allocated
SNOPTA INFO 83 -- not enough integer storage

### 解决方案
1. **修正参数类型**:Snopt的工作区选项要求传入整数,你用的`1e6`是浮点数,会被求解器忽略,导致设置不生效。把所有工作区数值改成整数,比如`1000000`。

2. **按推荐值配置**:根据Snopt输出的推荐值,将`Total integer workspace`设为至少`788028`,`Total real workspace`设为至少`2928554`,可以适当留余量(比如设为800000和3000000)。

3. **设置Lena参数**:输出明确提示需要将`lena`从166326增加到至少243971,直接添加该选项:
   ```python
   solver_options.SetOption(SnoptSolver.id(), "Lena", 250000)

修改后的选项设置示例:

solver_options.SetOption(SnoptSolver.id(), "Total integer workspace", 800000)
solver_options.SetOption(SnoptSolver.id(), "Total real workspace", 3000000)
solver_options.SetOption(SnoptSolver.id(), "Lena", 250000)
  1. 优化问题结构:如果调整参数后仍有问题,检查是否可以减少约束或变量数量,比如合并重复的二次约束,或者用更高效的方式表达动力学残差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:35:18