NLopt最小工作示例报错‘RoundoffLimited: NLopt roundoff-limited’求助
解决NLopt报错‘RoundoffLimited: NLopt roundoff-limited’的问题
这个报错本质是算法迭代过程中遇到了数值舍入精度限制,无法继续满足你设置的收敛条件,针对你的代码,有几个直接的解决办法:
放宽收敛精度阈值
你设置的ftol_rel=1e-6对LN_COBYLA这类无导数算法来说过于严格,尤其是一维二次函数这种简单场景。算法接近最优解后,浮点数的舍入误差会导致无法达到相对精度要求,触发错误。可以将阈值放宽到1e-4,或者改用绝对误差阈值set_ftol_abs(比如设置为1e-8)。增加最大迭代次数
NLopt默认的最大迭代次数可能不足以让算法在精度限制内完成收敛,通过set_maxeval()设置更大的迭代上限,给算法足够的迭代空间。捕获异常并查看近似结果
即使触发RoundoffLimited,算法往往已经得到了足够接近最优解的结果,可以通过捕获异常并调用相关方法查看当前优化状态。
修改后的代码示例:
import numpy as np import nlopt dim = 1 def obj_func(x, grad): return float( (x[0]-0.5)**2 ) opt = nlopt.opt(nlopt.LN_COBYLA, dim) opt.set_min_objective(obj_func) lb = np.zeros(dim) ub = np.ones(dim) opt.set_lower_bounds(lb) opt.set_upper_bounds(ub) # 放宽相对收敛阈值 opt.set_ftol_rel(1e-4) # 或者改用绝对误差阈值(二选一即可) # opt.set_ftol_abs(1e-8) # 增加最大迭代次数 opt.set_maxeval(1000) x0 = np.random.uniform(low=lb, high=ub) try: xopt = opt.optimize(x0) print(f"最优解: {xopt}, 目标函数值: {opt.last_optimum_value()}") except nlopt.RoundoffLimited: # 即使触发该错误,也可以获取当前接近最优的结果 print("优化因舍入限制停止,当前近似最优解:", opt.last_optimize_result()) print("当前目标函数值:", opt.last_optimum_value())
补充说明:LN_COBYLA是基于线性近似的无导数优化算法,在处理简单二次函数时会快速收敛到最优解附近,但浮点数的固有精度限制会让算法无法满足过于苛刻的相对精度要求。调整参数后,算法就能正常完成优化流程。
内容的提问来源于stack exchange,提问作者user20010813
相关产品推荐
相关产品推荐

