我的代码看起来像这样。
nlopt::opt opt(nlopt::LD_SLSQP, dimension);
opt.set_min_objective(objective, NULL);
opt.add_inequality_mconstraint(constraint1, NULL, tolerance1);
opt.add_equality_mconstraint(constraint2, NULL, tolerance2);
opt.add_equality_mconstraint(constraint3, NULL, tolerance3);
opt.set_xtol_rel(1e-6);
opt.set_ftol_rel(1e-6);
opt.set_lower_bounds(lb);
opt.set_upper_bounds(ub);
opt.set_maxeval(MAX_EVAL);
initial_guess(result_vector);
opt.optimize(result_vector, min_cost);
使用1个约束进行优化会返回良好的结果。
但是当我一起使用它们时,优化器无法正常工作。 (不满足每个约束)
知道为什么会这样吗???
答案 0 :(得分:0)
从文档(NLopt Introduction):
原则上,每个等式约束都可以用两个不等式约束来表示......所以你可能会认为任何可以处理不等式约束的代码都可以自动处理等式约束。在实践中,这不是真的 - 如果你试图将一个等式约束表示为一对非线性不等式约束,一些算法将无法收敛。
我最好的猜测是,不等式约束的组合会阻止优化器收敛。如果您的约束确实产生了等式约束,那么引言建议使用它来根据一个(或多个)其他参数求解一个参数。
编辑:我也注意到你的ftol和xtol值是一样的;引言也建议不要这样,因为从最接近的泰勒级数展开,客观尺度中的误差作为x中误差的平方。