0

我的代码看起来像这样。

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 个约束进行优化会返回良好的结果。

但是当我将它们一起使用时,优化器无法正常工作。(不满足每个约束)

知道为什么会这样吗???

4

1 回答 1

0

从文档(NLopt 介绍):

原则上,每个等式约束都可以用两个不等式约束来表示……,所以你可能认为任何可以处理不等式约束的代码都可以自动处理等式约束。在实践中,这是不正确的——如果你试图将一个等式约束表达为一对非线性不等式约束,一些算法将无法收敛。

我最好的猜测是,不等式约束的组合会阻止优化器收敛。如果您的约束确实产生了等式约束,则介绍建议使用它来根据一个(或多个)其他参数来求解一个参数。

编辑:我还注意到您的 ftol 和 xtol 值是相同的;引言还建议不要这样做,因为从接近最优值的泰勒级数展开来看,目标误差与 x 误差的平方成比例。

于 2015-08-25T21:46:39.650 回答