SnoptSolver设置的时间与迭代次数限制不生效,配置方式是否正确问询
问题原因与修正方案
你的参数设置方式确实存在错误,核心问题是参数名不匹配,导致配置的限制规则没有被Snopt识别生效,具体说明如下:
- 参数名匹配错误:你使用的
"Time limit"不是Snopt认可的标准参数键。Snopt原生控制求解CPU时间上限的参数为"Major seconds limit",你传入的自定义键会被求解器直接忽略,因此时间限制完全未生效。 - 迭代限制的生效边界:你配置的主/次迭代次数限制仅作用于求解迭代环节,Snopt的预处理阶段(包括初始点可行性校验、稀疏矩阵重排序、约束雅可比/海森矩阵预分解等)的耗时不受迭代次数限制。如果你的问题规模较大,仅预处理环节就可能占用数秒到数十秒时间,也会导致总耗时超出预期。
修正后的配置代码
solver = SnoptSolver() options = SolverOptions() # 采用Snopt原生标准参数名设置限制 options.SetOption(solver.id(), "Major seconds limit", 2.0) options.SetOption(solver.id(), "Major iterations limit", 200) options.SetOption(solver.id(), "Minor iterations limit", 100) result = solver.Solve(prog, None, options)
配置生效验证方法
求解完成后可以通过返回的求解器详情确认参数是否正常生效:
snopt_details = result.get_solver_details() print(f"实际完成主迭代次数:{snopt_details.major_iter}") print(f"求解器统计总耗时:{snopt_details.solve_time}") print(f"求解终止状态码:{snopt_details.info}")
如果终止状态码返回30,说明求解器是命中时间限制正常停止,配置已生效。
内容的提问来源于stack exchange,提问作者EpsilonGreedy
相关产品推荐
相关产品推荐

